From patchwork Mon Mar 20 18:03:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcelo Tosatti X-Patchwork-Id: 13181690 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7BF82C7618A for ; Mon, 20 Mar 2023 18:12:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 32E366B007E; Mon, 20 Mar 2023 14:12:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2497B6B0083; Mon, 20 Mar 2023 14:12:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C7EB36B0080; Mon, 20 Mar 2023 14:12:12 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 996406B0082 for ; Mon, 20 Mar 2023 14:12:12 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 4D784AB54F for ; Mon, 20 Mar 2023 18:12:12 +0000 (UTC) X-FDA: 80590070904.26.6DB8FDB Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf22.hostedemail.com (Postfix) with ESMTP id 7A3DEC001D for ; Mon, 20 Mar 2023 18:12:10 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=UcGYbldq; spf=pass (imf22.hostedemail.com: domain of mtosatti@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=mtosatti@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1679335930; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding:in-reply-to: references:references:dkim-signature; bh=BeFRTjFm0L142WsTkcDAje75c4PixN4nDF8ylAdfn+w=; b=DHvYq2ZVkMVc6Q745IbGS/KpJes7rqsc/0glOim41Z7DY14RhNZ8jPBpODWSPxb9FwCcGD /Wrc7x8SF5cuztHOSNYb3Pe27lm4Y2TG16YKFgejy0H2qR6SUbadkpKsNx1R+2Be0G3fwr wVHBcrhYs5KvpaBLYUkQZhVL6MpnS/I= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=UcGYbldq; spf=pass (imf22.hostedemail.com: domain of mtosatti@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=mtosatti@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1679335930; a=rsa-sha256; cv=none; b=HzsfuP7E/YJux2RM6IZz0WAwQhZ95RBpPueEH/39RbFeX3dd6DJ0789gvbtAjh++7BpavI FcMAKIbCPgu3vy0TZD6PfHDtlETsBzdTXSyABxG0J6RYQNXpGKiH/gs7LvJG4pV1l1aj8M /0a7tSlX0CndAlRSRKXzYx4k6SDkLfQ= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1679335929; 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=UcGYbldqAuFvX++rBi3llAZk6L7oMwaMQ0saw3Vqc2ChD/bnh2qCrJZn1W6qtzy1OS45Yv xXumn5fWUM1X8eOOBlysGkbospqGBn8nNvkxEz6C8lmimv7ES9R20SXr9NWL6cnwV4nyNo ZiDMGfVPFBVDq8oA27uoAexvrfV4DLc= 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 To: Christoph Lameter Cc: Aaron Tomlin , Frederic Weisbecker , Andrew Morton , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Russell King , Huacai Chen , Heiko Carstens , x86@kernel.org, Vlastimil Babka , Michal Hocko , Marcelo Tosatti 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 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 X-Stat-Signature: rifuhcxmxd9hwewdhkiwmyciwo75tkbr X-Rspam-User: X-Rspamd-Queue-Id: 7A3DEC001D X-Rspamd-Server: rspam06 X-HE-Tag: 1679335930-27922 X-HE-Meta: U2FsdGVkX19hKylqOHdMUYc5HO3i60E/vLpJTnLQjixsQRtS8InQ7nYXTDXWtL/Kdl1Dvn5L+lql7gTgtHLyuP3fAoX10MPaOMOOGlPcInrW8CjxvOYCd6rgjDF9Bsob+dl0em5YSzZc+csjn7fHfzdOqdQtSy1fTMvpe8Pg8P/fmc6cUl7bAF2Ofx4X6oJnWNz6pgzPlmLYAmw4YiiMzS52gYWDwH1LpVpJNeKVp6k6Gnim4QuI7HZl8m50AZrdGgj6FqzpxaaL5sYJuZDWXh/GP2MU8hTTuShkzlIGa/yHoUVVcQAeWIMb0I3j9qSTqt0yXxa2g710F4shNJq5wlTFlQ+zREfGCjamVPkAeOM7bSjFz7DPq+DqPioqy1SwA3sgZrLWDTzLigq/Hy7BCI7MnKzHl/yXdl2+iUv83rrDTZIEJzmdG4+kv9YPs7fEZSmQDyWp3xFSW1S6WBYgGa1Fe4ezpbaipeeBbqp1MVpu5Gwja08Ik+kzB3MPunf3RMTQtBKjZ6iw3KcRBZgcmbGemXPfXZvvQIpUxo7NgAzN0xOEE/vifhEwlA/ieMleGepaqaD7WsOv5ABSG/46wuox/VQTzTw4LOvkfFMHw/w4s8YPTFhDp7fDLvHTKkH2oChxgPcuFDzjJRQoM0jF9NbRFxcLwZ5+7fXFSS6RAhCJSJID9VNhcmWt7vYKzhkWFAtS9cJNNaglCR9AihsS750/5zKmWuEukS6FphnbIoAA9/yOwuHuq1FnJ8WAAqXyYyOjrdbD/3AyrUgKlvwueDcEMjr6FRpUe8bsjxwSEAHRP9Km8Iq17n/LBati3+bhj3CIKrWHzuEcHXY9CVBVM4uKzeHrFxdqiADPt1Xi5wQFODIU9M2O9tuQzrdFt7S6Xz4MpxkImRhVas/OBUK0sZIxnsbgwsXQyvJyk8jjVLbz+2+UFRCvC600CjKg/uOSTxXapH5knxfPXzdKvkr St7NMkSS ffcVKBHJBD5E1h3Eo2gak8QeIXUWr6J88Fy4AcUMyko0pEsYksEUFOHTPbkKTQISsBk4CP93ugFdyDlAw44Tq+vlbhxvnKqUrfHgAsBZ39j1rcWZuXXndmcb/bDnQi75FgSfBhkKQS4HpJL8NeHA2Q3Tlc7Bk8OHbz8PaYw4aR2xwbTYnrnKJ9HWrL7Pr+EZlBt9kb0euWEO0+7I= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: 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 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) {