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 507BEC77B7C for ; Mon, 23 Jun 2025 18:59:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C0B8B6B00B5; Mon, 23 Jun 2025 14:59:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B9B256B00B7; Mon, 23 Jun 2025 14:59:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9E7856B00B9; Mon, 23 Jun 2025 14:59:46 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 78FEB6B00B5 for ; Mon, 23 Jun 2025 14:59:46 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 414E61D78A9 for ; Mon, 23 Jun 2025 18:59:46 +0000 (UTC) X-FDA: 83587579572.27.0D1BEEC Received: from chocolate.cherry.relay.mailchannels.net (chocolate.cherry.relay.mailchannels.net [23.83.223.35]) by imf27.hostedemail.com (Postfix) with ESMTP id 1224240011 for ; Mon, 23 Jun 2025 18:59:43 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=stgolabs.net header.s=dreamhost header.b=hvTN30EZ; spf=pass (imf27.hostedemail.com: domain of dave@stgolabs.net designates 23.83.223.35 as permitted sender) smtp.mailfrom=dave@stgolabs.net; dmarc=none; arc=pass ("mailchannels.net:s=arc-2022:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1750705184; a=rsa-sha256; cv=pass; b=YbRlXnJFHhFg1bIe+2uffuGySNIcXzBRtuKOnV3Hd7esEHPFYRpuVf9RjlfxFEoV7JIIqr UmAjZUWW6qTRbLhU/Vh2Bq+GjFuXrm0MPH4UHRUj4S97be/f+n1moOdGdz+2eIHND9j6e3 eSMu5bl4Wty7hUy7d+0O18oBdwpTK5g= ARC-Authentication-Results: i=2; imf27.hostedemail.com; dkim=pass header.d=stgolabs.net header.s=dreamhost header.b=hvTN30EZ; spf=pass (imf27.hostedemail.com: domain of dave@stgolabs.net designates 23.83.223.35 as permitted sender) smtp.mailfrom=dave@stgolabs.net; dmarc=none; arc=pass ("mailchannels.net:s=arc-2022:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750705184; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=mt3lKtDUlqQmGfkV47DV+HkBDubWGgXlm4Qkq/4S8B0=; b=lWDqHfZiWzVu2O5zv78MFqRr+qdAv5sX2Hat7+dATn/mJKBG58u3vqZmB4qwrNC5zoBVtZ qIvTZH9WXdC0B8nwu9OiooVTn7Nl2LBxaukpTDiOIdnhFkeXoOaVEvJ8C3oyMLiYVQnv2L zHNXJ6QCi+5K34ygtFVrTOWorcGy6uM= X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id BC84F8C44E8; Mon, 23 Jun 2025 18:59:42 +0000 (UTC) Received: from pdx1-sub0-mail-a316.dreamhost.com (trex-green-9.trex.outbound.svc.cluster.local [100.100.179.195]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 52D228C43AA; Mon, 23 Jun 2025 18:59:42 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1750705182; a=rsa-sha256; cv=none; b=PlqQa34u3UZccgZc0QKXVKRr5YkKBOjGo4mea1yme7WqOqfgM/zUoO1RrsnAI6svgSgsgm LsU7TQBBB3oBexAx7GUFCncgoJGv4l4P9ykowNDs99RMVq1HRefKYsn4mtjuwvGgnMFPU4 fYwA6rQulFyE1klrK2IqoDibzpUiBsoMTCGhx5rYH3he9uK7NAfcApt61GeUsHoGOKsJkQ b7wNjEFTT4hiftnurDDpje1P+ehXWcrUHobhZZSsxUmHi7QnQqgvmd/U6eZd8gx1TUKSWC vKXI4lGr8kEptsyVa6LfUAXxoO0df/RlF3scLZ3GHQnuvhnZo6KHYz/xw+KBew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1750705182; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=mt3lKtDUlqQmGfkV47DV+HkBDubWGgXlm4Qkq/4S8B0=; b=8nWXneFgev4K728mW+/JIRQcTlyrgomERMm8JIjwjIv5inHF/MZ2zZiK+3fSluTZSt+G5k pQYEcR+10L/Rb9yZYNkdXEftXRZZpzcC8VpFfvL1qVLlvH2aR2Lf3l10usC+ntLj+L1rfk 9RqzqdQK8g/4HQnd5948EbiFIzTgtG5YghxZjs+5JQ6HBStNm7jVtMNH3CdbgzhAg1NXva w+uiUEN1nZii+xuG+D429T/4W7B052zmWefCsxUXCDU4nuA4xQEHndc90dXpodrow+a0xf zLnlwrvCqweeFlGeu+2t+VCcT945FTfaoj4M9ELMrksVNc084hoGewmuHMAhqQ== ARC-Authentication-Results: i=1; rspamd-679c59f89-d566l; auth=pass smtp.auth=dreamhost smtp.mailfrom=dave@stgolabs.net X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net X-MC-Relay: Bad X-MailChannels-SenderId: dreamhost|x-authsender|dave@stgolabs.net X-MailChannels-Auth-Id: dreamhost X-Battle-Whistle: 54b253224de5bc78_1750705182640_19299719 X-MC-Loop-Signature: 1750705182640:151215034 X-MC-Ingress-Time: 1750705182640 Received: from pdx1-sub0-mail-a316.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.100.179.195 (trex/7.0.3); Mon, 23 Jun 2025 18:59:42 +0000 Received: from offworld.lan (syn-076-167-199-067.res.spectrum.com [76.167.199.67]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dave@stgolabs.net) by pdx1-sub0-mail-a316.dreamhost.com (Postfix) with ESMTPSA id 4bQy7K4XFMzHx; Mon, 23 Jun 2025 11:59:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1750705182; bh=mt3lKtDUlqQmGfkV47DV+HkBDubWGgXlm4Qkq/4S8B0=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=hvTN30EZtlW/Q3gnfxaPAsszTKCf+xmFzaEwQrq+K/3Bu+8wvoDTefvht5/etFolg NuKKIPOshZo2ytNFd4kCusbzok59BQLTaXeiwzX4NTZv2HM+Dd54O4bOhFaYwZwU/O M0akVsnMYAC/QhPH+tNiK5VPAgwWHKGGSy0Q8p6cmwuhTe4aFG1k8+Mg3+Mce819Me 73bZUBuFReHIdDK2DkiIwZfKYCvvys+CWpXpgSMNQ/dG81RT7sqyfCpvqr/cSp0wzM GXzD7n/MLkvRBKqG/DFUUuNGiM/pMOMsJJ2yBKi+2b65pks467DpTgm1qQlVxgqPWG 9myJkyWmPWXAQ== From: Davidlohr Bueso To: akpm@linux-foundation.org Cc: 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, dave@stgolabs.net Subject: [PATCH 2/4] mm/memcg: make memory.reclaim interface generic Date: Mon, 23 Jun 2025 11:58:49 -0700 Message-Id: <20250623185851.830632-3-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250623185851.830632-1-dave@stgolabs.net> References: <20250623185851.830632-1-dave@stgolabs.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: ffbw4ww4ib5o5phscwpe4syzu39wskre X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 1224240011 X-Rspam-User: X-HE-Tag: 1750705183-420355 X-HE-Meta: U2FsdGVkX19wie0cCZZfYLkaob/FPHk/LgOKZlHfzesyVOZ2X+IFAAR89O/gLC2hK9PxNzxHIcSJwO7w+av5c+SKsPs5d1eoBwo+sPTJ12Ip/O0OgI2dUbIjIpGad/U9M7QnDhNm8TpoN9s0gQ5yG94ipcw8HBush6eQ/CqLgsMmIbYE0RS5kyyCmqq3ptkg0HZz5mGS9G/Ni6cFkBUwcaUoKhVQ+icHy4p9krE5bw094Y9spvrlteDwXWKw/pbSsywLf4kqr9OpqgKq6J38eJGySusyZIuHh1DmnRmFvInP1hByoZm8mwoOr4o0YwZhJaJOZzA5kcPRxYFe1Kv9ppxCrJwhzCpmQYSD+gcxdGAoM0kHOuiNllyMLzwtoXrzV2Uj4QByhDGBdaOsgTaOyN6PbyKIxRHNw8ZR32EgjQh2kkyMt7rFc6odbM2zzRlFg5J+n3fxg/YtMSfzsFw+q+hWGCSvWFagrRsyfa92ed5hmD2mmxSpw+Sed0GLa7DecFftBa1BEb+x3SubdnqNSiNwdtvt8Ah8+UeHTtYbtFlhIBJE4FNGdxtngTNlKzrEsAWpa8jJHOqJMU/T4bdH6igPWnB+xu0PVqs5Bj6KJqeVcVbjwF822CZwMH6UOuFaYeZfYScDMmi2+OcuMe5wvXIQofJNGtoZy+q3QhF/DHnJtR9vv/TZLSyFYhcZcstzHosbWLHqRoxI/6IEYN+D98RGt9VpIRy9m2Rjw+uT22FjZpSCO6QXwT8WPUqQ+pHwiDqiXAE69GDKUfni9ID5p491SvYSgG+xm1yzfF+vcwfCSb/HJa0bWtL7RgbjHZ5J8UhR8qj4Qn2pvpiDz5aR+HgRHg6cMNibJypmnXIa+iJzizpErJhTaO5v2D/mIxLVhTlo86zOxrLsRbFEFA6KwNfwuNltV0olzZkr5wZnfretqGR/snmwiVNAmktmC2KMKTsn48L072uJ5SsMNio tIw== 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: 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); + 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 /** -- 2.39.5