linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin
@ 2025-09-26 15:55 Baoquan He
  2025-09-26 15:55 ` [PATCH v2 1/1] " Baoquan He
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Baoquan He @ 2025-09-26 15:55 UTC (permalink / raw)
  To: linux-mm
  Cc: akpm, chrisl, kasong, youngjun.park, aaron.lu, baohua, shikemeng,
	nphamcs, Baoquan He

The detailed information about patch can be found in patch log. Here I
would like to add testing related information.

 On my system, it has 8 nodes, 64G RAM. So I created 4 zram devices of
size 16G. Doing this because I can't find system with 4 free SSD disk
which can be used as swap devices. And nowadays, swap, zram become more
and more popular, even default setup, so I create zram to test patch.
# free -h
               total        used        free      shared  buff/cache   available
Mem:            62Gi       1.6Gi        61Gi       4.8Mi       276Mi        61Gi
Swap:           63Gi          0B        63Gi

1) create zram
#My fedora will add one zram0 by default, I reset it because the zram size if not enough
swapoff /dev/zram0 

cd /sys/block/
echo 1 > zram0/reset
cat /sys/class/zram-control/hot_add
cat /sys/class/zram-control/hot_add
cat /sys/class/zram-control/hot_add
 
echo 16G > zram0/disksize 
echo 16G > zram1/disksize 
echo 16G > zram2/disksize
echo 16G > zram3/disksize 
 
mkswap /dev/zram0
mkswap /dev/zram1
mkswap /dev/zram2
mkswap /dev/zram3
 
swapon /dev/zram0
swapon /dev/zram1
swapon /dev/zram2
swapon /dev/zram3

2) Create memcg with 4G (this avoids noise from other anon process in system)
cd /sys/fs/cgroup/
mkdir testing
echo 4G > testing/memory.max
echo 3G > testing/memory.high

3) Run usemem in memcg
cgexec -g memory:testing ~/vm-scalability/usemem --init-time -O -y -x -n 31 2G > ~/vm-scalability/temp.txt

The usemem output is not easy to understand, I will attach my draft
script in thread for easing result collecting and statistics.

Changelog:
v1->v2:
- Remove Documentation/admin-guide/mm/swap_numa.rst;
- Add back mistakenly removed lockdep_assert_held() line;
- Remove the unneeded code comment in _enable_swap_info().
  Thanks a lot for careful reviewing from Chris, YoungJun and Kairui.

Baoquan He (1):
  mm/swapfile.c: select the swap device with default priority round
    robin

 Documentation/admin-guide/mm/swap_numa.rst |  78 ---------------
 include/linux/swap.h                       |  11 +--
 mm/swapfile.c                              | 109 +++------------------
 3 files changed, 16 insertions(+), 182 deletions(-)
 delete mode 100644 Documentation/admin-guide/mm/swap_numa.rst

-- 
2.41.0



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-26 15:55 [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin Baoquan He
@ 2025-09-26 15:55 ` Baoquan He
  2025-09-27  7:56   ` kernel test robot
  2025-09-27 17:14   ` kernel test robot
  2025-09-26 16:02 ` [PATCH v2 0/1] " Baoquan He
  2025-09-27  0:14 ` Baoquan He
  2 siblings, 2 replies; 8+ messages in thread
From: Baoquan He @ 2025-09-26 15:55 UTC (permalink / raw)
  To: linux-mm
  Cc: akpm, chrisl, kasong, youngjun.park, aaron.lu, baohua, shikemeng,
	nphamcs, Baoquan He

Currently, on system with multiple swap devices, swap allocation will
select one swap device according to priority. The swap device with the
highest priority will be chosen to allocate firstly.

People can specify a priority from 0 to 32767 when swapon a swap device,
or the system will set it from -2 then downwards by default. Meanwhile,
on NUMA system, the swap device with node_id will be considered first
on that NUMA node of the node_id.

In the current code, an array of plist, swap_avail_heads[nid], is used
to organize swap devices on each NUMA node. For each NUMA node, there
is a plist organizing all swap devices. The 'prio' value in the plist
is the negated value of the device's priority due to plist being sorted
from low to high. The swap device owning one node_id will be promoted to
the front position on that NUMA node, then other swap devices are put in
order of their default priority.

E.g I got a system with 8 NUMA nodes, and I setup 4 zram partition as
swap devices.

Current behaviour:
their priorities will be(note that -1 is skipped):
NAME       TYPE      SIZE USED PRIO
/dev/zram0 partition  16G   0B   -2
/dev/zram1 partition  16G   0B   -3
/dev/zram2 partition  16G   0B   -4
/dev/zram3 partition  16G   0B   -5

And their positions in the 8 swap_avail_lists[nid] will be:
swap_avail_lists[0]: /* node 0's available swap device list */
zram0   -> zram1   -> zram2   -> zram3
prio:1     prio:3     prio:4     prio:5
swap_avali_lists[1]: /* node 1's available swap device list */
zram1   -> zram0   -> zram2   -> zram3
prio:1     prio:2     prio:4     prio:5
swap_avail_lists[2]: /* node 2's available swap device list */
zram2   -> zram0   -> zram1   -> zram3
prio:1     prio:2     prio:3     prio:5
swap_avail_lists[3]: /* node 3's available swap device list */
zram3   -> zram0   -> zram1   -> zram2
prio:1     prio:2     prio:3     prio:4
swap_avail_lists[4-7]: /* node 4,5,6,7's available swap device list */
zram0   -> zram1   -> zram2   -> zram3
prio:2     prio:3     prio:4     prio:5

The adjustment for swap device with node_id intended to decrease the
pressure of lock contention for one swap device by taking different
swap device on different node. The adjustment was introduced in commit
a2468cc9bfdf ("swap: choose swap device according to numa node").
However, the adjustment is a little coarse-grained. On the node, the swap
device sharing the node's id will always be selected firstly by node's CPUs
until exhausted, then next one. And on other nodes where no swap device
shares its node id, swap device with priority '-2' will be selected firstly
until exhausted, then next with priority '-3'.

This is the swapon output during the process high pressure vm-scability
test is being taken. It's clearly showing zram0 is heavily exploited until
exhausted.
===================================
[root@hp-dl385g10-03 ~]# swapon
NAME       TYPE      SIZE  USED PRIO
/dev/zram0 partition  16G 15.7G   -2
/dev/zram1 partition  16G  3.4G   -3
/dev/zram2 partition  16G  3.4G   -4
/dev/zram3 partition  16G  2.6G   -5

This is unreasonable because swap devices are assumed to have similar
accessing speed if no priority is specified when swapon. It's unfair and
doesn't make sense just because one swap device is swapped on firstly,
its priority will be higher than the one swapped on later.

So here change is made to select the swap device round robin if default
priority. In code, the plist array swap_avail_heads[nid] is replaced
with a plist swap_avail_head which reverts commit a2468cc9bfdf. Meanwhile,
on top of the revert, further change is taken to make any device w/o
specified priority get the same default priority '-1'. Surely, swap device
with specified priority are always put foremost, this is not impacted. If
you care about their different accessing speed, then use 'swapon -p xx' to
deploy priority for your swap devices.

New behaviour:

swap_avail_list: /* one global available swap device list */
zram0   -> zram1   -> zram2   -> zram3
prio:1     prio:1     prio:1     prio:1

This is the swapon output during the process high pressure vm-scability
being taken, all is selected round robin:
=======================================
[root@hp-dl385g10-03 linux]# swapon
NAME       TYPE      SIZE  USED PRIO
/dev/zram0 partition  16G 12.6G   -1
/dev/zram1 partition  16G 12.6G   -1
/dev/zram2 partition  16G 12.6G   -1
/dev/zram3 partition  16G 12.6G   -1

With the change, we can see about 18% efficiency promotion as below:

vm-scability test:
==================
Test with:
usemem --init-time -O -y -x -n 31 2G (4G memcg, zram as swap)
                           Before:          After:
System time:               637.92 s         526.74 s      (lower is better)
Sum Throughput:            3546.56 MB/s     4207.56 MB/s  (higher is better)
Single process Throughput: 114.40 MB/s      135.72 MB/s   (higher is better)
free latency:              10138455.99 us   6810119.01 us (low is better)

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 Documentation/admin-guide/mm/swap_numa.rst |  78 ---------------
 include/linux/swap.h                       |  11 +--
 mm/swapfile.c                              | 109 +++------------------
 3 files changed, 16 insertions(+), 182 deletions(-)
 delete mode 100644 Documentation/admin-guide/mm/swap_numa.rst

diff --git a/Documentation/admin-guide/mm/swap_numa.rst b/Documentation/admin-guide/mm/swap_numa.rst
deleted file mode 100644
index 2e630627bcee..000000000000
--- a/Documentation/admin-guide/mm/swap_numa.rst
+++ /dev/null
@@ -1,78 +0,0 @@
-===========================================
-Automatically bind swap device to numa node
-===========================================
-
-If the system has more than one swap device and swap device has the node
-information, we can make use of this information to decide which swap
-device to use in get_swap_pages() to get better performance.
-
-
-How to use this feature
-=======================
-
-Swap device has priority and that decides the order of it to be used. To make
-use of automatically binding, there is no need to manipulate priority settings
-for swap devices. e.g. on a 2 node machine, assume 2 swap devices swapA and
-swapB, with swapA attached to node 0 and swapB attached to node 1, are going
-to be swapped on. Simply swapping them on by doing::
-
-	# swapon /dev/swapA
-	# swapon /dev/swapB
-
-Then node 0 will use the two swap devices in the order of swapA then swapB and
-node 1 will use the two swap devices in the order of swapB then swapA. Note
-that the order of them being swapped on doesn't matter.
-
-A more complex example on a 4 node machine. Assume 6 swap devices are going to
-be swapped on: swapA and swapB are attached to node 0, swapC is attached to
-node 1, swapD and swapE are attached to node 2 and swapF is attached to node3.
-The way to swap them on is the same as above::
-
-	# swapon /dev/swapA
-	# swapon /dev/swapB
-	# swapon /dev/swapC
-	# swapon /dev/swapD
-	# swapon /dev/swapE
-	# swapon /dev/swapF
-
-Then node 0 will use them in the order of::
-
-	swapA/swapB -> swapC -> swapD -> swapE -> swapF
-
-swapA and swapB will be used in a round robin mode before any other swap device.
-
-node 1 will use them in the order of::
-
-	swapC -> swapA -> swapB -> swapD -> swapE -> swapF
-
-node 2 will use them in the order of::
-
-	swapD/swapE -> swapA -> swapB -> swapC -> swapF
-
-Similaly, swapD and swapE will be used in a round robin mode before any
-other swap devices.
-
-node 3 will use them in the order of::
-
-	swapF -> swapA -> swapB -> swapC -> swapD -> swapE
-
-
-Implementation details
-======================
-
-The current code uses a priority based list, swap_avail_list, to decide
-which swap device to use and if multiple swap devices share the same
-priority, they are used round robin. This change here replaces the single
-global swap_avail_list with a per-numa-node list, i.e. for each numa node,
-it sees its own priority based list of available swap devices. Swap
-device's priority can be promoted on its matching node's swap_avail_list.
-
-The current swap device's priority is set as: user can set a >=0 value,
-or the system will pick one starting from -1 then downwards. The priority
-value in the swap_avail_list is the negated value of the swap device's
-due to plist being sorted from low to high. The new policy doesn't change
-the semantics for priority >=0 cases, the previous starting from -1 then
-downwards now becomes starting from -2 then downwards and -1 is reserved
-as the promoted value. So if multiple swap devices are attached to the same
-node, they will all be promoted to priority -1 on that node's plist and will
-be used round robin before any other swap devices.
diff --git a/include/linux/swap.h b/include/linux/swap.h
index 3473e4247ca3..f72c8e5e0635 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -337,16 +337,7 @@ struct swap_info_struct {
 	struct work_struct discard_work; /* discard worker */
 	struct work_struct reclaim_work; /* reclaim worker */
 	struct list_head discard_clusters; /* discard clusters list */
-	struct plist_node avail_lists[]; /*
-					   * entries in swap_avail_heads, one
-					   * entry per node.
-					   * Must be last as the number of the
-					   * array is nr_node_ids, which is not
-					   * a fixed value so have to allocate
-					   * dynamically.
-					   * And it has to be an array so that
-					   * plist_for_each_* can work.
-					   */
+	struct plist_node avail_list;   /* entry in swap_avail_head */
 };
 
 static inline swp_entry_t page_swap_entry(struct page *page)
diff --git a/mm/swapfile.c b/mm/swapfile.c
index b4f3cc712580..bc1b9c847ff6 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -73,7 +73,7 @@ atomic_long_t nr_swap_pages;
 EXPORT_SYMBOL_GPL(nr_swap_pages);
 /* protected with swap_lock. reading in vm_swap_full() doesn't need lock */
 long total_swap_pages;
-static int least_priority = -1;
+#define DEF_SWAP_PRIO  -1
 unsigned long swapfile_maximum_size;
 #ifdef CONFIG_MIGRATION
 bool swap_migration_ad_supported;
@@ -84,12 +84,6 @@ static const char Unused_file[] = "Unused swap file entry ";
 static const char Bad_offset[] = "Bad swap offset entry ";
 static const char Unused_offset[] = "Unused swap offset entry ";
 
-/*
- * all active swap_info_structs
- * protected with swap_lock, and ordered by priority.
- */
-static PLIST_HEAD(swap_active_head);
-
 /*
  * all available (active, not full) swap_info_structs
  * protected with swap_avail_lock, ordered by priority.
@@ -102,7 +96,7 @@ static PLIST_HEAD(swap_active_head);
  * is held and the locking order requires swap_lock to be taken
  * before any swap_info_struct->lock.
  */
-static struct plist_head *swap_avail_heads;
+static PLIST_HEAD(swap_avail_head);
 static DEFINE_SPINLOCK(swap_avail_lock);
 
 static struct swap_info_struct *swap_info[MAX_SWAPFILES];
@@ -995,7 +989,6 @@ static unsigned long cluster_alloc_swap_entry(struct swap_info_struct *si, int o
 /* SWAP_USAGE_OFFLIST_BIT can only be set by this helper. */
 static void del_from_avail_list(struct swap_info_struct *si, bool swapoff)
 {
-	int nid;
 	unsigned long pages;
 
 	spin_lock(&swap_avail_lock);
@@ -1024,8 +1017,7 @@ static void del_from_avail_list(struct swap_info_struct *si, bool swapoff)
 			goto skip;
 	}
 
-	for_each_node(nid)
-		plist_del(&si->avail_lists[nid], &swap_avail_heads[nid]);
+	plist_del(&si->avail_list, &swap_avail_head);
 
 skip:
 	spin_unlock(&swap_avail_lock);
@@ -1034,7 +1026,6 @@ static void del_from_avail_list(struct swap_info_struct *si, bool swapoff)
 /* SWAP_USAGE_OFFLIST_BIT can only be cleared by this helper. */
 static void add_to_avail_list(struct swap_info_struct *si, bool swapon)
 {
-	int nid;
 	long val;
 	unsigned long pages;
 
@@ -1067,8 +1058,7 @@ static void add_to_avail_list(struct swap_info_struct *si, bool swapon)
 			goto skip;
 	}
 
-	for_each_node(nid)
-		plist_add(&si->avail_lists[nid], &swap_avail_heads[nid]);
+	plist_add(&si->avail_list, &swap_avail_head);
 
 skip:
 	spin_unlock(&swap_avail_lock);
@@ -1211,16 +1201,14 @@ static bool swap_alloc_fast(swp_entry_t *entry,
 static bool swap_alloc_slow(swp_entry_t *entry,
 			    int order)
 {
-	int node;
 	unsigned long offset;
 	struct swap_info_struct *si, *next;
 
-	node = numa_node_id();
 	spin_lock(&swap_avail_lock);
 start_over:
-	plist_for_each_entry_safe(si, next, &swap_avail_heads[node], avail_lists[node]) {
+	plist_for_each_entry_safe(si, next, &swap_avail_head, avail_list) {
 		/* Rotate the device and switch to a new cluster */
-		plist_requeue(&si->avail_lists[node], &swap_avail_heads[node]);
+		plist_requeue(&si->avail_list, &swap_avail_head);
 		spin_unlock(&swap_avail_lock);
 		if (get_swap_device_info(si)) {
 			offset = cluster_alloc_swap_entry(si, order, SWAP_HAS_CACHE);
@@ -1245,7 +1233,7 @@ static bool swap_alloc_slow(swp_entry_t *entry,
 		 * still in the swap_avail_head list then try it, otherwise
 		 * start over if we have not gotten any slots.
 		 */
-		if (plist_node_empty(&next->avail_lists[node]))
+		if (plist_node_empty(&si->avail_list))
 			goto start_over;
 	}
 	spin_unlock(&swap_avail_lock);
@@ -2535,44 +2523,18 @@ static int setup_swap_extents(struct swap_info_struct *sis, sector_t *span)
 	return generic_swapfile_activate(sis, swap_file, span);
 }
 
-static int swap_node(struct swap_info_struct *si)
-{
-	struct block_device *bdev;
-
-	if (si->bdev)
-		bdev = si->bdev;
-	else
-		bdev = si->swap_file->f_inode->i_sb->s_bdev;
-
-	return bdev ? bdev->bd_disk->node_id : NUMA_NO_NODE;
-}
-
 static void setup_swap_info(struct swap_info_struct *si, int prio,
 			    unsigned char *swap_map,
 			    struct swap_cluster_info *cluster_info,
 			    unsigned long *zeromap)
 {
-	int i;
-
-	if (prio >= 0)
-		si->prio = prio;
-	else
-		si->prio = --least_priority;
+	si->prio = prio;
 	/*
 	 * the plist prio is negated because plist ordering is
 	 * low-to-high, while swap ordering is high-to-low
 	 */
 	si->list.prio = -si->prio;
-	for_each_node(i) {
-		if (si->prio >= 0)
-			si->avail_lists[i].prio = -si->prio;
-		else {
-			if (swap_node(si) == i)
-				si->avail_lists[i].prio = 1;
-			else
-				si->avail_lists[i].prio = -si->prio;
-		}
-	}
+	si->avail_list.prio = -si->prio;
 	si->swap_map = swap_map;
 	si->cluster_info = cluster_info;
 	si->zeromap = zeromap;
@@ -2584,16 +2546,7 @@ static void _enable_swap_info(struct swap_info_struct *si)
 	total_swap_pages += si->pages;
 
 	assert_spin_locked(&swap_lock);
-	/*
-	 * both lists are plists, and thus priority ordered.
-	 * swap_active_head needs to be priority ordered for swapoff(),
-	 * which on removal of any swap_info_struct with an auto-assigned
-	 * (i.e. negative) priority increments the auto-assigned priority
-	 * of any lower-priority swap_info_structs.
-	 * swap_avail_head needs to be priority ordered for folio_alloc_swap(),
-	 * which allocates swap pages from the highest available priority
-	 * swap_info_struct.
-	 */
+
 	plist_add(&si->list, &swap_active_head);
 
 	/* Add back to available list */
@@ -2721,20 +2674,6 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
 	}
 	spin_lock(&p->lock);
 	del_from_avail_list(p, true);
-	if (p->prio < 0) {
-		struct swap_info_struct *si = p;
-		int nid;
-
-		plist_for_each_entry_continue(si, &swap_active_head, list) {
-			si->prio++;
-			si->list.prio--;
-			for_each_node(nid) {
-				if (si->avail_lists[nid].prio != 1)
-					si->avail_lists[nid].prio--;
-			}
-		}
-		least_priority++;
-	}
 	plist_del(&p->list, &swap_active_head);
 	atomic_long_sub(p->pages, &nr_swap_pages);
 	total_swap_pages -= p->pages;
@@ -2972,9 +2911,8 @@ static struct swap_info_struct *alloc_swap_info(void)
 	struct swap_info_struct *p;
 	struct swap_info_struct *defer = NULL;
 	unsigned int type;
-	int i;
 
-	p = kvzalloc(struct_size(p, avail_lists, nr_node_ids), GFP_KERNEL);
+	p = kvzalloc(sizeof(struct swap_info_struct), GFP_KERNEL);
 	if (!p)
 		return ERR_PTR(-ENOMEM);
 
@@ -3013,8 +2951,7 @@ static struct swap_info_struct *alloc_swap_info(void)
 	}
 	p->swap_extent_root = RB_ROOT;
 	plist_node_init(&p->list, 0);
-	for_each_node(i)
-		plist_node_init(&p->avail_lists[i], 0);
+	plist_node_init(&p->avail_list, 0);
 	p->flags = SWP_USED;
 	spin_unlock(&swap_lock);
 	if (defer) {
@@ -3282,9 +3219,6 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
 
-	if (!swap_avail_heads)
-		return -ENOMEM;
-
 	si = alloc_swap_info();
 	if (IS_ERR(si))
 		return PTR_ERR(si);
@@ -3465,7 +3399,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
 	}
 
 	mutex_lock(&swapon_mutex);
-	prio = -1;
+	prio = DEF_SWAP_PRIO;
 	if (swap_flags & SWAP_FLAG_PREFER)
 		prio = swap_flags & SWAP_FLAG_PRIO_MASK;
 	enable_swap_info(si, prio, swap_map, cluster_info, zeromap);
@@ -3904,7 +3838,6 @@ static bool __has_usable_swap(void)
 void __folio_throttle_swaprate(struct folio *folio, gfp_t gfp)
 {
 	struct swap_info_struct *si, *next;
-	int nid = folio_nid(folio);
 
 	if (!(gfp & __GFP_IO))
 		return;
@@ -3923,8 +3856,8 @@ void __folio_throttle_swaprate(struct folio *folio, gfp_t gfp)
 		return;
 
 	spin_lock(&swap_avail_lock);
-	plist_for_each_entry_safe(si, next, &swap_avail_heads[nid],
-				  avail_lists[nid]) {
+	plist_for_each_entry_safe(si, next, &swap_avail_head,
+				  avail_list) {
 		if (si->bdev) {
 			blkcg_schedule_throttle(si->bdev->bd_disk, true);
 			break;
@@ -3936,18 +3869,6 @@ void __folio_throttle_swaprate(struct folio *folio, gfp_t gfp)
 
 static int __init swapfile_init(void)
 {
-	int nid;
-
-	swap_avail_heads = kmalloc_array(nr_node_ids, sizeof(struct plist_head),
-					 GFP_KERNEL);
-	if (!swap_avail_heads) {
-		pr_emerg("Not enough memory for swap heads, swap is disabled\n");
-		return -ENOMEM;
-	}
-
-	for_each_node(nid)
-		plist_head_init(&swap_avail_heads[nid]);
-
 	swapfile_maximum_size = arch_max_swapfile_size();
 
 #ifdef CONFIG_MIGRATION
-- 
2.41.0



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-26 15:55 [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin Baoquan He
  2025-09-26 15:55 ` [PATCH v2 1/1] " Baoquan He
@ 2025-09-26 16:02 ` Baoquan He
  2025-09-26 16:04   ` Baoquan He
  2025-09-27  0:14 ` Baoquan He
  2 siblings, 1 reply; 8+ messages in thread
From: Baoquan He @ 2025-09-26 16:02 UTC (permalink / raw)
  To: linux-mm
  Cc: akpm, chrisl, kasong, youngjun.park, aaron.lu, baohua, shikemeng,
	nphamcs

[-- Attachment #1: Type: text/plain, Size: 2456 bytes --]

On 09/26/25 at 11:55pm, Baoquan He wrote:
> The detailed information about patch can be found in patch log. Here I
> would like to add testing related information.
> 
>  On my system, it has 8 nodes, 64G RAM. So I created 4 zram devices of
> size 16G. Doing this because I can't find system with 4 free SSD disk
> which can be used as swap devices. And nowadays, swap, zram become more
> and more popular, even default setup, so I create zram to test patch.
> # free -h
>                total        used        free      shared  buff/cache   available
> Mem:            62Gi       1.6Gi        61Gi       4.8Mi       276Mi        61Gi
> Swap:           63Gi          0B        63Gi
> 
> 1) create zram
> #My fedora will add one zram0 by default, I reset it because the zram size if not enough
> swapoff /dev/zram0 
> 
> cd /sys/block/
> echo 1 > zram0/reset
> cat /sys/class/zram-control/hot_add
> cat /sys/class/zram-control/hot_add
> cat /sys/class/zram-control/hot_add
>  
> echo 16G > zram0/disksize 
> echo 16G > zram1/disksize 
> echo 16G > zram2/disksize
> echo 16G > zram3/disksize 
>  
> mkswap /dev/zram0
> mkswap /dev/zram1
> mkswap /dev/zram2
> mkswap /dev/zram3
>  
> swapon /dev/zram0
> swapon /dev/zram1
> swapon /dev/zram2
> swapon /dev/zram3
> 
> 2) Create memcg with 4G (this avoids noise from other anon process in system)
> cd /sys/fs/cgroup/
> mkdir testing
> echo 4G > testing/memory.max
> echo 3G > testing/memory.high
> 
> 3) Run usemem in memcg
> cgexec -g memory:testing ~/vm-scalability/usemem --init-time -O -y -x -n 31 2G > ~/vm-scalability/temp.txt
> 
> The usemem output is not easy to understand, I will attach my draft
> script in thread for easing result collecting and statistics.

1)
Yon can fetch usemem from here:
https://kernel.googlesource.com/pub/scm/linux/kernel/git/wfg/vm-scalability

2) In attachments, usemem-calc.sh is used to analyze raw data from
usemem output, then output an unstandable result. You can copy below
commands to run ten times or how many times you want on usemem.

for i in {1..10}; do
    cgexec -g memory:testing ~/vm-scalability/usemem --init-time -O -y -x -n 31 2G > ~/vm-scalability/temp.txt
    ~/usemem-calc.sh ~/vm-scalability/temp.txt
    echo "The $i""th time to run usemem" 
done

3) Please keep all the output of usemem-calc.sh to a file, then use
result.sh to get an average value.

Any unclear part, please feel free to ask me privately or publicly in
thread.

Thanks
Baoquan

[-- Attachment #2: usemem-calc.sh --]
[-- Type: application/x-sh, Size: 1459 bytes --]

[-- Attachment #3: result.sh --]
[-- Type: application/x-sh, Size: 1678 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-26 16:02 ` [PATCH v2 0/1] " Baoquan He
@ 2025-09-26 16:04   ` Baoquan He
  0 siblings, 0 replies; 8+ messages in thread
From: Baoquan He @ 2025-09-26 16:04 UTC (permalink / raw)
  To: linux-mm
  Cc: akpm, chrisl, kasong, youngjun.park, aaron.lu, baohua, shikemeng,
	nphamcs

On 09/27/25 at 12:02am, Baoquan He wrote:
> On 09/26/25 at 11:55pm, Baoquan He wrote:
> > The detailed information about patch can be found in patch log. Here I
> > would like to add testing related information.
> > 
> >  On my system, it has 8 nodes, 64G RAM. So I created 4 zram devices of
> > size 16G. Doing this because I can't find system with 4 free SSD disk
> > which can be used as swap devices. And nowadays, swap, zram become more
> > and more popular, even default setup, so I create zram to test patch.
> > # free -h
> >                total        used        free      shared  buff/cache   available
> > Mem:            62Gi       1.6Gi        61Gi       4.8Mi       276Mi        61Gi
> > Swap:           63Gi          0B        63Gi
> > 
> > 1) create zram
> > #My fedora will add one zram0 by default, I reset it because the zram size if not enough
> > swapoff /dev/zram0 
> > 
> > cd /sys/block/
> > echo 1 > zram0/reset
> > cat /sys/class/zram-control/hot_add
> > cat /sys/class/zram-control/hot_add
> > cat /sys/class/zram-control/hot_add
> >  
> > echo 16G > zram0/disksize 
> > echo 16G > zram1/disksize 
> > echo 16G > zram2/disksize
> > echo 16G > zram3/disksize 
> >  
> > mkswap /dev/zram0
> > mkswap /dev/zram1
> > mkswap /dev/zram2
> > mkswap /dev/zram3
> >  
> > swapon /dev/zram0
> > swapon /dev/zram1
> > swapon /dev/zram2
> > swapon /dev/zram3
> > 
> > 2) Create memcg with 4G (this avoids noise from other anon process in system)
> > cd /sys/fs/cgroup/
> > mkdir testing
> > echo 4G > testing/memory.max
> > echo 3G > testing/memory.high
> > 
> > 3) Run usemem in memcg
> > cgexec -g memory:testing ~/vm-scalability/usemem --init-time -O -y -x -n 31 2G > ~/vm-scalability/temp.txt
> > 
> > The usemem output is not easy to understand, I will attach my draft
> > script in thread for easing result collecting and statistics.
> 
> 1)
> Yon can fetch usemem from here:
> https://kernel.googlesource.com/pub/scm/linux/kernel/git/wfg/vm-scalability
> 
> 2) In attachments, usemem-calc.sh is used to analyze raw data from
> usemem output, then output an unstandable result. You can copy below
                                ~~ understandable, sorry, typo
> commands to run ten times or how many times you want on usemem.
> 
> for i in {1..10}; do
>     cgexec -g memory:testing ~/vm-scalability/usemem --init-time -O -y -x -n 31 2G > ~/vm-scalability/temp.txt
>     ~/usemem-calc.sh ~/vm-scalability/temp.txt
>     echo "The $i""th time to run usemem" 
> done
> 
> 3) Please keep all the output of usemem-calc.sh to a file, then use
> result.sh to get an average value.
> 
> Any unclear part, please feel free to ask me privately or publicly in
> thread.
> 
> Thanks
> Baoquan





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-26 15:55 [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin Baoquan He
  2025-09-26 15:55 ` [PATCH v2 1/1] " Baoquan He
  2025-09-26 16:02 ` [PATCH v2 0/1] " Baoquan He
@ 2025-09-27  0:14 ` Baoquan He
  2 siblings, 0 replies; 8+ messages in thread
From: Baoquan He @ 2025-09-27  0:14 UTC (permalink / raw)
  To: linux-mm
  Cc: akpm, chrisl, kasong, youngjun.park, aaron.lu, baohua, shikemeng,
	nphamcs

On 09/26/25 at 11:55pm, Baoquan He wrote:
> The detailed information about patch can be found in patch log. Here I
> would like to add testing related information.
> 
>  On my system, it has 8 nodes, 64G RAM. So I created 4 zram devices of
> size 16G. Doing this because I can't find system with 4 free SSD disk
                                                        ~~~~~~~
This description is misleading, testing this patch needs multiple SSD
disks, 2 disks is enough, more is better. Sorry I was dizzy when posting
last night.

> which can be used as swap devices. And nowadays, swap, zram become more
> and more popular, even default setup, so I create zram to test patch.
> # free -h
>                total        used        free      shared  buff/cache   available
> Mem:            62Gi       1.6Gi        61Gi       4.8Mi       276Mi        61Gi
> Swap:           63Gi          0B        63Gi
> 
> 1) create zram
> #My fedora will add one zram0 by default, I reset it because the zram size if not enough
                                                                             ~s/if/is/
> swapoff /dev/zram0 
> 
> cd /sys/block/
> echo 1 > zram0/reset
> cat /sys/class/zram-control/hot_add
> cat /sys/class/zram-control/hot_add
> cat /sys/class/zram-control/hot_add
>  
> echo 16G > zram0/disksize 
> echo 16G > zram1/disksize 
> echo 16G > zram2/disksize
> echo 16G > zram3/disksize 
>  
> mkswap /dev/zram0
> mkswap /dev/zram1
> mkswap /dev/zram2
> mkswap /dev/zram3
>  
> swapon /dev/zram0
> swapon /dev/zram1
> swapon /dev/zram2
> swapon /dev/zram3
> 
> 2) Create memcg with 4G (this avoids noise from other anon process in system)
                                                        ~~~~~~~~~~~
                                      it should be anon mem regions from other process
> cd /sys/fs/cgroup/
> mkdir testing
> echo 4G > testing/memory.max
> echo 3G > testing/memory.high
> 
> 3) Run usemem in memcg
> cgexec -g memory:testing ~/vm-scalability/usemem --init-time -O -y -x -n 31 2G > ~/vm-scalability/temp.txt
> 
> The usemem output is not easy to understand, I will attach my draft
> script in thread for easing result collecting and statistics.
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-26 15:55 ` [PATCH v2 1/1] " Baoquan He
@ 2025-09-27  7:56   ` kernel test robot
  2025-09-27 17:14   ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2025-09-27  7:56 UTC (permalink / raw)
  To: Baoquan He, linux-mm
  Cc: llvm, oe-kbuild-all, akpm, chrisl, kasong, youngjun.park,
	aaron.lu, baohua, shikemeng, nphamcs, Baoquan He

Hi Baoquan,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v6.17-rc7 next-20250926]
[cannot apply to akpm-mm/mm-everything]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-swapfile-c-select-the-swap-device-with-default-priority-round-robin/20250926-235740
base:   linus/master
patch link:    https://lore.kernel.org/r/20250926155504.5122-2-bhe%40redhat.com
patch subject: [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
config: x86_64-buildonly-randconfig-002-20250927 (https://download.01.org/0day-ci/archive/20250927/202509271545.8d7xtJIA-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250927/202509271545.8d7xtJIA-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509271545.8d7xtJIA-lkp@intel.com/

All errors (new ones prefixed by >>):

>> mm/swapfile.c:2550:24: error: use of undeclared identifier 'swap_active_head'; did you mean 'swap_avail_head'?
    2550 |         plist_add(&si->list, &swap_active_head);
         |                               ^~~~~~~~~~~~~~~~
         |                               swap_avail_head
   mm/swapfile.c:99:19: note: 'swap_avail_head' declared here
      99 | static PLIST_HEAD(swap_avail_head);
         |                   ^
   mm/swapfile.c:2655:27: error: use of undeclared identifier 'swap_active_head'; did you mean 'swap_avail_head'?
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |                                  ^~~~~~~~~~~~~~~~
         |                                  swap_avail_head
   include/linux/plist.h:173:30: note: expanded from macro 'plist_for_each_entry'
     173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
         |                                     ^
   include/linux/list.h:770:30: note: expanded from macro 'list_for_each_entry'
     770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
         |                                     ^
   include/linux/list.h:612:14: note: expanded from macro 'list_first_entry'
     612 |         list_entry((ptr)->next, type, member)
         |                     ^
   include/linux/list.h:601:15: note: expanded from macro 'list_entry'
     601 |         container_of(ptr, type, member)
         |                      ^
   include/linux/container_of.h:20:26: note: expanded from macro 'container_of'
      20 |         void *__mptr = (void *)(ptr);                                   \
         |                                 ^
   mm/swapfile.c:99:19: note: 'swap_avail_head' declared here
      99 | static PLIST_HEAD(swap_avail_head);
         |                   ^
   mm/swapfile.c:2655:27: error: use of undeclared identifier 'swap_active_head'; did you mean 'swap_avail_head'?
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |                                  ^~~~~~~~~~~~~~~~
         |                                  swap_avail_head
   include/linux/plist.h:173:30: note: expanded from macro 'plist_for_each_entry'
     173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
         |                                     ^
   include/linux/list.h:770:30: note: expanded from macro 'list_for_each_entry'
     770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
         |                                     ^
   include/linux/list.h:612:14: note: expanded from macro 'list_first_entry'
     612 |         list_entry((ptr)->next, type, member)
         |                     ^
   note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
   include/linux/compiler_types.h:507:63: note: expanded from macro '__same_type'
     507 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
         |                                                               ^
   include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
      77 | #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
         |                                                  ^
   include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^
   mm/swapfile.c:99:19: note: 'swap_avail_head' declared here
      99 | static PLIST_HEAD(swap_avail_head);
         |                   ^
   mm/swapfile.c:2655:27: error: use of undeclared identifier 'swap_active_head'; did you mean 'swap_avail_head'?
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |                                  ^~~~~~~~~~~~~~~~
         |                                  swap_avail_head
   include/linux/plist.h:173:30: note: expanded from macro 'plist_for_each_entry'
     173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
         |                                     ^
   include/linux/list.h:770:30: note: expanded from macro 'list_for_each_entry'
     770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
         |                                     ^
   include/linux/list.h:612:14: note: expanded from macro 'list_first_entry'
     612 |         list_entry((ptr)->next, type, member)
         |                     ^
   note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
   include/linux/compiler_types.h:507:63: note: expanded from macro '__same_type'
     507 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
         |                                                               ^
   include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
      77 | #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
         |                                                  ^
   include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^
   mm/swapfile.c:99:19: note: 'swap_avail_head' declared here
      99 | static PLIST_HEAD(swap_avail_head);
         |                   ^
   mm/swapfile.c:2655:27: error: use of undeclared identifier 'swap_active_head'; did you mean 'swap_avail_head'?
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |                                  ^~~~~~~~~~~~~~~~
         |                                  swap_avail_head
   include/linux/plist.h:173:30: note: expanded from macro 'plist_for_each_entry'
     173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
         |                                     ^
   include/linux/list.h:771:32: note: expanded from macro 'list_for_each_entry'
     771 |              !list_entry_is_head(pos, head, member);                    \
         |                                       ^
   include/linux/list.h:761:30: note: expanded from macro 'list_entry_is_head'
     761 |         list_is_head(&pos->member, (head))
         |                                     ^
   mm/swapfile.c:99:19: note: 'swap_avail_head' declared here
      99 | static PLIST_HEAD(swap_avail_head);
         |                   ^
   mm/swapfile.c:2677:23: error: use of undeclared identifier 'swap_active_head'; did you mean 'swap_avail_head'?
    2677 |         plist_del(&p->list, &swap_active_head);
         |                              ^~~~~~~~~~~~~~~~
         |                              swap_avail_head


vim +2550 mm/swapfile.c

eb085574a7526c Ying Huang           2019-07-11  2542  
b85508d7de901c Barry Song           2024-08-08  2543  static void _enable_swap_info(struct swap_info_struct *si)
eb085574a7526c Ying Huang           2019-07-11  2544  {
b85508d7de901c Barry Song           2024-08-08  2545  	atomic_long_add(si->pages, &nr_swap_pages);
b85508d7de901c Barry Song           2024-08-08  2546  	total_swap_pages += si->pages;
40531542e28324 Cesar Eduardo Barros 2011-03-22  2547  
adfab836f4908d Dan Streetman        2014-06-04  2548  	assert_spin_locked(&swap_lock);
5b648db56b50e1 Baoquan He           2025-09-26  2549  
b85508d7de901c Barry Song           2024-08-08 @2550  	plist_add(&si->list, &swap_active_head);
c70699e555537b Ma Wupeng            2023-06-27  2551  
b228386cf237e6 Kairui Song          2025-01-14  2552  	/* Add back to available list */
b228386cf237e6 Kairui Song          2025-01-14  2553  	add_to_avail_list(si, true);
cf0cac0a093415 Cesar Eduardo Barros 2012-12-11  2554  }
cf0cac0a093415 Cesar Eduardo Barros 2012-12-11  2555  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-26 15:55 ` [PATCH v2 1/1] " Baoquan He
  2025-09-27  7:56   ` kernel test robot
@ 2025-09-27 17:14   ` kernel test robot
  2025-09-28  2:22     ` Baoquan He
  1 sibling, 1 reply; 8+ messages in thread
From: kernel test robot @ 2025-09-27 17:14 UTC (permalink / raw)
  To: Baoquan He, linux-mm
  Cc: oe-kbuild-all, akpm, chrisl, kasong, youngjun.park, aaron.lu,
	baohua, shikemeng, nphamcs, Baoquan He

Hi Baoquan,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.17-rc7 next-20250926]
[cannot apply to akpm-mm/mm-everything]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-swapfile-c-select-the-swap-device-with-default-priority-round-robin/20250926-235740
base:   linus/master
patch link:    https://lore.kernel.org/r/20250926155504.5122-2-bhe%40redhat.com
patch subject: [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
config: sparc-randconfig-001-20250927 (https://download.01.org/0day-ci/archive/20250928/202509280002.NWLixh90-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 11.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250928/202509280002.NWLixh90-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509280002.NWLixh90-lkp@intel.com/

All warnings (new ones prefixed by >>):

   mm/swapfile.c: In function '_enable_swap_info':
   mm/swapfile.c:2550:31: error: 'swap_active_head' undeclared (first use in this function); did you mean 'swap_avail_head'?
    2550 |         plist_add(&si->list, &swap_active_head);
         |                               ^~~~~~~~~~~~~~~~
         |                               swap_avail_head
   mm/swapfile.c:2550:31: note: each undeclared identifier is reported only once for each function it appears in
   In file included from include/linux/list.h:5,
                    from include/linux/wait.h:7,
                    from include/linux/wait_bit.h:8,
                    from include/linux/fs.h:7,
                    from include/linux/highmem.h:5,
                    from include/linux/bvec.h:10,
                    from include/linux/blk_types.h:10,
                    from include/linux/blkdev.h:9,
                    from mm/swapfile.c:9:
   mm/swapfile.c: In function '__do_sys_swapoff':
   mm/swapfile.c:2655:34: error: 'swap_active_head' undeclared (first use in this function); did you mean 'swap_avail_head'?
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |                                  ^~~~~~~~~~~~~~~~
   include/linux/container_of.h:20:33: note: in definition of macro 'container_of'
      20 |         void *__mptr = (void *)(ptr);                                   \
         |                                 ^~~
   include/linux/list.h:612:9: note: in expansion of macro 'list_entry'
     612 |         list_entry((ptr)->next, type, member)
         |         ^~~~~~~~~~
   include/linux/list.h:770:20: note: in expansion of macro 'list_first_entry'
     770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
         |                    ^~~~~~~~~~~~~~~~
   include/linux/plist.h:173:10: note: in expansion of macro 'list_for_each_entry'
     173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
         |          ^~~~~~~~~~~~~~~~~~~
   mm/swapfile.c:2655:9: note: in expansion of macro 'plist_for_each_entry'
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |         ^~~~~~~~~~~~~~~~~~~~
   In file included from include/linux/init.h:5,
                    from include/linux/printk.h:6,
                    from include/asm-generic/bug.h:22,
                    from arch/sparc/include/asm/bug.h:25,
                    from include/linux/bug.h:5,
                    from include/linux/vfsdebug.h:5,
                    from include/linux/fs.h:5,
                    from include/linux/highmem.h:5,
                    from include/linux/bvec.h:10,
                    from include/linux/blk_types.h:10,
                    from include/linux/blkdev.h:9,
                    from mm/swapfile.c:9:
   include/linux/compiler_types.h:507:27: error: expression in static assertion is not an integer
     507 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:21:9: note: in expansion of macro 'static_assert'
      21 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
      21 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/linux/list.h:601:9: note: in expansion of macro 'container_of'
     601 |         container_of(ptr, type, member)
         |         ^~~~~~~~~~~~
   include/linux/list.h:612:9: note: in expansion of macro 'list_entry'
     612 |         list_entry((ptr)->next, type, member)
         |         ^~~~~~~~~~
   include/linux/list.h:770:20: note: in expansion of macro 'list_first_entry'
     770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
         |                    ^~~~~~~~~~~~~~~~
   include/linux/plist.h:173:10: note: in expansion of macro 'list_for_each_entry'
     173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
         |          ^~~~~~~~~~~~~~~~~~~
   mm/swapfile.c:2655:9: note: in expansion of macro 'plist_for_each_entry'
    2655 |         plist_for_each_entry(p, &swap_active_head, list) {
         |         ^~~~~~~~~~~~~~~~~~~~
   mm/swapfile.c: In function '__has_usable_swap':
   mm/swapfile.c:3835:35: error: 'swap_active_head' undeclared (first use in this function); did you mean 'swap_avail_head'?
    3835 |         return !plist_head_empty(&swap_active_head);
         |                                   ^~~~~~~~~~~~~~~~
         |                                   swap_avail_head
>> mm/swapfile.c:3836:1: warning: control reaches end of non-void function [-Wreturn-type]
    3836 | }
         | ^


vim +3836 mm/swapfile.c

a2468cc9bfdff6 Aaron Lu    2017-09-06  3831  
2cf855837b89d9 Tejun Heo   2018-07-03  3832  #if defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
0ff67f990bd457 Kairui Song 2025-03-14  3833  static bool __has_usable_swap(void)
0ff67f990bd457 Kairui Song 2025-03-14  3834  {
0ff67f990bd457 Kairui Song 2025-03-14  3835  	return !plist_head_empty(&swap_active_head);
0ff67f990bd457 Kairui Song 2025-03-14 @3836  }
0ff67f990bd457 Kairui Song 2025-03-14  3837  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
  2025-09-27 17:14   ` kernel test robot
@ 2025-09-28  2:22     ` Baoquan He
  0 siblings, 0 replies; 8+ messages in thread
From: Baoquan He @ 2025-09-28  2:22 UTC (permalink / raw)
  To: kernel test robot
  Cc: linux-mm, oe-kbuild-all, akpm, chrisl, kasong, youngjun.park,
	aaron.lu, baohua, shikemeng, nphamcs

On 09/28/25 at 01:14am, kernel test robot wrote:
> Hi Baoquan,
> 
> kernel test robot noticed the following build warnings:
> 
> [auto build test WARNING on linus/master]
> [also build test WARNING on v6.17-rc7 next-20250926]
> [cannot apply to akpm-mm/mm-everything]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-swapfile-c-select-the-swap-device-with-default-priority-round-robin/20250926-235740
> base:   linus/master
> patch link:    https://lore.kernel.org/r/20250926155504.5122-2-bhe%40redhat.com
> patch subject: [PATCH v2 1/1] mm/swapfile.c: select the swap device with default priority round robin
> config: sparc-randconfig-001-20250927 (https://download.01.org/0day-ci/archive/20250928/202509280002.NWLixh90-lkp@intel.com/config)
> compiler: sparc64-linux-gcc (GCC) 11.5.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250928/202509280002.NWLixh90-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202509280002.NWLixh90-lkp@intel.com/
> 
> All warnings (new ones prefixed by >>):
> 
>    mm/swapfile.c: In function '_enable_swap_info':
>    mm/swapfile.c:2550:31: error: 'swap_active_head' undeclared (first use in this function); did you mean 'swap_avail_head'?
>     2550 |         plist_add(&si->list, &swap_active_head);
>          |                               ^~~~~~~~~~~~~~~~
>          |                               swap_avail_head

Sorry, I mistakenly removed the definition of swap_avail_head. I planned
to remove swap_avail_head in later work, but mixed the draft code to
this patch. I will post v3 to split patch as Chris suggested, will fix
it this at the same time. Thanks for reporting this, please drop this v2
patch from testing.

>    mm/swapfile.c:2550:31: note: each undeclared identifier is reported only once for each function it appears in
>    In file included from include/linux/list.h:5,
>                     from include/linux/wait.h:7,
>                     from include/linux/wait_bit.h:8,
>                     from include/linux/fs.h:7,
>                     from include/linux/highmem.h:5,
>                     from include/linux/bvec.h:10,
>                     from include/linux/blk_types.h:10,
>                     from include/linux/blkdev.h:9,
>                     from mm/swapfile.c:9:
>    mm/swapfile.c: In function '__do_sys_swapoff':
>    mm/swapfile.c:2655:34: error: 'swap_active_head' undeclared (first use in this function); did you mean 'swap_avail_head'?
>     2655 |         plist_for_each_entry(p, &swap_active_head, list) {
>          |                                  ^~~~~~~~~~~~~~~~
>    include/linux/container_of.h:20:33: note: in definition of macro 'container_of'
>       20 |         void *__mptr = (void *)(ptr);                                   \
>          |                                 ^~~
>    include/linux/list.h:612:9: note: in expansion of macro 'list_entry'
>      612 |         list_entry((ptr)->next, type, member)
>          |         ^~~~~~~~~~
>    include/linux/list.h:770:20: note: in expansion of macro 'list_first_entry'
>      770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
>          |                    ^~~~~~~~~~~~~~~~
>    include/linux/plist.h:173:10: note: in expansion of macro 'list_for_each_entry'
>      173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
>          |          ^~~~~~~~~~~~~~~~~~~
>    mm/swapfile.c:2655:9: note: in expansion of macro 'plist_for_each_entry'
>     2655 |         plist_for_each_entry(p, &swap_active_head, list) {
>          |         ^~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/init.h:5,
>                     from include/linux/printk.h:6,
>                     from include/asm-generic/bug.h:22,
>                     from arch/sparc/include/asm/bug.h:25,
>                     from include/linux/bug.h:5,
>                     from include/linux/vfsdebug.h:5,
>                     from include/linux/fs.h:5,
>                     from include/linux/highmem.h:5,
>                     from include/linux/bvec.h:10,
>                     from include/linux/blk_types.h:10,
>                     from include/linux/blkdev.h:9,
>                     from mm/swapfile.c:9:
>    include/linux/compiler_types.h:507:27: error: expression in static assertion is not an integer
>      507 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
>          |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
>       78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
>          |                                                        ^~~~
>    include/linux/container_of.h:21:9: note: in expansion of macro 'static_assert'
>       21 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
>          |         ^~~~~~~~~~~~~
>    include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
>       21 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
>          |                       ^~~~~~~~~~~
>    include/linux/list.h:601:9: note: in expansion of macro 'container_of'
>      601 |         container_of(ptr, type, member)
>          |         ^~~~~~~~~~~~
>    include/linux/list.h:612:9: note: in expansion of macro 'list_entry'
>      612 |         list_entry((ptr)->next, type, member)
>          |         ^~~~~~~~~~
>    include/linux/list.h:770:20: note: in expansion of macro 'list_first_entry'
>      770 |         for (pos = list_first_entry(head, typeof(*pos), member);        \
>          |                    ^~~~~~~~~~~~~~~~
>    include/linux/plist.h:173:10: note: in expansion of macro 'list_for_each_entry'
>      173 |          list_for_each_entry(pos, &(head)->node_list, mem.node_list)
>          |          ^~~~~~~~~~~~~~~~~~~
>    mm/swapfile.c:2655:9: note: in expansion of macro 'plist_for_each_entry'
>     2655 |         plist_for_each_entry(p, &swap_active_head, list) {
>          |         ^~~~~~~~~~~~~~~~~~~~
>    mm/swapfile.c: In function '__has_usable_swap':
>    mm/swapfile.c:3835:35: error: 'swap_active_head' undeclared (first use in this function); did you mean 'swap_avail_head'?
>     3835 |         return !plist_head_empty(&swap_active_head);
>          |                                   ^~~~~~~~~~~~~~~~
>          |                                   swap_avail_head
> >> mm/swapfile.c:3836:1: warning: control reaches end of non-void function [-Wreturn-type]
>     3836 | }
>          | ^
> 
> 
> vim +3836 mm/swapfile.c
> 
> a2468cc9bfdff6 Aaron Lu    2017-09-06  3831  
> 2cf855837b89d9 Tejun Heo   2018-07-03  3832  #if defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
> 0ff67f990bd457 Kairui Song 2025-03-14  3833  static bool __has_usable_swap(void)
> 0ff67f990bd457 Kairui Song 2025-03-14  3834  {
> 0ff67f990bd457 Kairui Song 2025-03-14  3835  	return !plist_head_empty(&swap_active_head);
> 0ff67f990bd457 Kairui Song 2025-03-14 @3836  }
> 0ff67f990bd457 Kairui Song 2025-03-14  3837  
> 
> -- 
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-09-28  2:22 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-26 15:55 [PATCH v2 0/1] mm/swapfile.c: select the swap device with default priority round robin Baoquan He
2025-09-26 15:55 ` [PATCH v2 1/1] " Baoquan He
2025-09-27  7:56   ` kernel test robot
2025-09-27 17:14   ` kernel test robot
2025-09-28  2:22     ` Baoquan He
2025-09-26 16:02 ` [PATCH v2 0/1] " Baoquan He
2025-09-26 16:04   ` Baoquan He
2025-09-27  0:14 ` Baoquan He

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox