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 7BDE9C369A1 for ; Wed, 9 Apr 2025 07:07:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5A5DE6B013D; Wed, 9 Apr 2025 03:07:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 556566B013E; Wed, 9 Apr 2025 03:07:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3F7286B013F; Wed, 9 Apr 2025 03:07:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 1B7926B013D for ; Wed, 9 Apr 2025 03:07:08 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 6AE7CB88F5 for ; Wed, 9 Apr 2025 07:07:08 +0000 (UTC) X-FDA: 83313623736.19.1F5BE49 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) by imf25.hostedemail.com (Postfix) with ESMTP id 8C7BBA0008 for ; Wed, 9 Apr 2025 07:07:06 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=i6+7EajL; spf=pass (imf25.hostedemail.com: domain of hezhongkun.hzk@bytedance.com designates 209.85.214.174 as permitted sender) smtp.mailfrom=hezhongkun.hzk@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744182426; 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=A2hnt1J4L3olEEgVeJYpHiMUYT2gnH0FfIQaw5NdEjY=; b=rSu3S6NA3Z5LdrAjGzYfAVhmXNR+94tD6gn9rsLSh9A+9dyQYQYiSVLJg9WjnqW1nKAvou eEWmGAmwvnonZ1OcktcGUhHvr6Osy+pWgO/ORsJkbJAii0yuifBP5ivT0hYvaC3c1FU/aG ZxyiUbuScoC/3LdVsAjVZADVsPjtOZM= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=i6+7EajL; spf=pass (imf25.hostedemail.com: domain of hezhongkun.hzk@bytedance.com designates 209.85.214.174 as permitted sender) smtp.mailfrom=hezhongkun.hzk@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744182426; a=rsa-sha256; cv=none; b=VW2VbizF3P+jCbi7woVGea8Sv8I/qrMQM8CjNzhlEf7HG0SyufvQO9JBjAKM5WXYCoJbq8 MJt6/xGe26YcsOCyGMMQK2XRoemquMQ1xN12RSUsNiOFMPu8UB0q5lC4BSzCamY+ecrVw/ 8vWAwKsjRRPIfBQMfZ0dQTo2smL3lLg= Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-22928d629faso65356055ad.3 for ; Wed, 09 Apr 2025 00:07:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1744182425; x=1744787225; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=A2hnt1J4L3olEEgVeJYpHiMUYT2gnH0FfIQaw5NdEjY=; b=i6+7EajLgiFeDLQ0+EO3HtyGThmEjWrEc0Wpl29WVZ4swZWHhku7AJKpoaEyKHChOq YDzo8audRiAXswReQhQCOgplcskBNO7CbNj3iMSyKMrXb7bMUdLCWOLJ3aXjIGYoXCWx i7lWDZKuRxCCJd+teIv7bY0XBsGjoa07CdDNECGd8R4yOPL+DD6XajeMA/ZZqnZxnCo7 uhfE8C/4EsAqYFgHi472b39EZe2ugqipDDWypdE7pG6xbKeYc5kow+6RoQJZpmjph0DI XdNVtqJ2G5EDdXSZUtw0qeSGKAferz/jjkaJRuYCDvKu2P8Gd3iRxxhBthtbPm7+cXkq PzEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744182425; x=1744787225; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=A2hnt1J4L3olEEgVeJYpHiMUYT2gnH0FfIQaw5NdEjY=; b=AorA8h2UBMdHF6opkwMzMs0FCgBb4jW564zi1WxxCej6sGUnVaZrIgTDiHV9IBCbuR kCH1Eq9sQyBDCR0A9CeanHmTl3RjOt8mL3Ofk8lBGjjzB+o6j8wj3YEOeqjTbYL8gKNV 6T1wQBUws3enPlEvHsTi1y5ayIsdkelgKxpYxFYiaISYyHcCTOwmRTExCYbc/piC7X3I verD0+DtCnmuYPE9eV7+Y8eXf9JQ53s5HJsgVt2ShwgZdeeXJr4lIeczCeAam2fmo/Jq NDstekcJkPlVqrMlXP8UWYKZI+duV8Io2Y6nqkOgBmPQqBHvaOnKxzvUxFlfSemBXEdV yUyA== X-Forwarded-Encrypted: i=1; AJvYcCXOTKgQ8Fn6MGcX0LrDoLoq5a2TtWqFmIipCcMYANuX9Bw1PBLqHW+IzqmTYWaL6P9aVXnAzN63Ow==@kvack.org X-Gm-Message-State: AOJu0YwlKz4cH4dj0jwgfqS9NyMCT7wzSnwAkkHms0XlefTEUN9nuHMi MmtF+gf67ITSs1Qgb1RakwPUlQfWK4TuQ8TwzF0CUP7M3K1lMoCG7XtEvCvh/74= X-Gm-Gg: ASbGncuW8nWV+b73SeAaTfaoMAOSrEAU7+4DfCj/sFDigSAhnwsLR74D9OwaX6Q/Fis ze9o/Ftz7wzAVl4t3h8ePL6gVsEvu70smAtGEYsmHk4LAynQx+zX6aKJ0s56Wfk8nRkEQuE7owW i0XLk4bhqyRJx1dbbPRBJ7UD2NoOzW7Fc7uk06/s/K6pgFqnsV3F1kyQHi+fLD+dLam3LPSPVNx l49HsMeTrDccAzeHN+8tcv7kSeGjhh1Hnt2S1W+3yHTThk/aTpmxtepiPYfJkj3NR5pfRak6uAt cVc+LZ9RMm4P3YTtDVaXGbG5k6ZY1YzCv5QB4cjUUY44NgkIlP4BeIFSzvkRT7AITQ== X-Google-Smtp-Source: AGHT+IEqzbVgFBQGm2kJbpgwtHwR6FDnzEvHZ2VCmuE1rmHyw8CkVPDDJbNjbPVqYOiqi6Mf2+tk+g== X-Received: by 2002:a17:903:22c6:b0:225:b718:4dff with SMTP id d9443c01a7336-22ac2c36a0amr33086715ad.53.1744182425144; Wed, 09 Apr 2025 00:07:05 -0700 (PDT) Received: from n37-069-081.byted.org ([115.190.40.13]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bb1d44800sm565754b3a.37.2025.04.09.00.07.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Apr 2025 00:07:04 -0700 (PDT) From: Zhongkun He To: akpm@linux-foundation.org Cc: hannes@cmpxchg.org, mhocko@suse.com, yosry.ahmed@linux.dev, muchun.song@linux.dev, yuzhao@google.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Zhongkun He Subject: [PATCH V3 2/3] mm: add max swappiness arg to lru_gen for anonymous memory only Date: Wed, 9 Apr 2025 15:06:19 +0800 Message-Id: X-Mailer: git-send-email 2.39.5 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 8C7BBA0008 X-Stat-Signature: kas6tw5shga7rcsxuttnbn1ysec7hart X-Rspam-User: X-Rspamd-Server: rspam12 X-HE-Tag: 1744182426-828889 X-HE-Meta: U2FsdGVkX1+k4p7CPGRUfBozIvIix2Bn6XpwoeTu7LHT85mO7+pCeVVUqoWxWWki9VeePPnMRyGfLrBeM/N4GP2SPq/8rKQAZmYUkjMf16ZnZUlMsm5OHGvb/zSYDZzZJqmiksnw+INsBFARDp5iH+AqtfwIOHVidTZmnJl00+524AlXLF0TjRhzGreARq6IRyVSbxRgVl4h1dQ+VS0UYu8XtL14jEVree3rJ9OPCAGYsjGzt+VeHpBpn6Rh9vpzJhkiDn+OBvM5Jo8eZIhXI6uW3aZEMhAErZnGlxnqm43O8sQIS7mwnBhjtOiejWBfQ8YelWbMoT9tEEsGrU6TsS3JI2etMsoH30HFfkjpCr4oJ0GTMKtaG//erlcnmwIon7XUm7mNKUPMDrif4Jr7aTaGr5n6d/mF1I6hkbI69vW2OuIk1XwGvwnmqfgevgJ3PKft7m9RJ+Gb5Suu3ZW1svhOZTGFos+4T9Wi8Hu/Ms3o9PToMYv3u5YpBuyla2eXH/0BOWWDNRMzM2BrXKKu2WSXI6PhX/Et4MoH6wlTZgxWyhqHy5qLQRkha1b6KW5RCW0Xs4ujC1SCYKIUUCnaZjC+l+N5Yj1lJDDqI5HZUpNpG9xEA8JIWvC3OHtrRabxM5YR7gdRuAJqP/baSOPta0JISYeigkRXsTXFpzXw0xug4LxYwjwWAxO72wdhscnUbl1u1U+MtEr2cUgKqVbTJRubjaQ1Kwi72lw+fZN4K3Kjtb0RdaGcPkcSUYD6ZdlMk7bcHOw7aD/wzl6wxYEJb5Mjzl7YaPaiOAEekGQub6iVfrcK0+VEY1Su4gv0IsZvlS8E1Lu5aphZeQdTTmyf/iu/z0mQFvEeS0t1MSXpwbHCJNzz2fIEemoilH8mYlwmOFZYkogxPW+ZDB4usV2Q7l2l+gTsJV3yHOTNVFm9QT9eMD0Xeq5gcmzGJBrnaKfELrd7YCC2JAFakvKJ3rq /JxKvDKA CmHOKxNAsyuP3w0hI3G9N0BRw1fFycxJbhBvvAtCcj982cgakvUsNbHTMUNOeZlFwGLBp+NrsGxIMCjSpgumcTTqmZeW2YEIY8ngAgnpYxkc/rfXJoFNMRT+5FuCb6ZQLERtazyyOAqqNP04H9cItEmP7dXjCMCEar4CvW9FYOVYDh50UfzsJ2LuO0tKkvqruM1U3tXAz9n8dgqiyE3B+3x4XS8vX8mqQ4rhKVUFBJnJnNGyPAwpp12s90j9hvaYLMAitHAsBLiLt7FhrcXiVcRdlcWeoLGBnhfE7I6V0sGP0Vib5nxebfJtJ5X5GHmx49/BYWjPkBFk/OZiabk19pyS3HY/QY4ZLhJfBiYoLPAF9zH8= 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: The MGLRU already supports reclaiming only from anonymous memory via the /sys/kernel/debug/lru_gen interface. Now, memory.reclaim also supports the swappiness=max parameter to enable reclaiming solely from anonymous memory. To unify the semantics of proactive reclaiming from anonymous folios, the max parameter is introduced. Additionally, the use of SWAPPINESS_ANON_ONLY in place of 'MAX_SWAPPINESS + 1' improves code clarity and makes the intention more explicit. Signed-off-by: Zhongkun He --- Documentation/admin-guide/mm/multigen_lru.rst | 5 ++-- mm/vmscan.c | 26 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Documentation/admin-guide/mm/multigen_lru.rst b/Documentation/admin-guide/mm/multigen_lru.rst index 33e068830497..9cb54b4ff5d9 100644 --- a/Documentation/admin-guide/mm/multigen_lru.rst +++ b/Documentation/admin-guide/mm/multigen_lru.rst @@ -151,8 +151,9 @@ generations less than or equal to ``min_gen_nr``. ``min_gen_nr`` should be less than ``max_gen_nr-1``, since ``max_gen_nr`` and ``max_gen_nr-1`` are not fully aged (equivalent to the active list) and therefore cannot be evicted. ``swappiness`` -overrides the default value in ``/proc/sys/vm/swappiness``. -``nr_to_reclaim`` limits the number of pages to evict. +overrides the default value in ``/proc/sys/vm/swappiness`` and the valid +range is [0-200, max], with max being exclusively used for the reclamation +of anonymous memory. ``nr_to_reclaim`` limits the number of pages to evict. A typical use case is that a job scheduler runs this command before it tries to land a new job on a server. If it fails to materialize enough diff --git a/mm/vmscan.c b/mm/vmscan.c index c99a6a48d0bc..18a175752b57 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2697,8 +2697,11 @@ static bool should_clear_pmd_young(void) READ_ONCE((lruvec)->lrugen.min_seq[LRU_GEN_FILE]), \ } +#define max_evictable_type(swappiness) \ + ((swappiness) != SWAPPINESS_ANON_ONLY) + #define evictable_min_seq(min_seq, swappiness) \ - min((min_seq)[!(swappiness)], (min_seq)[(swappiness) <= MAX_SWAPPINESS]) + min((min_seq)[!(swappiness)], (min_seq)[max_evictable_type(swappiness)]) #define for_each_gen_type_zone(gen, type, zone) \ for ((gen) = 0; (gen) < MAX_NR_GENS; (gen)++) \ @@ -2706,7 +2709,7 @@ static bool should_clear_pmd_young(void) for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++) #define for_each_evictable_type(type, swappiness) \ - for ((type) = !(swappiness); (type) <= ((swappiness) <= MAX_SWAPPINESS); (type)++) + for ((type) = !(swappiness); (type) <= max_evictable_type(swappiness); (type)++) #define get_memcg_gen(seq) ((seq) % MEMCG_NR_GENS) #define get_memcg_bin(bin) ((bin) % MEMCG_NR_BINS) @@ -3857,7 +3860,7 @@ static bool inc_min_seq(struct lruvec *lruvec, int type, int swappiness) int hist = lru_hist_from_seq(lrugen->min_seq[type]); int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); - if (type ? swappiness > MAX_SWAPPINESS : !swappiness) + if (type ? (swappiness == SWAPPINESS_ANON_ONLY) : !swappiness) goto done; /* prevent cold/hot inversion if the type is evictable */ @@ -5523,7 +5526,7 @@ static int run_cmd(char cmd, int memcg_id, int nid, unsigned long seq, if (swappiness < MIN_SWAPPINESS) swappiness = get_swappiness(lruvec, sc); - else if (swappiness > MAX_SWAPPINESS + 1) + else if (swappiness > SWAPPINESS_ANON_ONLY) goto done; switch (cmd) { @@ -5580,7 +5583,7 @@ static ssize_t lru_gen_seq_write(struct file *file, const char __user *src, while ((cur = strsep(&next, ",;\n"))) { int n; int end; - char cmd; + char cmd, swap_string[5]; unsigned int memcg_id; unsigned int nid; unsigned long seq; @@ -5591,13 +5594,22 @@ static ssize_t lru_gen_seq_write(struct file *file, const char __user *src, if (!*cur) continue; - n = sscanf(cur, "%c %u %u %lu %n %u %n %lu %n", &cmd, &memcg_id, &nid, - &seq, &end, &swappiness, &end, &opt, &end); + n = sscanf(cur, "%c %u %u %lu %n %4s %n %lu %n", &cmd, &memcg_id, &nid, + &seq, &end, swap_string, &end, &opt, &end); if (n < 4 || cur[end]) { err = -EINVAL; break; } + /* set by userspace for anonymous memory only */ + if (!strncmp("max", swap_string, sizeof("max"))) { + swappiness = SWAPPINESS_ANON_ONLY; + } else { + err = kstrtouint(swap_string, 0, &swappiness); + if (err) + break; + } + err = run_cmd(cmd, memcg_id, nid, seq, &sc, swappiness, opt); if (err) break; -- 2.39.5