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 209D8C77B7F for ; Tue, 24 Jun 2025 18:26:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 89C446B00AA; Tue, 24 Jun 2025 14:26:55 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 874976B00AB; Tue, 24 Jun 2025 14:26:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7B1586B00AC; Tue, 24 Jun 2025 14:26:55 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 68B016B00AA for ; Tue, 24 Jun 2025 14:26:55 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id DDF62BE18D for ; Tue, 24 Jun 2025 18:26:54 +0000 (UTC) X-FDA: 83591125548.04.122214A Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) by imf25.hostedemail.com (Postfix) with ESMTP id D89F5A0002 for ; Tue, 24 Jun 2025 18:26:52 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=gf8r+ld9; spf=pass (imf25.hostedemail.com: domain of klarasmodin@gmail.com designates 209.85.208.171 as permitted sender) smtp.mailfrom=klarasmodin@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750789613; 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=NOL3VPCbvSk678bwpXffD/cpYf2x6fiZgpK1l3PlTO8=; b=7UI8M9exwC+dmTXhgWLm6HjR3oyaepe7OS2aTuh9INS88/VfmW7lvDj5+xh9sJeH4rs+EQ OVELT3V42viycjDUplhyCBE/S7lDs60JB+evYo9XIKLW7wB6l/nmWykACwL/mRsBW53VlS R7/ekLMa4lgqLQOp4TydJP8w/XpGfk8= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750789613; a=rsa-sha256; cv=none; b=hqIqkpEpbmeOdr5Aljt9zMLf5+/9gicnpeJg9METwnFKjWipdRsjw5x7fPK6Izk02lBk88 B7YioEqpknUbJdyc7+Z7oaLeg1VGot81HL3BkeyYYlbcvVgHzKtLuUyJuJDg4ZoDWvrSfp JFkOeKMe7HAbrQxDfyGMLhcoGwdCAFA= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=gf8r+ld9; spf=pass (imf25.hostedemail.com: domain of klarasmodin@gmail.com designates 209.85.208.171 as permitted sender) smtp.mailfrom=klarasmodin@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-lj1-f171.google.com with SMTP id 38308e7fff4ca-32b435ef653so6106201fa.2 for ; Tue, 24 Jun 2025 11:26:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750789611; x=1751394411; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=NOL3VPCbvSk678bwpXffD/cpYf2x6fiZgpK1l3PlTO8=; b=gf8r+ld91EbsWbY7+SrRCmyhaRW3Jk0RD5b24ptVnDS4i88Mb0YIImRRV9l8U4ZmLJ 1fNNAoEmdcRkLydqQ952TrAUuH0r8zI4JL4akCIiLqcQCo3n8IbIemqFPy+ET+1rbsff sX9DJ+2deRL6z2lhkIXHCrRxTqfW4y+Nw2NQK9xkMH8wNm/UJJo7SjD9+JAIFLsW/4DN UlKv/CON910B0ougGQPO9KBKzMvQzk/bKgrpSGnbyphLvjD4DhL/reocz2mJ04RPAil0 bgivbmTbQf6aW0GCdPuoQNEIDWxemnb2Z+s/8TixuC1j6w2mgJxylnb4NwEMZTjvEPjx tC5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750789611; x=1751394411; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=NOL3VPCbvSk678bwpXffD/cpYf2x6fiZgpK1l3PlTO8=; b=ZceX/Bp7geIaNvnpV3GJCS25JejMg+zfJEspxP9wx2lgjrNruQ6Jd87/qy5ghxuf6J DKnhQj10WQ5b9SysI0o2zxY1jnkI7FQXxYu//ougO4jMptvu+A/WpfbJa6FRx5tF52eH evLpKPwiTJ9hVCzSx6t9lwYlf3zqteou7E53GpgZ3b33CPwGqTQLMQo8lI1HHV1EpUDZ zCc9XtsPTu6DPzoeamxNzHTa204K2LTVz7mnE/zxscUGC1TEDEin8+uNEmO1GKSdyn8s 14kjqV8FgVmCdXo5PA7Dk+aiI8Bp8Az40IZbCYsILRCVHl22uY0HP1R60vjRx+bmZmW/ y7FA== X-Forwarded-Encrypted: i=1; AJvYcCWKqv3+HOpHAgFQ3fJWzCPmo6U4M7EuPw2BXIAQbdWlDq0r10BzBPWAQvSx6uG+5qzUngyQJXHmdA==@kvack.org X-Gm-Message-State: AOJu0YwhTDfrr5/glH2nlocy3KS7NkpZbHHXUeelPyt0s8sui8a16N8W 6H+RgWafNoa9JO4x5aQHm1Rx2Rg9iqCT/NEdMrchEVKYBbDRNRygQ5Xt X-Gm-Gg: ASbGncuh318FOC9k4vYd7I/Ft7qNTUseGb2UX7tR5rIAonn+3l/Hg7vRJjx+79Omgda m0V6Ls3vGt1KldY9wHtLdQwdUp8DSjYLF4e83XEQ5ViGCi0hfogpPYjAJoVmuK4NWrFVTEcsFz3 XUF75KZ0RO1fysCDB2SxoGhqGiWtfYDeItUdwhcrL78NFedW5P03bgjtfkzMwhSNyulLjsTf3VL xAjrZYJPRLx5G98nfrG/w8kyV/g8FKGGoaaF9W4+6i88lR+bRPjQD5fVlhwo82FMNqiACFEo0oM kptfzPRwMEKh6AO3tMdlPv/JkGo1CFwJ8bLzyrY91VmQcEfF70P1jQeQ+L66kyFGtj3p/m9LFJN oDg== X-Google-Smtp-Source: AGHT+IEqJlzmpZ6XZwN3lTmPMJwIZc8bxR2EFu7/p6Er1eEArhQP/ehXQjtFlrIlWaev2pwndpdTmw== X-Received: by 2002:a05:651c:1076:b0:32b:47eb:8bcc with SMTP id 38308e7fff4ca-32b98ed9d8emr39305161fa.13.1750789610496; Tue, 24 Jun 2025 11:26:50 -0700 (PDT) Received: from localhost (soda.int.kasm.eu. [2001:678:a5c:1202:4fb5:f16a:579c:6dcb]) by smtp.gmail.com with UTF8SMTPSA id 2adb3069b0e04-553e41c426esm1899748e87.180.2025.06.24.11.26.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Jun 2025 11:26:50 -0700 (PDT) Date: Tue, 24 Jun 2025 20:26:49 +0200 From: Klara Modin To: Davidlohr Bueso Cc: akpm@linux-foundation.org, mhocko@kernel.org, hannes@cmpxchg.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, yosryahmed@google.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 2/4] mm/memcg: make memory.reclaim interface generic Message-ID: References: <20250623185851.830632-1-dave@stgolabs.net> <20250623185851.830632-3-dave@stgolabs.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20250623185851.830632-3-dave@stgolabs.net> X-Rspamd-Queue-Id: D89F5A0002 X-Stat-Signature: 8opthniu7wq4crfrf9ieskzdn8n94gax X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1750789612-344953 X-HE-Meta: U2FsdGVkX19p8xXM6F0lg5moGLeRXhsTPm6PEMGXc4RhTMkc+Ax9z1JGTmw25H6z6CZ3bSWg4Jw2Z/ByaXvtq8Gklv9OhI8ed1lSoHx/eGZPdqo18wYNKcx1R9mlNibbEVjJjReIyW4sfrwXc0l03hvchCw+00EB+//TrisA/4U2i+mOOv019tObaxEBf7DuI1j73eDVp1Jm6BD1a+6Xu6BTcW3U7t3gGGB4g6CPJL2j/irB+lQJvzcqREtwJBNs5H7G+hLWvonmzpBGO4yC79ApTV7937euqi6uZNOB1YPzappIRIB4Iip+wW94ycKc3jfOyK/uCeDXbzlzKxPmXb6CvEJdfn03MJL2dyi47M1YGQa4wfJUWGkCPblvEoX1WOYfJejJSpWpNKRJou1qUhvMidYpvmMh+6czEaM+oJ3z4rns71mMu3Cr7bu8KvqowJ+XFxaUpmdCmee9BuV2iRIPfTwgDTDlr4hdbBENLt1bXh2yUUBt6ToLc27F1Etxa3FbvyAISvmqMSPNJ2eMZV2OQxZOg+UxlUu9uZgxx3EK/Y7J90Akyvv19knjHT5gqRPifGjAj+bJ3Ct2nSsrylMWqRxwa07EFUbPqhUm33eoJjct6quJbYG2i512X9vi+A17+G0OOq/bg9aejED41v+H+1XTHWg22kRgZRAcyAqjuyY7BUzR4H3rHN6CbgvMzVfZ51PjvHQ36ewsRz7NXARkmkS+DWN30SF5mkSAWRtUPIxr7rKBxqVJ74nKfiFM7LsfmXSGdzghNVlfhhdo1wj0jzhgfLZ0h6TlilHNb/t9B0KzDJ90vFKJ/hI/jMDHpo80fdRDzWX3ArL7jTZYuqJAHTxFw+lrLPiF9IOXnJZ2XC1AkFSsahrW/n3KAikDsAOlKBJUpTptxeUyzDBpfwsqbDamSJ+osI4QyxBoi/x1r3G+dWWYLx27yVNcfS9+FGmqvJ2URuYtauZzaj0 LDFSbVvq wu/w6B7vXRMrIBT/9d3ZOy6kWwmLjj5T8SkI2YiXbBcRzVDkhUKu5DLZw487rx5M8+OuBxxhVlkjonx3h+QDN1f/sD32YaQWHj/dYu40Pivv2o+yoSp4eT85pkbYvevKr4bJuJEyoKpbdGPpAKEDukf7A76HwKUC8mkFDNKf6MykXLHa2EFNRV+bU6T9CyOY6Q/eIkqnydSOJKdIoXNBIUqyEdzREHVKtma5eftBioiUZf1dnpvnK+2ASgwBalRF1EhpX49Gl26GZWg0WzNNNct7Q3t3qZ1CqEHzJ71GyAHiYQgB8GAoPCRZqc+wMgnTFbHfp6+uBFBqBIn1BNtW0QlypKP6dNjK1TsKM3Cq/7+B9M3D2qY1TecEuZ5mYiC86peiJn9t+mJ5az3dzjswseWri0/Yy8POEbWqeWuolow5z48jKwZHBKOqD1gUROZe6NnsIVq2lDKkirl1fHn9iedGoVOhGk6640VS3C9+yla8+wa1gstIjqVD76678tlBKIvtD 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: Hi, On 2025-06-23 11:58:49 -0700, Davidlohr Bueso wrote: > This adds a general call for both parsing as well as the > common reclaim semantics. memcg is still the only user and > no change in semantics. > > Signed-off-by: Davidlohr Bueso > --- > mm/internal.h | 2 + > mm/memcontrol.c | 77 ++------------------------------------ > mm/vmscan.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 104 insertions(+), 73 deletions(-) > > diff --git a/mm/internal.h b/mm/internal.h > index 3823fb356d3b..fc4262262b31 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -517,6 +517,8 @@ extern unsigned long highest_memmap_pfn; > bool folio_isolate_lru(struct folio *folio); > void folio_putback_lru(struct folio *folio); > extern void reclaim_throttle(pg_data_t *pgdat, enum vmscan_throttle_state reason); > +int user_proactive_reclaim(char *buf, > + struct mem_cgroup *memcg, pg_data_t *pgdat); > > /* > * in mm/rmap.c: > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 902da8a9c643..015e406eadfa 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -51,7 +51,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -4566,83 +4565,15 @@ static ssize_t memory_oom_group_write(struct kernfs_open_file *of, > return nbytes; > } > > -enum { > - MEMORY_RECLAIM_SWAPPINESS = 0, > - MEMORY_RECLAIM_SWAPPINESS_MAX, > - MEMORY_RECLAIM_NULL, > -}; > - > -static const match_table_t tokens = { > - { MEMORY_RECLAIM_SWAPPINESS, "swappiness=%d"}, > - { MEMORY_RECLAIM_SWAPPINESS_MAX, "swappiness=max"}, > - { MEMORY_RECLAIM_NULL, NULL }, > -}; > - > static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, > size_t nbytes, loff_t off) > { > struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); > - unsigned int nr_retries = MAX_RECLAIM_RETRIES; > - unsigned long nr_to_reclaim, nr_reclaimed = 0; > - int swappiness = -1; > - unsigned int reclaim_options; > - char *old_buf, *start; > - substring_t args[MAX_OPT_ARGS]; > - > - buf = strstrip(buf); > - > - old_buf = buf; > - nr_to_reclaim = memparse(buf, &buf) / PAGE_SIZE; > - if (buf == old_buf) > - return -EINVAL; > - > - buf = strstrip(buf); > - > - while ((start = strsep(&buf, " ")) != NULL) { > - if (!strlen(start)) > - continue; > - switch (match_token(start, tokens, args)) { > - case MEMORY_RECLAIM_SWAPPINESS: > - if (match_int(&args[0], &swappiness)) > - return -EINVAL; > - if (swappiness < MIN_SWAPPINESS || swappiness > MAX_SWAPPINESS) > - return -EINVAL; > - break; > - case MEMORY_RECLAIM_SWAPPINESS_MAX: > - swappiness = SWAPPINESS_ANON_ONLY; > - break; > - default: > - return -EINVAL; > - } > - } > - > - reclaim_options = MEMCG_RECLAIM_MAY_SWAP | MEMCG_RECLAIM_PROACTIVE; > - while (nr_reclaimed < nr_to_reclaim) { > - /* Will converge on zero, but reclaim enforces a minimum */ > - unsigned long batch_size = (nr_to_reclaim - nr_reclaimed) / 4; > - unsigned long reclaimed; > - > - if (signal_pending(current)) > - return -EINTR; > - > - /* > - * This is the final attempt, drain percpu lru caches in the > - * hope of introducing more evictable pages for > - * try_to_free_mem_cgroup_pages(). > - */ > - if (!nr_retries) > - lru_add_drain_all(); > - > - reclaimed = try_to_free_mem_cgroup_pages(memcg, > - batch_size, GFP_KERNEL, > - reclaim_options, > - swappiness == -1 ? NULL : &swappiness); > - > - if (!reclaimed && !nr_retries--) > - return -EAGAIN; > + int ret; > > - nr_reclaimed += reclaimed; > - } > + ret = user_proactive_reclaim(buf, memcg, NULL); This is outside CONFIG_NUMA. > + if (ret) > + return ret; > > return nbytes; > } > diff --git a/mm/vmscan.c b/mm/vmscan.c > index c13c01eb0b42..63ddec550c3b 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -57,6 +57,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -6714,6 +6715,15 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, > > return nr_reclaimed; > } > +#else > +unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, > + unsigned long nr_pages, > + gfp_t gfp_mask, > + unsigned int reclaim_options, > + int *swappiness) > +{ > + return 0; > +} > #endif > > static void kswapd_age_node(struct pglist_data *pgdat, struct scan_control *sc) > @@ -7708,6 +7718,94 @@ int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order) > > return ret; > } > + > +enum { > + MEMORY_RECLAIM_SWAPPINESS = 0, > + MEMORY_RECLAIM_SWAPPINESS_MAX, > + MEMORY_RECLAIM_NULL, > +}; > +static const match_table_t tokens = { > + { MEMORY_RECLAIM_SWAPPINESS, "swappiness=%d"}, > + { MEMORY_RECLAIM_SWAPPINESS_MAX, "swappiness=max"}, > + { MEMORY_RECLAIM_NULL, NULL }, > +}; > + > +int user_proactive_reclaim(char *buf, struct mem_cgroup *memcg, pg_data_t *pgdat) > +{ > + unsigned int nr_retries = MAX_RECLAIM_RETRIES; > + unsigned long nr_to_reclaim, nr_reclaimed = 0; > + int swappiness = -1; > + char *old_buf, *start; > + substring_t args[MAX_OPT_ARGS]; > + > + if (!buf || (!memcg && !pgdat)) > + return -EINVAL; > + > + buf = strstrip(buf); > + > + old_buf = buf; > + nr_to_reclaim = memparse(buf, &buf) / PAGE_SIZE; > + if (buf == old_buf) > + return -EINVAL; > + > + buf = strstrip(buf); > + > + while ((start = strsep(&buf, " ")) != NULL) { > + if (!strlen(start)) > + continue; > + switch (match_token(start, tokens, args)) { > + case MEMORY_RECLAIM_SWAPPINESS: > + if (match_int(&args[0], &swappiness)) > + return -EINVAL; > + if (swappiness < MIN_SWAPPINESS || > + swappiness > MAX_SWAPPINESS) > + return -EINVAL; > + break; > + case MEMORY_RECLAIM_SWAPPINESS_MAX: > + swappiness = SWAPPINESS_ANON_ONLY; > + break; > + default: > + return -EINVAL; > + } > + } > + > + while (nr_reclaimed < nr_to_reclaim) { > + /* Will converge on zero, but reclaim enforces a minimum */ > + unsigned long batch_size = (nr_to_reclaim - nr_reclaimed) / 4; > + unsigned long reclaimed; > + > + if (signal_pending(current)) > + return -EINTR; > + > + /* > + * This is the final attempt, drain percpu lru caches in the > + * hope of introducing more evictable pages. > + */ > + if (!nr_retries) > + lru_add_drain_all(); > + > + if (memcg) { > + unsigned int reclaim_options; > + > + reclaim_options = MEMCG_RECLAIM_MAY_SWAP | > + MEMCG_RECLAIM_PROACTIVE; > + reclaimed = try_to_free_mem_cgroup_pages(memcg, > + batch_size, GFP_KERNEL, > + reclaim_options, > + swappiness == -1 ? NULL : &swappiness); > + } else { > + return -EINVAL; > + } > + > + if (!reclaimed && !nr_retries--) > + return -EAGAIN; > + > + nr_reclaimed += reclaimed; > + } > + > + return 0; > +} > + > #endif Should this really be inside CONFIG_NUMA? It was moved from outside of CONFIG_NUMA where it's now called which results in a build failure if it's disabled. Or is there a stub missing? > > /** > -- > 2.39.5 > Regards, Klara Modin