From mboxrd@z Thu Jan 1 00:00:00 1970 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 502FAEB64DD for ; Wed, 21 Jun 2023 18:17:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 978318D0007; Wed, 21 Jun 2023 14:17:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 92ACE8D0002; Wed, 21 Jun 2023 14:17:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7A2CB8D0007; Wed, 21 Jun 2023 14:17:11 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 6BD918D0002 for ; Wed, 21 Jun 2023 14:17:11 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 4848180803 for ; Wed, 21 Jun 2023 18:17:11 +0000 (UTC) X-FDA: 80927561862.15.17084AA Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by imf20.hostedemail.com (Postfix) with ESMTP id 780A61C0004 for ; Wed, 21 Jun 2023 18:17:09 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=70Qxbud8; spf=pass (imf20.hostedemail.com: domain of 3pD6TZAcKCJkRN3G5AN9HH9E7.5HFEBGNQ-FFDO35D.HK9@flex--yuanchu.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3pD6TZAcKCJkRN3G5AN9HH9E7.5HFEBGNQ-FFDO35D.HK9@flex--yuanchu.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1687371429; 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:in-reply-to:references:references:dkim-signature; bh=3JGsVX34HhPuQXT4BLiLEOz1NiuPLfb2cVh6HwJxK4o=; b=UYb477V0HUIq9sqqnSMIV7SZgopxPw5AFZa11LhXl9G66a4+F+Co7LYwEGELajhfzdopnA WkbkMlvdsj3TCrSqVsT3tMVhLmGswzPKQl9NJcJxNqa72U3DDSQMZ6q2/aGICUOQtCS6uT s2SlWEX5iDiYj0dXziCmSYwCABj6iOs= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1687371429; a=rsa-sha256; cv=none; b=utRGg9URsqSQTqk+hV6gbViTyfTIHfPjayVjZQCX4KEoRIS9k6MNvj/Xfgz27fmHlMva0D /DDyT2t8bn6d20HB1Os2rWiCXkPXbiit6ikTeFekNm8pLtqngVj7FVT/54PozDnXlg93ik FtLkXnyWwxYRq5QiHgEd466Cjguc+dk= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=70Qxbud8; spf=pass (imf20.hostedemail.com: domain of 3pD6TZAcKCJkRN3G5AN9HH9E7.5HFEBGNQ-FFDO35D.HK9@flex--yuanchu.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3pD6TZAcKCJkRN3G5AN9HH9E7.5HFEBGNQ-FFDO35D.HK9@flex--yuanchu.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-bd476ef40e0so8138040276.1 for ; Wed, 21 Jun 2023 11:17:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1687371428; x=1689963428; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=3JGsVX34HhPuQXT4BLiLEOz1NiuPLfb2cVh6HwJxK4o=; b=70Qxbud8HFNvNvLOmD566LbrpApTrbrxWsMSM6HF6QmoZGg/FBnAyX88slUMpumiBi diNbZcJERvs0V2VffNaDCVaHMJOzaVrBEkAe5EZ1O6A/hh0O9H5aZf8H2BB6Mlok5pwi Qp29oWTYIUZtuSy9RX7gPmQXkCw4QFn5nNaIbxnoUmOxwFKIDY0cBb8w/oEdrOysTyGI QKa8UsiA1/jCdjbbwtNfphxGUkYaFoXgqKIEitSaRhd8zSW01LwtJliel8Hudvgi30AS X/k6OhQGaUKb6QuOPuutfW8riQaepGTB5XzW87kgVWm7FTNzPsJL/a16RJ7U5XR1IOzX 77wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687371428; x=1689963428; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=3JGsVX34HhPuQXT4BLiLEOz1NiuPLfb2cVh6HwJxK4o=; b=H3M+TQ4b8zaD+OrqQi5ClnbK2lkaTPS00edMvG/vWb8DSINO4WHFCikJVteM1+6fHc aHeyZagzKpFyrZniHGvo5RuneIzWP89jFoqFkuS3v5sxxLH+IupoW3EEj/fSWm85C89I 9P4uGRSfoUW2MigfB8PTC/jVEYLS1e9zFqMRK/pyrSRpzQSNo+/EvlvWu+4T056ZWgTW QAkA4QtXOyqtSQFBjq4Ymy/mq+r7DenNBrHI8Y96QtqiEdDEeYzcz8MdxNQbshqfJ7xu GApJMU4DB4Y3oFiXWe6LTyzkSK7Cqy/AzWOnsSiTs9DyEQc2NABAlT8XBRhmyZbQVPin N0qg== X-Gm-Message-State: AC+VfDyMdv9qvjFAQFw4JEeQDp0uHX44vLdmapb6W+/4CZcG7x6qIQrq XGLYBfndCEY5jzG6Q9QY09k8KxKKoFlx X-Google-Smtp-Source: ACHHUZ7lRjBP8EMwiQd1c1PX3iz3BwdoE/2T4JCNISwvB2v6amjWmLe2IOsvdnoC6x+fSso2MhIxsYXQ7Fqr X-Received: from yuanchu.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:4024]) (user=yuanchu job=sendgmr) by 2002:a25:ab28:0:b0:bc5:2869:d735 with SMTP id u37-20020a25ab28000000b00bc52869d735mr6204196ybi.13.1687371428609; Wed, 21 Jun 2023 11:17:08 -0700 (PDT) Date: Wed, 21 Jun 2023 18:04:51 +0000 In-Reply-To: <20230621180454.973862-1-yuanchu@google.com> Mime-Version: 1.0 References: <20230621180454.973862-1-yuanchu@google.com> X-Mailer: git-send-email 2.41.0.162.gfafddb0af9-goog Message-ID: <20230621180454.973862-4-yuanchu@google.com> Subject: [RFC PATCH v2 3/6] mm: report working set when under memory pressure From: Yuanchu Xie To: Greg Kroah-Hartman , "Rafael J . Wysocki" , "Michael S . Tsirkin" , David Hildenbrand , Jason Wang , Andrew Morton , Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Yu Zhao , Kefeng Wang , Kairui Song , Yosry Ahmed , Yuanchu Xie , "T . J . Alumbaugh" Cc: Wei Xu , SeongJae Park , Sudarshan Rajagopalan , kai.huang@intel.com, hch@lst.de, jon@nutanix.com, Aneesh Kumar K V , Matthew Wilcox , Vasily Averin , linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, cgroups@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 780A61C0004 X-Rspam-User: X-Stat-Signature: 48un9fkqmeqrurk4rquhzaa1tqafto38 X-Rspamd-Server: rspam03 X-HE-Tag: 1687371429-538369 X-HE-Meta: U2FsdGVkX1/X/z5YvZ23grRgAHneHPwR/XIYUy5EPGaE6Xkz10BTTib63Ye/nm7r9xDNvKyUBCcZngnqcGNB7o6uP2WwmU2+dQ/pQuR70i5cTqDjq6Ik1S+iaURUHb2FAm3bH+mERWzbbCqOeqyzpH+HFxq+lsmAcoUIaToaSgMU2ApLEzNASqvvSOKI4y0FisblfvbOJAY6+XrsJ4mnvgxmGK9iWKGFKiPxxbtGM1ZPId1w5vjHkVxJwhDDhk3F2EW8/jHxiZPEIAVh3Yu62uN56RwmqCshhzpLNUhHnP3I/yg0lP7zOXI7KeWlntoh/D6dh8MTIJnmhTduuoIKy0kweRF0wFogR5dx3LPz0CjWxMFMkRlu0crJovE8C2ufVVfDGLCcSQjNTBjFGuYY76ppCGaPiAhxJXM9hdM2HDLGqR2aALN40qr5FI3pAHE+OFhDqLJGJXMEPi0vpm2HiSFWwIbTPgQnB5C8NRzCXNUT+74Nr/wdunju8/hENp3CMQx1je//u1Nhyos+fZN8gK0z+1KlJlyaim3VHdBee2X95VdeJ85D/cvl1qQrwG6+innkttoAFIkhStCwK4EPiwPPqmiHsmm2306ym8zQ8XVu+JQdOjZ8WdwjLSyY1D2zQlZzsBAuxxwsGWF2mlkxB55iYqVt1itzOuJKKU7V5UFUgP354MSC2uJcPw5QcHK3ZJGsbW5qqlyzLTlwjLApkorUZkSHb5PPa//OfLpqRoQ+zK9mnRwoiISYzbPIF/Ih6KmD+4EBIDscDjzhkdVswPGb1MKtPRLAIfl14i4QJ6pGAQAlHsvcj5BpdGT9s+DS/aUwyGTt5I2GT3VgJ+ajqoe5Phv0RoGyokeqW+salHZ8NNcQDAu3hsyu5YihbDq9AbJjE+AaMpDiS2D23pSfa6hQ/FJ8qyEW1IFxHjtNFxb0Kn2h62GceaJhzTnYl3BHxY8hX3d55OYeWGFNeUc DR83E0JU VovT7M+ZK4+BD4jEvgvnFMVzV/fhTiE6xrhNCVFLOMBvHhR6moxxAT8a6HajMLEicrQW2GPvvd4q0VelcZTPE3PMrAF+ZPlT887EWB8rpdo9vbr7+xtk/RAasVGpKyQK99DANw/fMAV8j0g9AkT2dte5bouDJS5IrONyQ0StO9kYNlGbriy/IMBhRKLUvGuI3910W7t566I4TsrxSZv90u9pkVC8YwEAhuGF5WcZHZCFGq6aX/a1Szd92uRr9LQW0rXahPX+TlufaoRcH7TgbwBMTKZnSFTL0qRaASx8nfAqei2p5kDPLzb4uXCOZ8ApZmEzLT/T/ADohVsNJI3SVCkNjwgjthaEK1wAKOru7hzrSF40HwxU6zKl10QSdTtS7FwiMv8JEQUU1eugcizulU8N8rFIpywu/Zb5uIu7rWKASKgse0l4Qg7DvPNoeRdKmCQK6ejcfjqozmMXKX3kwcZlf3mp4f73R+1CHG/41BuP3Z4/L80iL+PwpSO4mlBWO+cNk/t1GaR6XC9GFKoZCEiNLeOXWAIbGYlsWe75StsohKwqlvQIppLIzhVjBLgJMkVMnYqUD0lqOpzPikt9AC384D+HA9zPknjRAvsXmuQ3cOGs= 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: When a system is under memory pressure and kswapd kicks in, a working set report is produced. The userspace program polling on the histogram file is notified of the new report. The report threshold acts as a rate-limiting mechanism to prevent the system from generating reports too frequently. Signed-off-by: T.J. Alumbaugh Signed-off-by: Yuanchu Xie --- include/linux/wsr.h | 2 ++ mm/vmscan.c | 37 +++++++++++++++++++++++++++++++++++++ mm/wsr.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/include/linux/wsr.h b/include/linux/wsr.h index a86105468c710..85c901ce026b9 100644 --- a/include/linux/wsr.h +++ b/include/linux/wsr.h @@ -26,7 +26,9 @@ struct ws_bin { struct wsr { /* protects bins */ struct mutex bins_lock; + struct kernfs_node *notifier; unsigned long timestamp; + unsigned long report_threshold; unsigned long refresh_threshold; struct ws_bin bins[MAX_NR_BINS]; }; diff --git a/mm/vmscan.c b/mm/vmscan.c index 66c5df2a7f65b..c56fddcec88fb 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4559,6 +4559,8 @@ static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc, unsigned return true; } +static void report_ws(struct pglist_data *pgdat, struct scan_control *sc); + /* to protect the working set of the last N jiffies */ static unsigned long lru_gen_min_ttl __read_mostly; @@ -4570,6 +4572,8 @@ static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) VM_WARN_ON_ONCE(!current_is_kswapd()); + report_ws(pgdat, sc); + sc->last_reclaimed = sc->nr_reclaimed; /* @@ -5933,6 +5937,39 @@ void wsr_refresh(struct wsr *wsr, struct mem_cgroup *root, } } +static void report_ws(struct pglist_data *pgdat, struct scan_control *sc) +{ + static DEFINE_RATELIMIT_STATE(rate, HZ, 3); + + struct mem_cgroup *memcg = sc->target_mem_cgroup; + struct wsr *wsr = lruvec_wsr(mem_cgroup_lruvec(memcg, pgdat)); + unsigned long threshold; + + threshold = READ_ONCE(wsr->report_threshold); + + if (sc->priority == DEF_PRIORITY) + return; + + if (READ_ONCE(wsr->bins->idle_age) == -1) + return; + + if (!threshold || time_is_after_jiffies(wsr->timestamp + threshold)) + return; + + if (!__ratelimit(&rate)) + return; + + if (!mutex_trylock(&wsr->bins_lock)) + return; + + refresh_wsr(wsr, memcg, pgdat, sc, 0); + WRITE_ONCE(wsr->timestamp, jiffies); + + mutex_unlock(&wsr->bins_lock); + + if (wsr->notifier) + kernfs_notify(wsr->notifier); +} #endif /* CONFIG_WSR */ #else /* !CONFIG_LRU_GEN */ diff --git a/mm/wsr.c b/mm/wsr.c index ee295d164461e..cd045ade5e9ba 100644 --- a/mm/wsr.c +++ b/mm/wsr.c @@ -24,6 +24,7 @@ void wsr_init(struct lruvec *lruvec) mutex_init(&wsr->bins_lock); wsr->bins[0].idle_age = -1; + wsr->notifier = NULL; } void wsr_destroy(struct lruvec *lruvec) @@ -184,6 +185,30 @@ static struct wsr *kobj_to_wsr(struct kobject *kobj) return lruvec_wsr(mem_cgroup_lruvec(NULL, kobj_to_pgdat(kobj))); } +static ssize_t report_ms_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + struct wsr *wsr = kobj_to_wsr(kobj); + unsigned long threshold = READ_ONCE(wsr->report_threshold); + + return sysfs_emit(buf, "%u\n", jiffies_to_msecs(threshold)); +} + +static ssize_t report_ms_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t len) +{ + unsigned int msecs; + struct wsr *wsr = kobj_to_wsr(kobj); + + if (kstrtouint(buf, 0, &msecs)) + return -EINVAL; + + WRITE_ONCE(wsr->report_threshold, msecs_to_jiffies(msecs)); + + return len; +} + +static struct kobj_attribute report_ms_attr = __ATTR_RW(report_ms); static ssize_t refresh_ms_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -290,6 +315,7 @@ static ssize_t histogram_show(struct kobject *kobj, struct kobj_attribute *attr, static struct kobj_attribute histogram_attr = __ATTR_RO(histogram); static struct attribute *wsr_attrs[] = { + &report_ms_attr.attr, &refresh_ms_attr.attr, &intervals_ms_attr.attr, &histogram_attr.attr, @@ -318,6 +344,8 @@ void wsr_register_node(struct node *node) pr_warn("WSR failed to created group"); return; } + + wsr->notifier = kernfs_walk_and_get(kobj->sd, "wsr/histogram"); } void wsr_unregister_node(struct node *node) @@ -329,6 +357,7 @@ void wsr_unregister_node(struct node *node) return; wsr = kobj_to_wsr(kobj); + kernfs_put(wsr->notifier); sysfs_remove_group(kobj, &wsr_attr_group); wsr_destroy(mem_cgroup_lruvec(NULL, kobj_to_pgdat(kobj))); } -- 2.41.0.162.gfafddb0af9-goog