linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yajun Deng <yajun.deng@linux.dev>
To: david@redhat.com, osalvador@suse.de, gregkh@linuxfoundation.org,
	rafael@kernel.org, akpm@linux-foundation.org,
	willy@infradead.org
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, Yajun Deng <yajun.deng@linux.dev>
Subject: [PATCH] mmzone: Introduce for_each_populated_zone_pgdat()
Date: Mon, 24 Apr 2023 11:07:56 +0800	[thread overview]
Message-ID: <20230424030756.1795926-1-yajun.deng@linux.dev> (raw)

Instead of define an index and determining if the zone has memory,
introduce for_each_populated_zone_pgdat() helper that can be used
to iterate over each populated zone in pgdat, and convert the most
obvious users to it.

This patch has no functional change.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
---
 drivers/base/memory.c  |  7 ++-----
 include/linux/mmzone.h |  8 ++++++++
 mm/compaction.c        | 36 +++++++-----------------------------
 mm/page-writeback.c    |  8 ++------
 4 files changed, 19 insertions(+), 40 deletions(-)

diff --git a/drivers/base/memory.c b/drivers/base/memory.c
index b456ac213610..ad898b1c85c7 100644
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -656,7 +656,6 @@ static struct zone *early_node_zone_for_memory_block(struct memory_block *mem,
 	const unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;
 	struct zone *zone, *matching_zone = NULL;
 	pg_data_t *pgdat = NODE_DATA(nid);
-	int i;
 
 	/*
 	 * This logic only works for early memory, when the applicable zones
@@ -666,10 +665,8 @@ static struct zone *early_node_zone_for_memory_block(struct memory_block *mem,
 	 * zones that intersect with the memory block are actually applicable.
 	 * No need to look at the memmap.
 	 */
-	for (i = 0; i < MAX_NR_ZONES; i++) {
-		zone = pgdat->node_zones + i;
-		if (!populated_zone(zone))
-			continue;
+	for_each_populated_zone_pgdat(zone, pgdat, MAX_NR_ZONES) {
+
 		if (!zone_intersects(zone, start_pfn, nr_pages))
 			continue;
 		if (!matching_zone) {
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index a4889c9d4055..48e9f01c0b5d 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -1580,6 +1580,14 @@ extern struct zone *next_zone(struct zone *zone);
 			; /* do nothing */		\
 		else
 
+#define for_each_populated_zone_pgdat(zone, pgdat, max) \
+	for (zone = pgdat->node_zones;                  \
+	     zone < pgdat->node_zones + max;            \
+	     zone++)                                    \
+		if (!populated_zone(zone))		\
+			; /* do nothing */		\
+		else
+
 static inline struct zone *zonelist_zone(struct zoneref *zoneref)
 {
 	return zoneref->zone;
diff --git a/mm/compaction.c b/mm/compaction.c
index c8bcdea15f5f..863f10c7e510 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -375,12 +375,9 @@ static void __reset_isolation_suitable(struct zone *zone)
 
 void reset_isolation_suitable(pg_data_t *pgdat)
 {
-	int zoneid;
+	struct zone *zone;
 
-	for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
-		struct zone *zone = &pgdat->node_zones[zoneid];
-		if (!populated_zone(zone))
-			continue;
+	for_each_populated_zone_pgdat(zone, pgdat, MAX_NR_ZONES) {
 
 		/* Only flush if a full compaction finished recently */
 		if (zone->compact_blockskip_flush)
@@ -2046,14 +2043,10 @@ static unsigned int fragmentation_score_zone_weighted(struct zone *zone)
 static unsigned int fragmentation_score_node(pg_data_t *pgdat)
 {
 	unsigned int score = 0;
-	int zoneid;
+	struct zone *zone;
 
-	for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
-		struct zone *zone;
+	for_each_populated_zone_pgdat(zone, pgdat, MAX_NR_ZONES) {
 
-		zone = &pgdat->node_zones[zoneid];
-		if (!populated_zone(zone))
-			continue;
 		score += fragmentation_score_zone_weighted(zone);
 	}
 
@@ -2681,7 +2674,6 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order,
  */
 static void proactive_compact_node(pg_data_t *pgdat)
 {
-	int zoneid;
 	struct zone *zone;
 	struct compact_control cc = {
 		.order = -1,
@@ -2692,10 +2684,7 @@ static void proactive_compact_node(pg_data_t *pgdat)
 		.proactive_compaction = true,
 	};
 
-	for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
-		zone = &pgdat->node_zones[zoneid];
-		if (!populated_zone(zone))
-			continue;
+	for_each_populated_zone_pgdat(zone, pgdat, MAX_NR_ZONES) {
 
 		cc.zone = zone;
 
@@ -2712,7 +2701,6 @@ static void proactive_compact_node(pg_data_t *pgdat)
 static void compact_node(int nid)
 {
 	pg_data_t *pgdat = NODE_DATA(nid);
-	int zoneid;
 	struct zone *zone;
 	struct compact_control cc = {
 		.order = -1,
@@ -2722,12 +2710,7 @@ static void compact_node(int nid)
 		.gfp_mask = GFP_KERNEL,
 	};
 
-
-	for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
-
-		zone = &pgdat->node_zones[zoneid];
-		if (!populated_zone(zone))
-			continue;
+	for_each_populated_zone_pgdat(zone, pgdat, MAX_NR_ZONES) {
 
 		cc.zone = zone;
 
@@ -2823,15 +2806,10 @@ static inline bool kcompactd_work_requested(pg_data_t *pgdat)
 
 static bool kcompactd_node_suitable(pg_data_t *pgdat)
 {
-	int zoneid;
 	struct zone *zone;
 	enum zone_type highest_zoneidx = pgdat->kcompactd_highest_zoneidx;
 
-	for (zoneid = 0; zoneid <= highest_zoneidx; zoneid++) {
-		zone = &pgdat->node_zones[zoneid];
-
-		if (!populated_zone(zone))
-			continue;
+	for_each_populated_zone_pgdat(zone, pgdat, highest_zoneidx + 1) {
 
 		if (compaction_suitable(zone, pgdat->kcompactd_max_order, 0,
 					highest_zoneidx) == COMPACT_CONTINUE)
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index db7943999007..9a7bcf8fdfd5 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -272,13 +272,9 @@ static void wb_min_max_ratio(struct bdi_writeback *wb,
 static unsigned long node_dirtyable_memory(struct pglist_data *pgdat)
 {
 	unsigned long nr_pages = 0;
-	int z;
+	struct zone *zone;
 
-	for (z = 0; z < MAX_NR_ZONES; z++) {
-		struct zone *zone = pgdat->node_zones + z;
-
-		if (!populated_zone(zone))
-			continue;
+	for_each_populated_zone_pgdat(zone, pgdat, MAX_NR_ZONES) {
 
 		nr_pages += zone_page_state(zone, NR_FREE_PAGES);
 	}
-- 
2.25.1


             reply	other threads:[~2023-04-24  3:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-24  3:07 Yajun Deng [this message]
2023-04-24  3:50 ` [PATCH] mmzone: Introduce for_each_populated_zone_pgdat() Matthew Wilcox
2023-04-24 21:58   ` Andrew Morton
2023-04-25  3:23     ` Matthew Wilcox
2023-04-25  5:51     ` Huang, Ying
2023-04-25  6:27     ` Yajun Deng
2023-04-25  6:38     ` Yajun Deng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230424030756.1795926-1-yajun.deng@linux.dev \
    --to=yajun.deng@linux.dev \
    --cc=akpm@linux-foundation.org \
    --cc=david@redhat.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=osalvador@suse.de \
    --cc=rafael@kernel.org \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).