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 12C05C5321E for ; Mon, 26 Aug 2024 03:04:39 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 98ADF8D0040; Sun, 25 Aug 2024 23:04:38 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 93A898D001C; Sun, 25 Aug 2024 23:04:38 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 829668D0040; Sun, 25 Aug 2024 23:04:38 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 667968D001C for ; Sun, 25 Aug 2024 23:04:38 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id C92951C42A9 for ; Mon, 26 Aug 2024 03:04:37 +0000 (UTC) X-FDA: 82492903794.13.A6387E6 Received: from out-173.mta1.migadu.com (out-173.mta1.migadu.com [95.215.58.173]) by imf30.hostedemail.com (Postfix) with ESMTP id C5D7A80008 for ; Mon, 26 Aug 2024 03:04:35 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=HRPmht9t; spf=pass (imf30.hostedemail.com: domain of kent.overstreet@linux.dev designates 95.215.58.173 as permitted sender) smtp.mailfrom=kent.overstreet@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724641390; 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=o+n/9Fxr2xrcZx51pJMS5KHROlmUvJ6LIsGBARrvBq0=; b=U8iTKYnYJiu2dldp1VjZ7btBW40qJDI+jsQ7cyuJnwzq5yTgMoBeTHgqD4+fgwtFk5y+yU 1evS1FN6M1OqTLR0k5+v4pKTSFBcYhDjzh0l3LcBxHSTb1KEB0MN+xNF+K1/RfSFe4JRPO zYq+lYOPs42kE/Of2pRSXV6Wf41EbZA= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724641390; a=rsa-sha256; cv=none; b=MLkI9Jj3Y9CH+xGKA76edjHTznJyVoYmjs/QcmYzNFmFJu28+xBty4AXYAhHpcOjE4xdAo 95SKYgLHG+XU1mFKJGBysFaKPq2c+ips+oN3P+L3+N4fo2tNqdVxtF3dTNgh7xNc+ClEEh Cudlh5AGQcVd7i710Wr8HaILOmoKy4E= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=HRPmht9t; spf=pass (imf30.hostedemail.com: domain of kent.overstreet@linux.dev designates 95.215.58.173 as permitted sender) smtp.mailfrom=kent.overstreet@linux.dev; dmarc=pass (policy=none) header.from=linux.dev Date: Sun, 25 Aug 2024 23:04:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1724641473; 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: in-reply-to:in-reply-to:references:references; bh=o+n/9Fxr2xrcZx51pJMS5KHROlmUvJ6LIsGBARrvBq0=; b=HRPmht9tv0MApkzWVzJGzUPukhO+bhLXnhdTKlkE8cUU2XnMJ2D6N/YAyb4OlfC9UYmUfB +D5eAOK8ps8BgkFbEpc3P+H7gsIwMyKbGa+k38JF2NlGMa6OJBA1PD3O9LntWFzOm2tfOx VTe58SBj17o+s1XrHw/oAdbu8J8CnFg= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Kent Overstreet To: Qi Zheng Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Andrew Morton , Roman Gushchin Subject: Re: [PATCH 02/10] mm: shrinker: Add a .to_text() method for shrinkers Message-ID: References: <20240824191020.3170516-1-kent.overstreet@linux.dev> <20240824191020.3170516-3-kent.overstreet@linux.dev> <122be87e-132f-4944-88d9-3d13fd1050ad@bytedance.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <122be87e-132f-4944-88d9-3d13fd1050ad@bytedance.com> X-Migadu-Flow: FLOW_OUT X-Stat-Signature: hkfe5dxm93ubbfykaj5bmgggxdbn6g3c X-Rspamd-Queue-Id: C5D7A80008 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1724641475-650591 X-HE-Meta: U2FsdGVkX1/Jxjv3C9xt65CJ36FYFHXxFcDhVbemsjmjO1clYwwomELsyd2jcQkjpTvB9A2fEkXoJNMRK6ayn5L5jvF8kOlSIQCOxIC57pWpXOo/zExPl6MhNARm9EaM2P7nbASCC5GYFPWg81yO/S+tRlpG7iNnDOip2jgW5Sd0QqmjT87awdNomxj89QjMsw3qo99golL3w3Z6KNgxeqQOQ54cQzw6VSoQUHOdaS9ofFWMrJ72uVANWfhYAiJ3wPLNRSTmiUuREClgLC8z33mfv0Npo/7HyKwEpVBgSx9+A3N1EwJW9TxfO2nBoDeD4XzJcGfhRvT8GBtJQdk+LWW73/1kMinSK5rJpT0fsHHaaUUOr1zdc/q6S7xW831ebkhoUCc56aDNvkPA9Ugk9fmb6iT+mX/pfal5GqqH5f9px4MKDphiV0/nEZv59aejvIpbh32kZdn8CQQVGXfMfY+vQ+OCxJ9yysel18ZAGFgASOQ9cSEyj/uuNBUC/FZvbw1YzqHyBgTsHdwJW+Uaen8zvjWOsJZHuJil+3UrnnWlB9tKzOl8frMb1G9spoJNM5zM1bIpoNdPOPQE9PzjtJ+zMvdU7NWNJC6BrtWRYY38ZdRPsWQvM/9ZepCFVg24vtkt5VaTKeadKFJYQ+Mf9Cvpqg4X8nHpeq5frUx2K1uwxM6kvwnv2yqn+hPSv3/cxXLEIeWuYjLg3mBTUVZ3TJ6ISY43NHNKZRBrJPEDra3YXj2g7qDtR4qq8lnep2MvnSg2aCI4cIVtL9F/yFvsrSnJF1xuISfSu2R/xaUb5SQDubbzbcWZBm2SrsRXRwpENHsdJzdYrA3P9lFPMUPBtOFAbJFa+IwOiJuu7XYSu7e095+SuchABdKR7sqtKnX1gNl216C+8kSUIcXZFzhfqwpTYkX0wKcX/TogLjwtexvLUcpg3TlQRHZ5I5k62Jk7OwZXw4ICA9fgnLNAJz3 Rtjyaj/+ /not6AMqDFdkmY6a4DiR+0kom+aErQSXf4WEOUXeEb/+ElL+QyA9Bzzf4jbN7iYb/gVJn5K3tkLHWV4dZT2zRlBarKUfMU0RG1qr6aA1/t4FG3AqNVjCSqCCj1jGymLQpFGzftOSDU0a1osECGcYwfG+hPRs84NQJdPcDomfjPUd7hx1j3ItjBmwyFnxWO/4TxHyXhnePrL5lupg5bv+KfnaC+BeuAdkNT27viwCGa8CaWgGgFUJSzYlFcsQ+lBYi4FydTgB6AgaYl4QMrA9WV8mSR0PFbNE/MKRRqrrC4ZyOyTEksgYvmE47ZzYidC89n0DxsoRkMNYQVR7tteT1k+/aIQ== 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: List-Subscribe: List-Unsubscribe: On Mon, Aug 26, 2024 at 11:01:50AM GMT, Qi Zheng wrote: > > > On 2024/8/25 03:10, Kent Overstreet wrote: > > This adds a new callback method to shrinkers which they can use to > > describe anything relevant to memory reclaim about their internal state, > > for example object dirtyness. > > > > This patch also adds shrinkers_to_text(), which reports on the top 10 > > shrinkers - by object count - in sorted order, to be used in OOM > > reporting. > > > > Cc: Andrew Morton > > Cc: Qi Zheng > > Cc: Roman Gushchin > > Cc: linux-mm@kvack.org > > Signed-off-by: Kent Overstreet > > --- > > include/linux/shrinker.h | 7 +++- > > mm/shrinker.c | 73 +++++++++++++++++++++++++++++++++++++++- > > 2 files changed, 78 insertions(+), 2 deletions(-) > > > > diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h > > index 1a00be90d93a..6193612617a1 100644 > > --- a/include/linux/shrinker.h > > +++ b/include/linux/shrinker.h > > @@ -24,6 +24,8 @@ struct shrinker_info { > > struct shrinker_info_unit *unit[]; > > }; > > +struct seq_buf; > > + > > /* > > * This struct is used to pass information from page reclaim to the shrinkers. > > * We consolidate the values for easier extension later. > > @@ -80,10 +82,12 @@ struct shrink_control { > > * @flags determine the shrinker abilities, like numa awareness > > */ > > struct shrinker { > > + const char *name; > > unsigned long (*count_objects)(struct shrinker *, > > struct shrink_control *sc); > > unsigned long (*scan_objects)(struct shrinker *, > > struct shrink_control *sc); > > + void (*to_text)(struct seq_buf *, struct shrinker *); > > long batch; /* reclaim batch size, 0 = default */ > > int seeks; /* seeks to recreate an obj */ > > @@ -110,7 +114,6 @@ struct shrinker { > > #endif > > #ifdef CONFIG_SHRINKER_DEBUG > > int debugfs_id; > > - const char *name; > > struct dentry *debugfs_entry; > > #endif > > /* objs pending delete, per node */ > > @@ -135,6 +138,8 @@ __printf(2, 3) > > struct shrinker *shrinker_alloc(unsigned int flags, const char *fmt, ...); > > void shrinker_register(struct shrinker *shrinker); > > void shrinker_free(struct shrinker *shrinker); > > +void shrinker_to_text(struct seq_buf *, struct shrinker *); > > +void shrinkers_to_text(struct seq_buf *); > > static inline bool shrinker_try_get(struct shrinker *shrinker) > > { > > diff --git a/mm/shrinker.c b/mm/shrinker.c > > index dc5d2a6fcfc4..ad52c269bb48 100644 > > --- a/mm/shrinker.c > > +++ b/mm/shrinker.c > > @@ -1,8 +1,9 @@ > > // SPDX-License-Identifier: GPL-2.0 > > #include > > +#include > > #include > > +#include > > #include > > -#include > > #include > > #include "internal.h" > > @@ -807,3 +808,73 @@ void shrinker_free(struct shrinker *shrinker) > > call_rcu(&shrinker->rcu, shrinker_free_rcu_cb); > > } > > EXPORT_SYMBOL_GPL(shrinker_free); > > + > > +void shrinker_to_text(struct seq_buf *out, struct shrinker *shrinker) > > +{ > > + struct shrink_control sc = { .gfp_mask = GFP_KERNEL, }; > > + > > + seq_buf_puts(out, shrinker->name); > > + seq_buf_printf(out, " objects: %lu\n", shrinker->count_objects(shrinker, &sc)); > > + > > + if (shrinker->to_text) { > > + shrinker->to_text(out, shrinker); > > + seq_buf_puts(out, "\n"); > > + } > > +} > > + > > +/** > > + * shrinkers_to_text - Report on shrinkers with highest usage > > + * > > + * This reports on the top 10 shrinkers, by object counts, in sorted order: > > + * intended to be used for OOM reporting. > > + */ > > +void shrinkers_to_text(struct seq_buf *out) > > +{ > > + struct shrinker *shrinker; > > + struct shrinker_by_mem { > > + struct shrinker *shrinker; > > + unsigned long mem; > > + } shrinkers_by_mem[10]; > > + int i, nr = 0; > > + > > + if (!mutex_trylock(&shrinker_mutex)) { > > + seq_buf_puts(out, "(couldn't take shrinker lock)"); > > + return; > > + } > > I remember I pointed out that the RCU + refcount method should be used > here. Otherwise you will block other shrinkers from > registering/unregistering, etc. The more complex iteration isn't needed here - this is a slowpath function and we're not doing anything blocking inside it.