From nobody Tue Dec 16 14:48:25 2025 Received: from mail-yw1-f177.google.com (mail-yw1-f177.google.com [209.85.128.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D3CD296BC9 for ; Fri, 5 Dec 2025 23:32:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764977544; cv=none; b=olM3IcPtDL+efC09Itmvl/TSzCgAcISn7IfmI31xiaWutkW4XSPUXiPXMZovqf13aJr/EXRRNX4BuufdZqKstbtI52NCatpYpaE27fDVv2tQMLdPjzvoZP1WfysO63J+mtJ6J8/McIKnm1QSL6TDTZUJMUMQeSGzpYk1JBUJhj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764977544; c=relaxed/simple; bh=cGKx/IzR2QlX7DyjCscTSxAapSYAfvPDDUbR+uoxqfI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IS1NWzlaKy6BbCOuD6uRZMsJsz/SDlhW2ZyPi/FG6vFRX5HKoh8hHXHIg/0nn0+Pxz7+/uJXSURtGQscCYrnGMsxqO3WCdqVGaI6DY7DU2RmhYAOKN54uoUICdL5936qqk26Zh00Z94BjfrVJ6JTDpugukBfk8qObLuarPXsWhc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gqURtGrJ; arc=none smtp.client-ip=209.85.128.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gqURtGrJ" Received: by mail-yw1-f177.google.com with SMTP id 00721157ae682-78c33f74b72so2179057b3.2 for ; Fri, 05 Dec 2025 15:32:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764977541; x=1765582341; darn=vger.kernel.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=3N6g0zC5PiFKht2Nr2Q2t2kJmA7KR7Ut4l5xQUtIjXQ=; b=gqURtGrJp/Z4d1BQ4jFPosbQQn9ylohOJiyEirDv8ZkerpqBKAkh1gQIwGWf+Zj3UH E5cm2dVjeLosT+K2QlbFktoB5Ebwpsr6Q3JJuLG/Awe3nz54HRji6u1rJYpRkwbXT7qR 7410yxaMaIErMICZulMHKinVYh460RKbRipNpASMc7w3YWmQx2t0jDKQ/xXv5hSONGe6 6KeuRg88Ac/hCnQomTNI8Uuehffs0ER4QT0ps4RkJd8pKoxLutnrXJdiq7riD+RDNOZd cfmfeMRKYb4zQ8lrDdgC8B9qPdnTTNZJitCcmeP1tmSHYv/u+YfGucHm+vpmh5djxpJn M/7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764977541; x=1765582341; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3N6g0zC5PiFKht2Nr2Q2t2kJmA7KR7Ut4l5xQUtIjXQ=; b=RV8+oex3YwLp9mBDA/EgeYewApDiXDDiv6z5s+qrXN5M96rks7TmmrDaCwtDMSJT7o uEcK5s/fE0VQkw0dZaFQoBIBkKM90pEbOkZu4/LellK0pBDPFkCADAytegM+QUi4b0RB FQXKHs+ILY3rbAHkoE9GNt+F2L3sQnl/Gu3Ebt57QmqKf+rfzK9+sr1I4l5ulfsfacrR uYr7pgO4fF+8Hi84hyO3z6SWwfyk1SkkpPxujSr1zHsft+fpR8gc5Id/qznbbfXqOyP7 wccj1xBRCPMLPSrMneVeBtyyWlMztuXHE+6A1Er9DqYDP2ygOigxjdmNlKxTecV0hzdW noEw== X-Forwarded-Encrypted: i=1; AJvYcCXEUh6fpkGA2jO62VOXh4Iw1aQx078fInKPqIQneypMulWrTF2AvvI4T3YhCPR4HoghRqjw3Z3T5hP9Ncs=@vger.kernel.org X-Gm-Message-State: AOJu0YwFs/jqOFzNhxjdNjxSL5MPZadX1elB8rPgiq1ypugod6jM71+t B66c0dFY6ASStUnypmjg9WoiWgbTq9/uwE0Dl4BP9jGCHec4FM/svwNt X-Gm-Gg: ASbGncvo0/1kFz5jbHbb2gvBrYYJ0g1pFKa/1W3qQOkzf9Hw/zsATOK1Ku/lBJHfqcy P1GH6/HUzgVrl4dF1clwn6ak0v5ZCarhGNrcEtpreKJNqYYf3KOxHVLGlUTGW5CaroobvbMlzAh rD+BtLmlNf0P2r6IofQrqTlMuUUOB+gRWkfITXNIEr0nKz+HNKEOg+QBE4l0EQoc13QV4TcHn5U XPUwKnkDMcmhpc7WzHSHnz9PMLpGs/tFtSY6A1lcP5xpi/QnS+4EC0Y2DNdTOy1yRnRxtyDtQeF 6XAtUX35ofkLIjmERqxQJnJwIULMnexJ9HBzoGw99oUQU08y3b6QzLLcxZV6RJ2oEYw1pB4Sj9Q mx7fkMHSyTIpYARVnhbablCnTNhy2gGtLyF00CFiYokGwwsZvacdvts2S0MBV9+z39xtQn3y5zI oW36dnha15nVnNoPCm7CIbkQ== X-Google-Smtp-Source: AGHT+IFmgCP1RSAK298BihptrWQmwFYdSfIHOvG0eN4y9QhPWKLGCFw1/fHkvkeHjYBbQ3rzbZ6AkA== X-Received: by 2002:a05:690c:c91:b0:788:bda:47ea with SMTP id 00721157ae682-78c33afae87mr8349447b3.5.1764977541051; Fri, 05 Dec 2025 15:32:21 -0800 (PST) Received: from localhost ([2a03:2880:25ff:4a::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-78c1b790577sm21692767b3.47.2025.12.05.15.32.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Dec 2025 15:32:20 -0800 (PST) From: Joshua Hahn To: Cc: "Liam R. Howlett" , Andrew Morton , Axel Rasmussen , Brendan Jackman , David Hildenbrand , Johannes Weiner , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Qi Zheng , Shakeel Butt , Suren Baghdasaryan , Vlastimil Babka , Wei Xu , Yuanchu Xie , Zi Yan , linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC LPC2025 PATCH 2/4] mm/vmscan/page_alloc: Remove node_reclaim Date: Fri, 5 Dec 2025 15:32:13 -0800 Message-ID: <20251205233217.3344186-3-joshua.hahnjy@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251205233217.3344186-1-joshua.hahnjy@gmail.com> References: <20251205233217.3344186-1-joshua.hahnjy@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" node_reclaim() is currently only called when the zone_reclaim_mode sysctl is set, during get_page_from_freelist if the current node is full. With the zone_reclaim_mode sysctl being deprecated later in the series, there are no more callsites for node_reclaim. Remove node_reclaim and its associated return values NODE_RECLAIM_{NOSCAN, FULL, SOME, SUCCESS}, as well as the zone_reclaim_{success, failed} vmstat items. We can also remove zone_allows_reclaim, since with node_reclaim_enabled always returning false, it will never get evaluated. Signed-off-by: Joshua Hahn --- include/linux/vm_event_item.h | 4 --- mm/internal.h | 11 ------ mm/page_alloc.c | 34 ------------------ mm/vmscan.c | 67 ----------------------------------- mm/vmstat.c | 4 --- 5 files changed, 120 deletions(-) diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index 92f80b4d69a6..2520200b65f0 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -53,10 +53,6 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, PGSCAN_FILE, PGSTEAL_ANON, PGSTEAL_FILE, -#ifdef CONFIG_NUMA - PGSCAN_ZONE_RECLAIM_SUCCESS, - PGSCAN_ZONE_RECLAIM_FAILED, -#endif PGINODESTEAL, SLABS_SCANNED, KSWAPD_INODESTEAL, KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY, PAGEOUTRUN, PGROTATED, diff --git a/mm/internal.h b/mm/internal.h index 04c307ee33ae..743fcebe53a8 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -1196,24 +1196,13 @@ static inline void mminit_verify_zonelist(void) } #endif /* CONFIG_DEBUG_MEMORY_INIT */ =20 -#define NODE_RECLAIM_NOSCAN -2 -#define NODE_RECLAIM_FULL -1 -#define NODE_RECLAIM_SOME 0 -#define NODE_RECLAIM_SUCCESS 1 - #ifdef CONFIG_NUMA extern int node_reclaim_mode; =20 -extern int node_reclaim(struct pglist_data *, gfp_t, unsigned int); extern int find_next_best_node(int node, nodemask_t *used_node_mask); #else #define node_reclaim_mode 0 =20 -static inline int node_reclaim(struct pglist_data *pgdat, gfp_t mask, - unsigned int order) -{ - return NODE_RECLAIM_NOSCAN; -} static inline int find_next_best_node(int node, nodemask_t *used_node_mask) { return NUMA_NO_NODE; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d0f026ec10b6..010a035e81bd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3684,17 +3684,6 @@ static inline bool zone_watermark_fast(struct zone *= z, unsigned int order, =20 #ifdef CONFIG_NUMA int __read_mostly node_reclaim_distance =3D RECLAIM_DISTANCE; - -static bool zone_allows_reclaim(struct zone *local_zone, struct zone *zone) -{ - return node_distance(zone_to_nid(local_zone), zone_to_nid(zone)) <=3D - node_reclaim_distance; -} -#else /* CONFIG_NUMA */ -static bool zone_allows_reclaim(struct zone *local_zone, struct zone *zone) -{ - return true; -} #endif /* CONFIG_NUMA */ =20 /* @@ -3868,8 +3857,6 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int o= rder, int alloc_flags, if (!zone_watermark_fast(zone, order, mark, ac->highest_zoneidx, alloc_flags, gfp_mask)) { - int ret; - if (cond_accept_memory(zone, order, alloc_flags)) goto try_this_zone; =20 @@ -3885,27 +3872,6 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int = order, int alloc_flags, BUILD_BUG_ON(ALLOC_NO_WATERMARKS < NR_WMARK); if (alloc_flags & ALLOC_NO_WATERMARKS) goto try_this_zone; - - if (!node_reclaim_enabled() || - !zone_allows_reclaim(zonelist_zone(ac->preferred_zoneref), zone)) - continue; - - ret =3D node_reclaim(zone->zone_pgdat, gfp_mask, order); - switch (ret) { - case NODE_RECLAIM_NOSCAN: - /* did not scan */ - continue; - case NODE_RECLAIM_FULL: - /* scanned but unreclaimable */ - continue; - default: - /* did we reclaim enough */ - if (zone_watermark_ok(zone, order, mark, - ac->highest_zoneidx, alloc_flags)) - goto try_this_zone; - - continue; - } } =20 try_this_zone: diff --git a/mm/vmscan.c b/mm/vmscan.c index 3b85652a42b9..d07acd76fdea 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -7537,13 +7537,6 @@ module_init(kswapd_init) */ int node_reclaim_mode __read_mostly; =20 -/* - * Priority for NODE_RECLAIM. This determines the fraction of pages - * of a node considered for each zone_reclaim. 4 scans 1/16th of - * a zone. - */ -#define NODE_RECLAIM_PRIORITY 4 - /* * Percentage of pages in a zone that must be unmapped for node_reclaim to * occur. @@ -7646,66 +7639,6 @@ static unsigned long __node_reclaim(struct pglist_da= ta *pgdat, gfp_t gfp_mask, return sc->nr_reclaimed; } =20 -int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int o= rder) -{ - int ret; - /* Minimum pages needed in order to stay on node */ - const unsigned long nr_pages =3D 1 << order; - struct scan_control sc =3D { - .nr_to_reclaim =3D max(nr_pages, SWAP_CLUSTER_MAX), - .gfp_mask =3D current_gfp_context(gfp_mask), - .order =3D order, - .priority =3D NODE_RECLAIM_PRIORITY, - .may_writepage =3D !!(node_reclaim_mode & RECLAIM_WRITE), - .may_unmap =3D !!(node_reclaim_mode & RECLAIM_UNMAP), - .may_swap =3D 1, - .reclaim_idx =3D gfp_zone(gfp_mask), - }; - - /* - * Node reclaim reclaims unmapped file backed pages and - * slab pages if we are over the defined limits. - * - * A small portion of unmapped file backed pages is needed for - * file I/O otherwise pages read by file I/O will be immediately - * thrown out if the node is overallocated. So we do not reclaim - * if less than a specified percentage of the node is used by - * unmapped file backed pages. - */ - if (node_pagecache_reclaimable(pgdat) <=3D pgdat->min_unmapped_pages && - node_page_state_pages(pgdat, NR_SLAB_RECLAIMABLE_B) <=3D - pgdat->min_slab_pages) - return NODE_RECLAIM_FULL; - - /* - * Do not scan if the allocation should not be delayed. - */ - if (!gfpflags_allow_blocking(gfp_mask) || (current->flags & PF_MEMALLOC)) - return NODE_RECLAIM_NOSCAN; - - /* - * Only run node reclaim on the local node or on nodes that do not - * have associated processors. This will favor the local processor - * over remote processors and spread off node memory allocations - * as wide as possible. - */ - if (node_state(pgdat->node_id, N_CPU) && pgdat->node_id !=3D numa_node_id= ()) - return NODE_RECLAIM_NOSCAN; - - if (test_and_set_bit_lock(PGDAT_RECLAIM_LOCKED, &pgdat->flags)) - return NODE_RECLAIM_NOSCAN; - - ret =3D __node_reclaim(pgdat, gfp_mask, nr_pages, &sc) >=3D nr_pages; - clear_bit_unlock(PGDAT_RECLAIM_LOCKED, &pgdat->flags); - - if (ret) - count_vm_event(PGSCAN_ZONE_RECLAIM_SUCCESS); - else - count_vm_event(PGSCAN_ZONE_RECLAIM_FAILED); - - return ret; -} - enum { MEMORY_RECLAIM_SWAPPINESS =3D 0, MEMORY_RECLAIM_SWAPPINESS_MAX, diff --git a/mm/vmstat.c b/mm/vmstat.c index 65de88cdf40e..3564bc62325a 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1349,10 +1349,6 @@ const char * const vmstat_text[] =3D { [I(PGSTEAL_ANON)] =3D "pgsteal_anon", [I(PGSTEAL_FILE)] =3D "pgsteal_file", =20 -#ifdef CONFIG_NUMA - [I(PGSCAN_ZONE_RECLAIM_SUCCESS)] =3D "zone_reclaim_success", - [I(PGSCAN_ZONE_RECLAIM_FAILED)] =3D "zone_reclaim_failed", -#endif [I(PGINODESTEAL)] =3D "pginodesteal", [I(SLABS_SCANNED)] =3D "slabs_scanned", [I(KSWAPD_INODESTEAL)] =3D "kswapd_inodesteal", --=20 2.47.3