Message ID | 20230320180745.807656081@redhat.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp1378283wrt; Mon, 20 Mar 2023 11:51:17 -0700 (PDT) X-Google-Smtp-Source: AK7set+mfMjMMrBeCrBTrAhs3c7LFEro92LSlbKYZ0BgfJvOglryfnZavg7T1eoS6gqetJgEwZ9w X-Received: by 2002:a05:6a20:9f98:b0:d3:45f8:256 with SMTP id mm24-20020a056a209f9800b000d345f80256mr19133088pzb.60.1679338277448; Mon, 20 Mar 2023 11:51:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679338277; cv=none; d=google.com; s=arc-20160816; b=knHVxKvKR0CjrVcF0igVCTH3IULr3XM/956sOIAS46mc2nQ+Vyl0/YrR2cTffTVn2l Lijk2yTQcNIQrgupltPzWNeS1ODBLft8dCEFoZeY6Hr7C0hwj7bwYYK9iSrgrkw00ULD HPlAkocIvRv7tSzTrSdhbJpS9xSATQj2ro5GcBcW+JQwdNF+llQx6yiswUfiIzmANILK stNM1EDgRBf8pWn3Gj7hLBIkNigbR0V5ZHOJGwwDbOYHHz7quA8FpYlwQFX+sYO6SNI0 wlelVn9GR2M6R3dgUQKPepTDLMAvH/Iw13FrDmT1i1v8vE2TQU1KVArX8riJZzgB706I zcTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=BeFRTjFm0L142WsTkcDAje75c4PixN4nDF8ylAdfn+w=; b=PDluGraG5IJmBKaJ5ZrCMRAbpKRMzDRz1RbBf39TqbPfXE9k1Ub7NlvIla84uv9QXr ipOYUcc8+IiZT6Mh5L94v7wtJpCvGHw1k+ebbmWcaf8iHOm6p5WvRhnXvw+1GPov+4f5 Vg2iaiPjMGM93yiTtKEvCmluSzjEHTYUB0SuRgPtndxzenwmZJU1Q9uQA1dNcvZrnmgu 22zG9sjAEmzkQFx/pmxBflYbkmDYnv0lpLwsAoCx1pMBiVtLpUSzBpEVt5tWPPvydKOx +MEop6NmmG3uWDM4wgFR+pvZdntdzB8/3mJWN4jgY6t2HpirvI/RkfqgeUXu2EUy8y6I ljvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Pa+UhmMA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o33-20020a635d61000000b004770fe95989si10995817pgm.496.2023.03.20.11.51.03; Mon, 20 Mar 2023 11:51:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Pa+UhmMA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231248AbjCTSU6 (ORCPT <rfc822;pusanteemu@gmail.com> + 99 others); Mon, 20 Mar 2023 14:20:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55984 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231382AbjCTSUE (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 20 Mar 2023 14:20:04 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4AD4F15553 for <linux-kernel@vger.kernel.org>; Mon, 20 Mar 2023 11:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1679335928; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=BeFRTjFm0L142WsTkcDAje75c4PixN4nDF8ylAdfn+w=; b=Pa+UhmMAdXylJmzuFbtnBNzyTuKnpW/PIk11/TVP19BsxYcm5PMaKNuC6Eq84WIaRUXJK3 jQK4P7nkLNIPRzSR4WShdHAL/JfdDk5TlOM1Ipe2LaPLGttRjawZ91ktZzCmcFycDM7v+G UZoehY8mfN1I34ECH05m3fB/K8nm1AM= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-446-UAD0kCRHMwmtXQvAe-NHhA-1; Mon, 20 Mar 2023 14:12:04 -0400 X-MC-Unique: UAD0kCRHMwmtXQvAe-NHhA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 72F5185C06E; Mon, 20 Mar 2023 18:12:03 +0000 (UTC) Received: from tpad.localdomain (ovpn-112-2.gru2.redhat.com [10.97.112.2]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 20B4A140EBF4; Mon, 20 Mar 2023 18:12:03 +0000 (UTC) Received: by tpad.localdomain (Postfix, from userid 1000) id 092FE403BCD87; Mon, 20 Mar 2023 15:08:03 -0300 (-03) Message-ID: <20230320180745.807656081@redhat.com> User-Agent: quilt/0.67 Date: Mon, 20 Mar 2023 15:03:43 -0300 From: Marcelo Tosatti <mtosatti@redhat.com> To: Christoph Lameter <cl@linux.com> Cc: Aaron Tomlin <atomlin@atomlin.com>, Frederic Weisbecker <frederic@kernel.org>, Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Russell King <linux@armlinux.org.uk>, Huacai Chen <chenhuacai@kernel.org>, Heiko Carstens <hca@linux.ibm.com>, x86@kernel.org, Vlastimil Babka <vbabka@suse.cz>, Michal Hocko <mhocko@suse.com>, Marcelo Tosatti <mtosatti@redhat.com> Subject: [PATCH v7 11/13] mm/vmstat: switch vmstat shepherd to flush per-CPU counters remotely References: <20230320180332.102837832@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760913813550140092?= X-GMAIL-MSGID: =?utf-8?q?1760913813550140092?= |
Series |
fold per-CPU vmstats remotely
|
|
Commit Message
Marcelo Tosatti
March 20, 2023, 6:03 p.m. UTC
With a task that busy loops on a given CPU,
the kworker interruption to execute vmstat_update
is undesired and may exceed latency thresholds
for certain applications.
Performance details for the kworker interruption:
oslat 1094.456862: sys_mlock(start: 7f7ed0000b60, len: 1000)
oslat 1094.456971: workqueue_queue_work: ... function=vmstat_update ...
oslat 1094.456974: sched_switch: prev_comm=oslat ... ==> next_comm=kworker/5:1 ...
kworker 1094.456978: sched_switch: prev_comm=kworker/5:1 ==> next_comm=oslat ...
The example above shows an additional 7us for the
oslat -> kworker -> oslat
switches. In the case of a virtualized CPU, and the vmstat_update
interruption in the host (of a qemu-kvm vcpu), the latency penalty
observed in the guest is higher than 50us, violating the acceptable
latency threshold for certain applications.
To fix this, now that the counters are modified via cmpxchg
both CPU locally (via the account functions), and remotely (via
cpu_vm_stats_fold), its possible to switch vmstat_shepherd to perform
the per-CPU vmstats folding remotely.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
---
Index: linux-vmstat-remote/mm/vmstat.c =================================================================== --- linux-vmstat-remote.orig/mm/vmstat.c +++ linux-vmstat-remote/mm/vmstat.c @@ -2043,6 +2043,23 @@ static void vmstat_shepherd(struct work_ static DECLARE_DEFERRABLE_WORK(shepherd, vmstat_shepherd); +#ifdef CONFIG_HAVE_CMPXCHG_LOCAL +/* Flush counters remotely if CPU uses cmpxchg to update its per-CPU counters */ +static void vmstat_shepherd(struct work_struct *w) +{ + int cpu; + + cpus_read_lock(); + for_each_online_cpu(cpu) { + cpu_vm_stats_fold(cpu); + cond_resched(); + } + cpus_read_unlock(); + + schedule_delayed_work(&shepherd, + round_jiffies_relative(sysctl_stat_interval)); +} +#else static void vmstat_shepherd(struct work_struct *w) { int cpu; @@ -2062,6 +2079,7 @@ static void vmstat_shepherd(struct work_ schedule_delayed_work(&shepherd, round_jiffies_relative(sysctl_stat_interval)); } +#endif static void __init start_shepherd_timer(void) {