From nobody Fri Jun 12 11:26:08 2026 Received: from out-183.mta1.migadu.com (out-183.mta1.migadu.com [95.215.58.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF2D43264ED for ; Fri, 24 Apr 2026 04:01:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003289; cv=none; b=d1sZ234K99Txp1qN07lBS8DQey+mbbZ2yOYbcbwir9ZwoNesWnY9cKgTMUS50jCeuB6PdKHhFAH82JyJiWuJu2L2/yDwaWUriZyQTHEeU2K5lslFHd0mhoIPgWoUE7EQW6ZJDXNb1JuRzWLXUG7dhuFDknlvfpp7rV1LQ+g4sQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003289; c=relaxed/simple; bh=wlAlwZ0KZImscE1SdwipDWwqojceWrUohq/ClmcbXAY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=eqJ7wfn6ZTx4ocvpJvNKom0YWd/DQ6dgxJL6a23aaol2vfRX9uV6UvIiydUv6NvgAZfo5KP7+DpYCY7RWeaspfCywy4vXTQRxh/mcSIZUGcNYhm1y6Yrbu12mfC804DKtlV4ksZz1dUY+Y0x1B6nHpTZl7ssfp0ztf4SX0Q/tfU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=oeHyCQPN; arc=none smtp.client-ip=95.215.58.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="oeHyCQPN" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003286; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Gr8asudXbZcTLEQoBtpdGFZE+1tjsTEgxDXHfEmUBuk=; b=oeHyCQPN6+7SzNn3zyt6SJZNgJ5tcf7mfOBQNDb1ZmDi/X56dFl5cpn+kLCtEXxwA4x31x tTcK0JLkTWi8s/gOpfklOW8MpGl/JoIh6j8u8MeRtBdpu2GYmpOTVF9Ujdqzh7mSpYFkxP 4qmDHAwU+GLrCHoCPn8itn3iGnIBjRY= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt , Yosry Ahmed Subject: [PATCH v7 1/8] selftests/cgroup: skip test_zswap if zswap is globally disabled Date: Fri, 24 Apr 2026 12:00:52 +0800 Message-ID: <20260424040059.12940-2-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT test_zswap currently only checks whether zswap is present by testing /sys/module/zswap. This misses the runtime global state exposed in /sys/module/zswap/parameters/enabled. When zswap is built/loaded but globally disabled, the zswap cgroup selftests run in an invalid environment and may fail spuriously. Check the runtime enabled state before running the tests: - skip if zswap is not configured, - fail if the enabled knob cannot be read, - skip if zswap is globally disabled. Also print a hint in the skip message on how to enable zswap. Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Cc: Yosry Ahmed Acked-by: Yosry Ahmed Acked-by: Nhat Pham --- tools/testing/selftests/cgroup/test_zswap.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index a7bdcdd09d6..a94238a2e04 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -15,6 +15,9 @@ #include "kselftest.h" #include "cgroup_util.h" =20 +#define PATH_ZSWAP "/sys/module/zswap" +#define PATH_ZSWAP_ENABLED "/sys/module/zswap/parameters/enabled" + static int read_int(const char *path, size_t *value) { FILE *file; @@ -725,9 +728,18 @@ struct zswap_test { }; #undef T =20 -static bool zswap_configured(void) +static void check_zswap_enabled(void) { - return access("/sys/module/zswap", F_OK) =3D=3D 0; + char value[2]; + + if (access(PATH_ZSWAP, F_OK)) + ksft_exit_skip("zswap isn't configured\n"); + + if (read_text(PATH_ZSWAP_ENABLED, value, sizeof(value)) <=3D 0) + ksft_exit_fail_msg("Failed to read " PATH_ZSWAP_ENABLED "\n"); + + if (value[0] =3D=3D 'N') + ksft_exit_skip("zswap is disabled (hint: echo 1 > " PATH_ZSWAP_ENABLED "= )\n"); } =20 int main(int argc, char **argv) @@ -740,8 +752,7 @@ int main(int argc, char **argv) if (cg_find_unified_root(root, sizeof(root), NULL)) ksft_exit_skip("cgroup v2 isn't mounted\n"); =20 - if (!zswap_configured()) - ksft_exit_skip("zswap isn't configured\n"); + check_zswap_enabled(); =20 /* * Check that memory controller is available: --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-179.mta1.migadu.com (out-179.mta1.migadu.com [95.215.58.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A36C33148C5 for ; Fri, 24 Apr 2026 04:01:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003299; cv=none; b=nuSqNAsxfDF2YFcD0f30z5Wj4E5ZZT8MEuNMgAcv/HlqenbnV3JFdYQ1sGSp3v6vGFQeMkmZZErE+oShJaBGIS++j2O+QDAD0SKk/hrreOW2fc/gbLksXHUYu/WM6gQq1SXdfE7HNkWvR1AHIsYuoHdxr97n3A6/T4v4knSwk4s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003299; c=relaxed/simple; bh=vP9frb92EtCl6XNgf7aWpLvMBDi5LVth9PXbp5LRKeU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=iNXwhTr/gB2a1lRjfjv3I/5FVSURsAUSwNee4MTinuCqrARUPtMLcY5HM/cyzKOSlMfOGC/zIBndedFUi77Vrudijy59yMrYUB2YrRk7A024DyoUfFzDzM82sHe5r4ZoyhTKGcwwTTAJ8XmVgNXmIrskhXm6sltagz9+jxAGmiY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=q0CEzSKD; arc=none smtp.client-ip=95.215.58.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="q0CEzSKD" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003295; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Zo6kGfk/xM7DSaD4ymtNFmjwZMlQQ2mCHqeTEgtluNI=; b=q0CEzSKDXtzJ+NN/eB54JePXjXFiUxjo5CUbGCNwo7x2vx+fZA6OQor6AGPHWgmbp3WDpM bwZRvN7QGv/URDbOFDQAoJC3+Wcrx7bIkFp/Tcv3rNHqvwBK73BvhauXX8RMxCXnieELXz XsykdlZ2L6gcyo80CmMnESDt2xfM4E0= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt Subject: [PATCH v7 2/8] selftests/cgroup: avoid OOM in test_swapin_nozswap Date: Fri, 24 Apr 2026 12:00:53 +0800 Message-ID: <20260424040059.12940-3-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT test_swapin_nozswap can hit OOM before reaching its assertions on some setups. The test currently sets memory.max=3D8M and then allocates/reads 32M with memory.zswap.max=3D0, which may over-constrain reclaim and kill the workload process. Replace hardcoded sizes with PAGE_SIZE-based values: - control_allocation_size =3D PAGE_SIZE * 512 - memory.max =3D control_allocation_size * 3 / 4 - minimum expected swap =3D control_allocation_size / 4 This keeps the test pressure model intact (allocate/read beyond memory.max = to force swap-in/out) while making it more robust across different environment= s. The test intent is unchanged: confirm that swapping occurs while zswap rema= ins unused when memory.zswap.max=3D0. =3D=3D=3D Error Logs =3D=3D=3D # ./test_zswap TAP version 13 1..7 ok 1 test_zswap_usage not ok 2 test_swapin_nozswap ... # dmesg [271641.879153] test_zswap invoked oom-killer: gfp_mask=3D0xcc0(GFP_KERNE= L), order=3D0, oom_score_adj=3D0 [271641.879168] CPU: 1 UID: 0 PID: 177372 Comm: test_zswap Kdump: loaded = Not tainted 6.12.0-211.el10.ppc64le #1 VOLUNTARY [271641.879171] Hardware name: IBM,9009-41A POWER9 (architected) 0x4e0202= 0xf000005 of:IBM,FW940.02 (UL940_041) hv:phyp pSeries [271641.879173] Call Trace: [271641.879174] [c00000037540f730] [c00000000127ec44] dump_stack_lvl+0x88= /0xc4 (unreliable) [271641.879184] [c00000037540f760] [c0000000005cc594] dump_header+0x5c/0x= 1e4 [271641.879188] [c00000037540f7e0] [c0000000005cb464] oom_kill_process+0x= 324/0x3b0 [271641.879192] [c00000037540f860] [c0000000005cbe48] out_of_memory+0x118= /0x420 [271641.879196] [c00000037540f8f0] [c00000000070d8ec] mem_cgroup_out_of_m= emory+0x18c/0x1b0 [271641.879200] [c00000037540f990] [c000000000713888] try_charge_memcg+0x= 598/0x890 [271641.879204] [c00000037540fa70] [c000000000713dbc] charge_memcg+0x5c/0= x110 [271641.879207] [c00000037540faa0] [c0000000007159f8] __mem_cgroup_charge= +0x48/0x120 [271641.879211] [c00000037540fae0] [c000000000641914] alloc_anon_folio+0x= 2b4/0x5a0 [271641.879215] [c00000037540fb60] [c000000000641d58] do_anonymous_page+0= x158/0x6b0 [271641.879218] [c00000037540fbd0] [c000000000642f8c] __handle_mm_fault+0= x4bc/0x910 [271641.879221] [c00000037540fcf0] [c000000000643500] handle_mm_fault+0x1= 20/0x3c0 [271641.879224] [c00000037540fd40] [c00000000014bba0] ___do_page_fault+0x= 1c0/0x980 [271641.879228] [c00000037540fdf0] [c00000000014c44c] hash__do_page_fault= +0x2c/0xc0 [271641.879232] [c00000037540fe20] [c0000000001565d8] do_hash_fault+0x128= /0x1d0 [271641.879236] [c00000037540fe50] [c000000000008be0] data_access_common_= virt+0x210/0x220 [271641.879548] Tasks state (memory values in pages): ... [271641.879550] [ pid ] uid tgid total_vm rss rss_anon rss_file= rss_shmem pgtables_bytes swapents oom_score_adj name [271641.879555] [ 177372] 0 177372 571 0 0 = 0 0 51200 96 0 test_zswap [271641.879562] oom-kill:constraint=3DCONSTRAINT_MEMCG,nodemask=3D(null),= cpuset=3D/,mems_allowed=3D0,oom_memcg=3D/no_zswap_test,task_memcg=3D/no_zsw= ap_test,task=3Dtest_zswap,pid=3D177372,uid=3D0 [271641.879578] Memory cgroup out of memory: Killed process 177372 (test_= zswap) total-vm:36544kB, anon-rss:0kB, file-rss:0kB, shmem-rss:0kB, UID:0 p= gtables:50kB oom_score_adj:0 Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Acked-by: Yosry Ahmed Acked-by: Nhat Pham --- tools/testing/selftests/cgroup/test_zswap.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index a94238a2e04..47709cbdcdf 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -165,21 +165,25 @@ static int test_zswap_usage(const char *root) static int test_swapin_nozswap(const char *root) { int ret =3D KSFT_FAIL; - char *test_group; - long swap_peak, zswpout; + char *test_group, mem_max_buf[32]; + long swap_peak, zswpout, min_swap; + size_t allocation_size =3D sysconf(_SC_PAGESIZE) * 512; + + min_swap =3D allocation_size / 4; + snprintf(mem_max_buf, sizeof(mem_max_buf), "%zu", allocation_size * 3/4); =20 test_group =3D cg_name(root, "no_zswap_test"); if (!test_group) goto out; if (cg_create(test_group)) goto out; - if (cg_write(test_group, "memory.max", "8M")) + if (cg_write(test_group, "memory.max", mem_max_buf)) goto out; if (cg_write(test_group, "memory.zswap.max", "0")) goto out; =20 /* Allocate and read more than memory.max to trigger swapin */ - if (cg_run(test_group, allocate_and_read_bytes, (void *)MB(32))) + if (cg_run(test_group, allocate_and_read_bytes, (void *)allocation_size)) goto out; =20 /* Verify that pages are swapped out, but no zswap happened */ @@ -189,8 +193,9 @@ static int test_swapin_nozswap(const char *root) goto out; } =20 - if (swap_peak < MB(24)) { - ksft_print_msg("at least 24MB of memory should be swapped out\n"); + if (swap_peak < min_swap) { + ksft_print_msg("at least %ldKB of memory should be swapped out\n", + min_swap / 1024); goto out; } =20 --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-180.mta1.migadu.com (out-180.mta1.migadu.com [95.215.58.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 722A830149F for ; Fri, 24 Apr 2026 04:01:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003314; cv=none; b=HwDf9wmgdrQDjV6OktadAsSDqUCpv9ZP4YZxGfH8Hxe7iBHzifVQKx+aG4jXQHqxChD3ACKzhDJuw1vC02ZgCn2+q53l3FDT9Y+6bOxn73rc4okGZqqXHU9UPqnFAvUmbe7Sd/si6c2TCCMcZOHSRIAj4fucykE9RdtmnIlI7wQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003314; c=relaxed/simple; bh=IrVs7W0qMS6zYtOWBfQMKk0LtX4TQi5hrDgiv5LUf0U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rrgSEniI+CgD6wCA0qcd0uMLQ5pPop6L0eXjRMF334jfnG26B6CgkXSRYzwSvfl8sJBccugPalMgeekXY5D4nKBlxBPuNu3azYDQCNC6lvherIIXTJQpguh6fO2Xio5fBT6kx+Tl5quSOPmjFwcqZoXDIVrSAmQrFDU/jYLZN6Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=GhFXBDVc; arc=none smtp.client-ip=95.215.58.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="GhFXBDVc" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003310; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NtcN3Op0ieChDzZc8VELPGrZGUZ27l8eeX+TShLLBmA=; b=GhFXBDVc38OATu0fbD+/9vkf7VvLtY6ejQzjmVAiWIK3txPn+1XYiQUn40RSMddglsjA/5 RNJka4bkNve6DrZ/lCG5g5COj2zsxcDHxow+sW+vK27olu8Wi9x0ja6ZYguoSvFq1IiNkm zafc0JbOAGCFwLVyOg7t58njxyxgjS0= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt Subject: [PATCH v7 3/8] selftests/cgroup: use runtime page size for zswpin check Date: Fri, 24 Apr 2026 12:00:54 +0800 Message-ID: <20260424040059.12940-4-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT test_zswapin compares memory.stat:zswpin (counted in pages) against a byte threshold converted with PAGE_SIZE. In cgroup selftests, PAGE_SIZE is hardcoded to 4096, which makes the conversion wrong on systems with non-4K base pages (e.g. 64K). As a result, the test requires too many pages to pass and fails spuriously even when zswap is working. Use sysconf(_SC_PAGESIZE) for the zswpin threshold conversion so the check matches the actual system page size. Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Reviewed-by: Yosry Ahmed Acked-by: Nhat Pham --- tools/testing/selftests/cgroup/test_zswap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 47709cbdcdf..37aa83c2f1b 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -245,7 +245,7 @@ static int test_zswapin(const char *root) goto out; } =20 - if (zswpin < MB(24) / PAGE_SIZE) { + if (zswpin < MB(24) / sysconf(_SC_PAGESIZE)) { ksft_print_msg("at least 24MB should be brought back from zswap\n"); goto out; } --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-183.mta1.migadu.com (out-183.mta1.migadu.com [95.215.58.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C6688237713 for ; Fri, 24 Apr 2026 04:02:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003325; cv=none; b=R1uUgxsXCKbI4jF83xXTrxnliymztxekz/3JjP+MSgOlyDPVgRS+J11nJl619Kmk38AhhxmOg00+61YcXO2ALaJJ0mjnqCkYlGrdwPx4RoQ3ZLlLRP1zquZDerB7d0R0alFY3kWWqsLFUKD7ifGdQURHklmmo6dz0HmubeyqWGg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003325; c=relaxed/simple; bh=Cdn8Rk2Ap4FTJzfvh5DqIz5JZ6zdURAE7+COmwKfyvM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cqpdj3bWvsY0qCWpNPSFSeOxOULWvA4iwuiPpfFpL7CqDnUEHY3+1gcuNoXflp4CGacKcq/sZNxZGOyZcX6qmFWCcaNfhv0lhvXYRQHMnmIT72h/AOPHDxuwNL0qYSuw7rlmlCMGRmzV16fUldGsKp9Bix1actB+AgWLrbq/Ano= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=VhhMoTdY; arc=none smtp.client-ip=95.215.58.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="VhhMoTdY" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003321; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rzx3zOD8ZQ55shIwyhvABMvV7vxK246eKX/iuZXREog=; b=VhhMoTdYa7ZcEG55Z0uVQZhdx1VB9yvvdrQ5yP0OyVOd02HhjyS/WjxmfbCbHfJe973HLl kKFSinv9SjTiHpmH7IhMN6KPWQ3iPh/glDhB68Z7B8vIrNOo7uUR0dtLpoN/rmx5z4wEUB gFCotUBVbj6rxFt5pvSYhWKCZxuUZTA= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt , Yosry Ahmed Subject: [PATCH v7 4/8] selftests/cgroup: rename PAGE_SIZE to BUF_SIZE in cgroup_util Date: Fri, 24 Apr 2026 12:00:55 +0800 Message-ID: <20260424040059.12940-5-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT The cgroup utility code defines a local PAGE_SIZE macro hardcoded to 4096, which is used primarily as a generic buffer size for reading cgroup and proc files. This naming is misleading because the value has nothing to do with the actual page size of the system. On architectures with larger pages (e.g., 64K on arm64 or ppc64), the name suggests a relationship that does not exist. Additionally, the name can shadow or conflict with PAGE_SIZE definitions from system headers, leading to confusion or subtle bugs. To resolve this, rename the macro to BUF_SIZE to accurately reflect its purpose as a general I/O buffer size. Furthermore, test_memcontrol currently relies on this hardcoded 4K value to stride through memory and trigger page faults. Update this logic to use the actual system page size dynamically. This micro-optimizes the memory faulting process by ensuring it iterates correctly and efficiently based on the underlying architecture's true page size. (This part from Waim= an) Signed-off-by: Li Wang Signed-off-by: Waiman Long Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Cc: Yosry Ahmed Acked-by: Nhat Pham --- .../selftests/cgroup/lib/cgroup_util.c | 18 +++++++++--------- .../cgroup/lib/include/cgroup_util.h | 4 ++-- tools/testing/selftests/cgroup/test_core.c | 2 +- tools/testing/selftests/cgroup/test_freezer.c | 2 +- .../selftests/cgroup/test_memcontrol.c | 19 ++++++++++++------- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/cgroup/lib/cgroup_util.c b/tools/testi= ng/selftests/cgroup/lib/cgroup_util.c index 6a7295347e9..9be8ac25657 100644 --- a/tools/testing/selftests/cgroup/lib/cgroup_util.c +++ b/tools/testing/selftests/cgroup/lib/cgroup_util.c @@ -140,7 +140,7 @@ int cg_read_strcmp_wait(const char *cgroup, const char = *control, =20 int cg_read_strstr(const char *cgroup, const char *control, const char *ne= edle) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; =20 if (cg_read(cgroup, control, buf, sizeof(buf))) return -1; @@ -170,7 +170,7 @@ long cg_read_long_fd(int fd) =20 long cg_read_key_long(const char *cgroup, const char *control, const char = *key) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; char *ptr; =20 if (cg_read(cgroup, control, buf, sizeof(buf))) @@ -206,7 +206,7 @@ long cg_read_key_long_poll(const char *cgroup, const ch= ar *control, =20 long cg_read_lc(const char *cgroup, const char *control) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; const char delim[] =3D "\n"; char *line; long cnt =3D 0; @@ -258,7 +258,7 @@ int cg_write_numeric(const char *cgroup, const char *co= ntrol, long value) static int cg_find_root(char *root, size_t len, const char *controller, bool *nsdelegate) { - char buf[10 * PAGE_SIZE]; + char buf[10 * BUF_SIZE]; char *fs, *mount, *type, *options; const char delim[] =3D "\n\t "; =20 @@ -313,7 +313,7 @@ int cg_create(const char *cgroup) =20 int cg_wait_for_proc_count(const char *cgroup, int count) { - char buf[10 * PAGE_SIZE] =3D {0}; + char buf[10 * BUF_SIZE] =3D {0}; int attempts; char *ptr; =20 @@ -338,7 +338,7 @@ int cg_wait_for_proc_count(const char *cgroup, int coun= t) =20 int cg_killall(const char *cgroup) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; char *ptr =3D buf; =20 /* If cgroup.kill exists use it. */ @@ -548,7 +548,7 @@ int cg_run_nowait(const char *cgroup, =20 int proc_mount_contains(const char *option) { - char buf[4 * PAGE_SIZE]; + char buf[4 * BUF_SIZE]; ssize_t read; =20 read =3D read_text("/proc/mounts", buf, sizeof(buf)); @@ -560,7 +560,7 @@ int proc_mount_contains(const char *option) =20 int cgroup_feature(const char *feature) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; ssize_t read; =20 read =3D read_text("/sys/kernel/cgroup/features", buf, sizeof(buf)); @@ -587,7 +587,7 @@ ssize_t proc_read_text(int pid, bool thread, const char= *item, char *buf, size_t =20 int proc_read_strstr(int pid, bool thread, const char *item, const char *n= eedle) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; =20 if (proc_read_text(pid, thread, item, buf, sizeof(buf)) < 0) return -1; diff --git a/tools/testing/selftests/cgroup/lib/include/cgroup_util.h b/too= ls/testing/selftests/cgroup/lib/include/cgroup_util.h index 567b1082974..febc1723d09 100644 --- a/tools/testing/selftests/cgroup/lib/include/cgroup_util.h +++ b/tools/testing/selftests/cgroup/lib/include/cgroup_util.h @@ -2,8 +2,8 @@ #include #include =20 -#ifndef PAGE_SIZE -#define PAGE_SIZE 4096 +#ifndef BUF_SIZE +#define BUF_SIZE 4096 #endif =20 #define MB(x) (x << 20) diff --git a/tools/testing/selftests/cgroup/test_core.c b/tools/testing/sel= ftests/cgroup/test_core.c index 7b83c7e7c9d..88ca832d4fc 100644 --- a/tools/testing/selftests/cgroup/test_core.c +++ b/tools/testing/selftests/cgroup/test_core.c @@ -87,7 +87,7 @@ static int test_cgcore_destroy(const char *root) int ret =3D KSFT_FAIL; char *cg_test =3D NULL; int child_pid; - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; =20 cg_test =3D cg_name(root, "cg_test"); =20 diff --git a/tools/testing/selftests/cgroup/test_freezer.c b/tools/testing/= selftests/cgroup/test_freezer.c index 97fae92c838..160a9e6ad27 100644 --- a/tools/testing/selftests/cgroup/test_freezer.c +++ b/tools/testing/selftests/cgroup/test_freezer.c @@ -642,7 +642,7 @@ static int test_cgfreezer_ptrace(const char *root) */ static int proc_check_stopped(int pid) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; int len; =20 len =3D proc_read_text(pid, 0, "stat", buf, sizeof(buf)); diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testi= ng/selftests/cgroup/test_memcontrol.c index b43da9bc20c..44338dbaee8 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -26,6 +26,7 @@ =20 static bool has_localevents; static bool has_recursiveprot; +static int page_size; =20 int get_temp_fd(void) { @@ -34,7 +35,7 @@ int get_temp_fd(void) =20 int alloc_pagecache(int fd, size_t size) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; struct stat st; int i; =20 @@ -61,7 +62,7 @@ int alloc_anon(const char *cgroup, void *arg) char *buf, *ptr; =20 buf =3D malloc(size); - for (ptr =3D buf; ptr < buf + size; ptr +=3D PAGE_SIZE) + for (ptr =3D buf; ptr < buf + size; ptr +=3D page_size) *ptr =3D 0; =20 free(buf); @@ -70,7 +71,7 @@ int alloc_anon(const char *cgroup, void *arg) =20 int is_swap_enabled(void) { - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; const char delim[] =3D "\n"; int cnt =3D 0; char *line; @@ -113,7 +114,7 @@ static int test_memcg_subtree_control(const char *root) { char *parent, *child, *parent2 =3D NULL, *child2 =3D NULL; int ret =3D KSFT_FAIL; - char buf[PAGE_SIZE]; + char buf[BUF_SIZE]; =20 /* Create two nested cgroups with the memory controller enabled */ parent =3D cg_name(root, "memcg_test_0"); @@ -184,7 +185,7 @@ static int alloc_anon_50M_check(const char *cgroup, voi= d *arg) return -1; } =20 - for (ptr =3D buf; ptr < buf + size; ptr +=3D PAGE_SIZE) + for (ptr =3D buf; ptr < buf + size; ptr +=3D page_size) *ptr =3D 0; =20 current =3D cg_read_long(cgroup, "memory.current"); @@ -414,7 +415,7 @@ static int alloc_anon_noexit(const char *cgroup, void *= arg) return -1; } =20 - for (ptr =3D buf; ptr < buf + size; ptr +=3D PAGE_SIZE) + for (ptr =3D buf; ptr < buf + size; ptr +=3D page_size) *ptr =3D 0; =20 while (getppid() =3D=3D ppid) @@ -1000,7 +1001,7 @@ static int alloc_anon_50M_check_swap(const char *cgro= up, void *arg) return -1; } =20 - for (ptr =3D buf; ptr < buf + size; ptr +=3D PAGE_SIZE) + for (ptr =3D buf; ptr < buf + size; ptr +=3D page_size) *ptr =3D 0; =20 mem_current =3D cg_read_long(cgroup, "memory.current"); @@ -1791,6 +1792,10 @@ int main(int argc, char **argv) char root[PATH_MAX]; int i, proc_status; =20 + page_size =3D sysconf(_SC_PAGE_SIZE); + if (page_size <=3D 0) + page_size =3D BUF_SIZE; + ksft_print_header(); ksft_set_plan(ARRAY_SIZE(tests)); if (cg_find_unified_root(root, sizeof(root), NULL)) --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-177.mta1.migadu.com (out-177.mta1.migadu.com [95.215.58.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8DE742AA9 for ; Fri, 24 Apr 2026 04:02:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003336; cv=none; b=BRRKdePTh6GpJMmAh1ldko7mlDl/ekY6NSjOUH26tH+TQusNX5KGWcdPMqpVTp328D+whiCqnuSGbLljgdJModLZjN3CZvHuGhREhZtZMwUPeCpnRZLfIWwOHb9easQrDibFrAB+0M9LUWNCIsAePnWSpP8TJsgW05A2c/R4Uvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003336; c=relaxed/simple; bh=oxfEiWZ5fYyLTbBLQtDMgNWldzLX7PZJ/MswDyeOgq4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fiksO0O4o4C17x3pU4+dBULVSqYGbT0fQYxzir/Tq+FJGAC/OBjncq+4nw9dbWUYGR9vDCYCCEbbYarkeyeYovlFJRwT/KdePQmSs5dGDxIfH9i1b7MEnd55eRqmzIzeCXSCad/11Yn7A+53lgPeb7AX8lier53Bl4G/MPTICv8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=EYE+6658; arc=none smtp.client-ip=95.215.58.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="EYE+6658" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003333; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LjK5yqAtFeuYG5/nOFq4FfdHS80zSO/SlqOxhS/ymI4=; b=EYE+6658+qzlpBjMB4PwDElgXgGp08FhPENSxTQNPqUc2aYW6jcVr8xj5pVl2S8ssOcadu 5Y9WvQfr/ISxYT0+eZOIwq9T3Iktejxsx6zV+H0Cil3nxWlUFg+sMhZixIwGfmRbJX2DOd RSqabsSufhgie/GRrHt+vheFhUyEghs= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt Subject: [PATCH v7 5/8] selftests/cgroup: replace hardcoded page size values in test_zswap Date: Fri, 24 Apr 2026 12:00:56 +0800 Message-ID: <20260424040059.12940-6-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT test_zswap uses hardcoded values of 4095 and 4096 throughout as page stride and page size, which are only correct on systems with a 4K page size. On architectures with larger pages (e.g., 64K on arm64 or ppc64), these constants cause memory to be touched at sub-page granularity, leading to inefficient access patterns and incorrect page count calculations, which can cause test failures. Replace all hardcoded 4095 and 4096 values with a global pagesize variable initialized from sysconf(_SC_PAGESIZE) at startup, and remove the redundant local sysconf() calls scattered across individual functions. No functional change on 4K page size systems. Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Acked-by: Yosry Ahmed Reviewed-by: Jiayuan Chen --- tools/testing/selftests/cgroup/test_zswap.c | 45 ++++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 37aa83c2f1b..23ff11390a3 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -15,6 +15,8 @@ #include "kselftest.h" #include "cgroup_util.h" =20 +static int page_size; + #define PATH_ZSWAP "/sys/module/zswap" #define PATH_ZSWAP_ENABLED "/sys/module/zswap/parameters/enabled" =20 @@ -73,11 +75,11 @@ static int allocate_and_read_bytes(const char *cgroup, = void *arg) =20 if (!mem) return -1; - for (int i =3D 0; i < size; i +=3D 4095) + for (int i =3D 0; i < size; i +=3D page_size) mem[i] =3D 'a'; =20 /* Go through the allocated memory to (z)swap in and out pages */ - for (int i =3D 0; i < size; i +=3D 4095) { + for (int i =3D 0; i < size; i +=3D page_size) { if (mem[i] !=3D 'a') ret =3D -1; } @@ -93,7 +95,7 @@ static int allocate_bytes(const char *cgroup, void *arg) =20 if (!mem) return -1; - for (int i =3D 0; i < size; i +=3D 4095) + for (int i =3D 0; i < size; i +=3D page_size) mem[i] =3D 'a'; free(mem); return 0; @@ -167,7 +169,7 @@ static int test_swapin_nozswap(const char *root) int ret =3D KSFT_FAIL; char *test_group, mem_max_buf[32]; long swap_peak, zswpout, min_swap; - size_t allocation_size =3D sysconf(_SC_PAGESIZE) * 512; + size_t allocation_size =3D page_size * 512; =20 min_swap =3D allocation_size / 4; snprintf(mem_max_buf, sizeof(mem_max_buf), "%zu", allocation_size * 3/4); @@ -245,7 +247,7 @@ static int test_zswapin(const char *root) goto out; } =20 - if (zswpin < MB(24) / sysconf(_SC_PAGESIZE)) { + if (zswpin < MB(24) / page_size) { ksft_print_msg("at least 24MB should be brought back from zswap\n"); goto out; } @@ -272,9 +274,8 @@ static int test_zswapin(const char *root) */ static int attempt_writeback(const char *cgroup, void *arg) { - long pagesize =3D sysconf(_SC_PAGESIZE); size_t memsize =3D MB(4); - char buf[pagesize]; + char buf[page_size]; long zswap_usage; bool wb_enabled =3D *(bool *) arg; int ret =3D -1; @@ -289,11 +290,11 @@ static int attempt_writeback(const char *cgroup, void= *arg) * half empty, this will result in data that is still compressible * and ends up in zswap, with material zswap usage. */ - for (int i =3D 0; i < pagesize; i++) - buf[i] =3D i < pagesize/2 ? (char) i : 0; + for (int i =3D 0; i < page_size; i++) + buf[i] =3D i < page_size/2 ? (char) i : 0; =20 - for (int i =3D 0; i < memsize; i +=3D pagesize) - memcpy(&mem[i], buf, pagesize); + for (int i =3D 0; i < memsize; i +=3D page_size) + memcpy(&mem[i], buf, page_size); =20 /* Try and reclaim allocated memory */ if (cg_write_numeric(cgroup, "memory.reclaim", memsize)) { @@ -304,8 +305,8 @@ static int attempt_writeback(const char *cgroup, void *= arg) zswap_usage =3D cg_read_long(cgroup, "memory.zswap.current"); =20 /* zswpin */ - for (int i =3D 0; i < memsize; i +=3D pagesize) { - if (memcmp(&mem[i], buf, pagesize)) { + for (int i =3D 0; i < memsize; i +=3D page_size) { + if (memcmp(&mem[i], buf, page_size)) { ksft_print_msg("invalid memory\n"); goto out; } @@ -441,7 +442,7 @@ static int test_no_invasive_cgroup_shrink(const char *r= oot) if (cg_enter_current(control_group)) goto out; control_allocation =3D malloc(control_allocation_size); - for (int i =3D 0; i < control_allocation_size; i +=3D 4095) + for (int i =3D 0; i < control_allocation_size; i +=3D page_size) control_allocation[i] =3D 'a'; if (cg_read_key_long(control_group, "memory.stat", "zswapped") < 1) goto out; @@ -481,7 +482,7 @@ static int no_kmem_bypass_child(const char *cgroup, voi= d *arg) values->child_allocated =3D true; return -1; } - for (long i =3D 0; i < values->target_alloc_bytes; i +=3D 4095) + for (long i =3D 0; i < values->target_alloc_bytes; i +=3D page_size) ((char *)allocation)[i] =3D 'a'; values->child_allocated =3D true; pause(); @@ -529,7 +530,7 @@ static int test_no_kmem_bypass(const char *root) min_free_kb_low =3D sys_info.totalram / 500000; values->target_alloc_bytes =3D (sys_info.totalram - min_free_kb_high * 10= 00) + sys_info.totalram * 5 / 100; - stored_pages_threshold =3D sys_info.totalram / 5 / 4096; + stored_pages_threshold =3D sys_info.totalram / 5 / page_size; trigger_allocation_size =3D sys_info.totalram / 20; =20 /* Set up test memcg */ @@ -556,7 +557,7 @@ static int test_no_kmem_bypass(const char *root) =20 if (!trigger_allocation) break; - for (int i =3D 0; i < trigger_allocation_size; i +=3D 4095) + for (int i =3D 0; i < trigger_allocation_size; i +=3D page_size) trigger_allocation[i] =3D 'b'; usleep(100000); free(trigger_allocation); @@ -567,8 +568,8 @@ static int test_no_kmem_bypass(const char *root) /* If memory was pushed to zswap, verify it belongs to memcg */ if (stored_pages > stored_pages_threshold) { int zswapped =3D cg_read_key_long(test_group, "memory.stat", "zswapped = "); - int delta =3D stored_pages * 4096 - zswapped; - int result_ok =3D delta < stored_pages * 4096 / 4; + int delta =3D stored_pages * page_size - zswapped; + int result_ok =3D delta < stored_pages * page_size / 4; =20 ret =3D result_ok ? KSFT_PASS : KSFT_FAIL; break; @@ -622,7 +623,7 @@ static int allocate_random_and_wait(const char *cgroup,= void *arg) close(fd); =20 /* Touch all pages to ensure they're faulted in */ - for (size_t i =3D 0; i < size; i +=3D PAGE_SIZE) + for (size_t i =3D 0; i < size; i +=3D page_size) mem[i] =3D mem[i]; =20 /* Use MADV_PAGEOUT to push pages into zswap */ @@ -752,6 +753,10 @@ int main(int argc, char **argv) char root[PATH_MAX]; int i; =20 + page_size =3D sysconf(_SC_PAGE_SIZE); + if (page_size <=3D 0) + page_size =3D BUF_SIZE; + ksft_print_header(); ksft_set_plan(ARRAY_SIZE(tests)); if (cg_find_unified_root(root, sizeof(root), NULL)) --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-179.mta1.migadu.com (out-179.mta1.migadu.com [95.215.58.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00C833246E8 for ; Fri, 24 Apr 2026 04:02:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003353; cv=none; b=m/9KxDfVYDxBoutC9wDNT8b6s+IGbPb2DxXZFjdTsVQLmA5jNjTaGWmNhHXfMU0fz/MPb49o3QoCp8etdWGwg2ib5jUT8+Kl/xGwuGp6xcW9c+X26N1bidkg2/4oDQLwI58yOAcQhOOsw1tesWR+1DhCksQWs2pHA/D6oC9JZeE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003353; c=relaxed/simple; bh=utZ738OGl73LzJiF6YHM3dMz7vv57RepQYdH2mAwAAQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Suka9XRHc4vDVGlxEnRiDpO7Mk6I+os9GLCrzZObaFezTEYni1ReLDV0LHp63FyY84GHT1a1lFx3GXh//hBEJmSTihDutIUW5ck1jyzekYRWVAFaKJf60jhKDt9HfkduRmL/Wse7PTat8jfMEo5zh0Eh/2iGNfEcSD9QC04kX5g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=k6tohs+/; arc=none smtp.client-ip=95.215.58.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="k6tohs+/" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003350; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RYJS1j8xw/dE6gWhFGa+SZVgGWdk++DoAWVOoCmadVc=; b=k6tohs+/IUwCKmIckdzo9H7BiDELRkL8d9a1LjRMVUOFSnHlJvCOEh1BAkKvsx7fwDGH1E B7nqkXTMMb6SP21snYZwjyb30sgQFLZSn8GMvx5BaiRoCucgeUyjU8oP38gQwqMLQ0Of/B 9yEHxnyhvPYZepXFZ1FYmMOQfsuyEAE= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt , Yosry Ahmed Subject: [PATCH v7 6/8] selftest/cgroup: fix zswap test_no_invasive_cgroup_shrink on large pagesize system Date: Fri, 24 Apr 2026 12:00:57 +0800 Message-ID: <20260424040059.12940-7-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT test_no_invasive_cgroup_shrink sets up two cgroups: wb_group, which is expected to trigger zswap writeback, and a control group (renamed to zw_group), which should only have pages sitting in zswap without any writeback. There are two problems with the current test: 1) The data patterns are reversed. wb_group uses allocate_bytes(), which writes only a single byte per page =E2=80=94 trivially compressible, especially by zstd =E2=80=94 so compressed pages fit within zswap.max and writeback is never triggered. Meanwhile, the control group uses getrandom() to produce hard-to-compress data, but it is the group that does *not* need writeback. 2) The test uses fixed sizes (10K zswap.max, 10MB allocation) that are too small on systems with large PAGE_SIZE (e.g. 64K), failing to build enough memory pressure to trigger writeback reliably. Fix both issues by: - Swapping the data patterns: fill wb_group pages with partially random data (getrandom for page_size/4 bytes) to resist compression and trigger writeback, and fill zw_group pages with simple repeated data to stay compressed in zswap. - Making all size parameters PAGE_SIZE-aware: set allocation size to PAGE_SIZE * 1024, memory.zswap.max to PAGE_SIZE, and memory.max to allocation_size / 2 for both cgroups. - Allocating memory inline instead of via cg_run() so the pages remain resident throughout the test. =3D=3D=3D Error Log =3D=3D=3D # getconf PAGESIZE 65536 # ./test_zswap TAP version 13 ... ok 5 test_zswap_writeback_disabled ok 6 # SKIP test_no_kmem_bypass not ok 7 test_no_invasive_cgroup_shrink Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Cc: Yosry Ahmed Acked-by: Nhat Pham --- tools/testing/selftests/cgroup/test_zswap.c | 70 ++++++++++++++------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 23ff11390a3..8f0478923bd 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -11,6 +11,7 @@ #include #include #include +#include =20 #include "kselftest.h" #include "cgroup_util.h" @@ -426,44 +427,71 @@ static int test_zswap_writeback_disabled(const char *= root) static int test_no_invasive_cgroup_shrink(const char *root) { int ret =3D KSFT_FAIL; - size_t control_allocation_size =3D MB(10); - char *control_allocation =3D NULL, *wb_group =3D NULL, *control_group =3D= NULL; + unsigned int off; + size_t allocation_size =3D page_size * 1024; + unsigned int nr_pages =3D allocation_size / page_size; + char zswap_max_buf[32], mem_max_buf[32]; + char *zw_allocation =3D NULL, *wb_allocation =3D NULL; + char *zw_group =3D NULL, *wb_group =3D NULL; + + snprintf(zswap_max_buf, sizeof(zswap_max_buf), "%d", page_size); + snprintf(mem_max_buf, sizeof(mem_max_buf), "%zu", allocation_size / 2); =20 wb_group =3D setup_test_group_1M(root, "per_memcg_wb_test1"); if (!wb_group) return KSFT_FAIL; - if (cg_write(wb_group, "memory.zswap.max", "10K")) + if (cg_write(wb_group, "memory.zswap.max", zswap_max_buf)) + goto out; + if (cg_write(wb_group, "memory.max", mem_max_buf)) + goto out; + + zw_group =3D setup_test_group_1M(root, "per_memcg_wb_test2"); + if (!zw_group) goto out; - control_group =3D setup_test_group_1M(root, "per_memcg_wb_test2"); - if (!control_group) + if (cg_write(zw_group, "memory.max", mem_max_buf)) goto out; =20 - /* Push some test_group2 memory into zswap */ - if (cg_enter_current(control_group)) + /* Push some zw_group memory into zswap (simple data, easy to compress) */ + if (cg_enter_current(zw_group)) goto out; - control_allocation =3D malloc(control_allocation_size); - for (int i =3D 0; i < control_allocation_size; i +=3D page_size) - control_allocation[i] =3D 'a'; - if (cg_read_key_long(control_group, "memory.stat", "zswapped") < 1) + zw_allocation =3D malloc(allocation_size); + for (int i =3D 0; i < nr_pages; i++) { + off =3D (unsigned long)i * page_size; + memset(&zw_allocation[off], 0, page_size); + memset(&zw_allocation[off], 'a', page_size/4); + } + if (cg_read_key_long(zw_group, "memory.stat", "zswapped") < 1) goto out; =20 - /* Allocate 10x memory.max to push wb_group memory into zswap and trigger= wb */ - if (cg_run(wb_group, allocate_bytes, (void *)MB(10))) + /* Push wb_group memory into zswap with hard-to-compress data to trigger = wb */ + if (cg_enter_current(wb_group)) + goto out; + wb_allocation =3D malloc(allocation_size); + if (!wb_allocation) goto out; + for (int i =3D 0; i < nr_pages; i++) { + off =3D (unsigned long)i * page_size; + memset(&wb_allocation[off], 0, page_size); + getrandom(&wb_allocation[off], page_size/4, 0); + } =20 /* Verify that only zswapped memory from gwb_group has been written back = */ - if (get_cg_wb_count(wb_group) > 0 && get_cg_wb_count(control_group) =3D= =3D 0) + if (get_cg_wb_count(wb_group) > 0 && get_cg_wb_count(zw_group) =3D=3D 0) ret =3D KSFT_PASS; out: cg_enter_current(root); - if (control_group) { - cg_destroy(control_group); - free(control_group); + if (zw_group) { + cg_destroy(zw_group); + free(zw_group); + } + if (wb_group) { + cg_destroy(wb_group); + free(wb_group); } - cg_destroy(wb_group); - free(wb_group); - if (control_allocation) - free(control_allocation); + if (zw_allocation) + free(zw_allocation); + if (wb_allocation) + free(wb_allocation); return ret; } =20 --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-176.mta1.migadu.com (out-176.mta1.migadu.com [95.215.58.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 84F72237713 for ; Fri, 24 Apr 2026 04:02:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003368; cv=none; b=uF1c90vz4zq3/aPqusHEoq3KXdf4+OHjQ3RL6ky80Ujw3hM/KRlny1mNs1c8MilUeKJVE2Dl5+Xs9PWlRX8ZiDE1nJJQtsjK10stxq97t9leLaAR5wf4PFrh68jtCrhseijrn2ta/R6axazqBV38OMhLuuuupnCbu6cSjuBhTA0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003368; c=relaxed/simple; bh=x1qJQuabx2IObDM37E0CnPhAzNweabdWCFnHMf42ZI4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tyKKvjdeOsT6hoNglNoH2BJpHKW2c61vP7uL9Pg3kRamQYhjH4inExIlrNw2Tm9yd+35Zj0FuePpHg0GEI3RdRmxmDnH3gGtAT9GjQoXvdujMdkqr1720EPKgEiq3rQuhDDobn9XGZdnj1rfCjQtzo4hULxtk1Jp96sB6EV8jvA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=U5fjPqF+; arc=none smtp.client-ip=95.215.58.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="U5fjPqF+" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003364; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FdU7Rewe0JBnvI+IPS10alBnrpSA6+jzICgCf1+ep1U=; b=U5fjPqF+pm76sZZaxN+3woOitsl6wVvsvP9t/e4ULmjo3veM4lWVgJjWTRsEplnE37Kr3r VQ21e7PjO8fKU0qLT1WAdg6kCaUmJOW+3ZFViARe1zenaAHAUlZpmIDPKhUC+f0r1E+rCm jDJmH9BVwhZ/Fm7ocQQR/R4r/AHxTLg= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt Subject: [PATCH v7 7/8] selftest/cgroup: fix zswap attempt_writeback() on 64K pagesize system Date: Fri, 24 Apr 2026 12:00:58 +0800 Message-ID: <20260424040059.12940-8-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT In attempt_writeback(), a memsize of 4M only covers 64 pages on 64K page size systems. When memory.reclaim is called, the kernel prefers reclaiming clean file pages (binary, libc, linker, etc.) over swapping anonymous pages. With only 64 pages of anonymous memory, the reclaim target can be largely or entirely satisfied by dropping file pages, resulting in very few or zero anonymous pages being pushed into zswap. This causes zswap_usage to be extremely small or zero, making zswap_usage/4 insufficient to create meaningful writeback pressure. The test then fails because no writeback is triggered. On 4K page size systems this is not an issue because 4M covers 1024 pages, and file pages are a small fraction of the reclaim target. Fix this by: - Always allocating 1024 pages regardless of page size. This ensures enough anonymous pages to reliably populate zswap and trigger writeback, while keeping the original 4M allocation on 4K systems. - Setting zswap.max to zswap_usage/4 instead of zswap_usage/2 to create stronger writeback pressure, ensuring reclaim reliably triggers writeback even on large page size systems. =3D=3D=3D Error Log =3D=3D=3D # uname -rm 6.12.0-211.el10.ppc64le ppc64le # getconf PAGESIZE 65536 # ./test_zswap TAP version 13 1..7 ok 1 test_zswap_usage ok 2 test_swapin_nozswap ok 3 test_zswapin not ok 4 test_zswap_writeback_enabled ... Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Acked-by: Yosry Ahmed Acked-by: Nhat Pham --- tools/testing/selftests/cgroup/test_zswap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 8f0478923bd..5fe0cffb557 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -268,14 +268,14 @@ static int test_zswapin(const char *root) This will move it into zswap. * 3. Save current zswap usage. * 4. Move the memory allocated in step 1 back in from zswap. - * 5. Set zswap.max to half the amount that was recorded in step 3. + * 5. Set zswap.max to 1/4 of the amount that was recorded in step 3. * 6. Attempt to reclaim memory equal to the amount that was allocated, this will either trigger writeback if it's enabled, or reclamation will fail if writeback is disabled as there isn't enough zswap space. */ static int attempt_writeback(const char *cgroup, void *arg) { - size_t memsize =3D MB(4); + size_t memsize =3D page_size * 1024; char buf[page_size]; long zswap_usage; bool wb_enabled =3D *(bool *) arg; @@ -313,12 +313,12 @@ static int attempt_writeback(const char *cgroup, void= *arg) } } =20 - if (cg_write_numeric(cgroup, "memory.zswap.max", zswap_usage/2)) + if (cg_write_numeric(cgroup, "memory.zswap.max", zswap_usage/4)) goto out; =20 /* * If writeback is enabled, trying to reclaim memory now will trigger a - * writeback as zswap.max is half of what was needed when reclaim ran the= first time. + * writeback as zswap.max is 1/4 of what was needed when reclaim ran the = first time. * If writeback is disabled, memory reclaim will fail as zswap is limited= and * it can't writeback to swap. */ --=20 2.53.0 From nobody Fri Jun 12 11:26:08 2026 Received: from out-181.mta1.migadu.com (out-181.mta1.migadu.com [95.215.58.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC4D83246E8 for ; Fri, 24 Apr 2026 04:02:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003381; cv=none; b=l+AURF7DMzS/cAxofV9Z/Cd6rW+ziPUwHYPZwxZmOltwdrf753xrje800tzITb7tp4EsL1TiIefbg3QuNo3IyG9GcgY1ddysEL8ImGDNKr7Hrdd2PpnrfDUq/E3iTOvENexedD218NZH3QUugmuAzjg1rzoat0cWoG933qygSao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777003381; c=relaxed/simple; bh=CMNT5sN5+7AQKjMXzhi6cwxcBwvcrLjWcEFHTXWjp/A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sKI9WAXz6Sf95+A5m8Q0PL8t9eNzcthplAv6Dexvugi5V+MFeMtV3nG+pKp0+QjofKrIt3Pk+33HZFGXpn643ybbP+tbF0OGuMOm0e3ZA2F7pCuxVpej+O9LjakqH8ayZNQ5O4B2m+776Q7Phd9vpDu6H9ujRtB/KSWl7L+3mE4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=u2UUUdOL; arc=none smtp.client-ip=95.215.58.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="u2UUUdOL" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1777003378; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VcJ71eB0Ct26LCodBxWEDWyUKWisA2ZlGgHlF6yt2M8=; b=u2UUUdOLq/sTdbKir0hjZ104Y8LIJpS74cn7qDT1LzGQvC8x59z4JKTAYYFv+Mi2wy77jP 0erlRvbTWrp6xVDva3XA8Q9mWdOuWMDPKHx9XMzdrSkIVihGcR7+omGvoVjKtNcjcQJGTn HOhQ3z3hpFynAlwnZwurAZ3K3oZ/krY= From: Li Wang To: akpm@linux-foundation.org, tj@kernel.org, longman@redhat.com, roman.gushchin@linux.dev, hannes@cmpxchg.org, yosry@kernel.org, jiayuan.chen@linux.dev, nphamcs@gmail.com, chengming.zhou@linux.dev, mkoutny@suse.com, shuah@kernel.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko , Muchun Song , Shakeel Butt , Yosry Ahmed Subject: [PATCH v7 8/8] selftests/cgroup: test_zswap: wait for asynchronous writeback Date: Fri, 24 Apr 2026 12:00:59 +0800 Message-ID: <20260424040059.12940-9-li.wang@linux.dev> In-Reply-To: <20260424040059.12940-1-li.wang@linux.dev> References: <20260424040059.12940-1-li.wang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT zswap writeback is asynchronous, but test_zswap.c checks writeback counters immediately after reclaim/trigger paths. On some platforms (e.g. ppc64le), this can race with background writeback and cause spurious failures even when behavior is correct. Add wait_for_writeback() to poll get_cg_wb_count() with a bounded timeout, and use it in: test_zswap_writeback_one() when writeback is expected test_no_invasive_cgroup_shrink() for the wb_group check This keeps the original before/after assertion style while making the tests robust against writeback completion latency. No test behavior change, selftest stability improvement only. Signed-off-by: Li Wang Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Koutn=C3=BD Cc: Muchun Song Cc: Nhat Pham Cc: Tejun Heo Cc: Roman Gushchin Cc: Shakeel Butt Cc: Yosry Ahmed Acked-by: Nhat Pham --- tools/testing/selftests/cgroup/test_zswap.c | 28 +++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 5fe0cffb557..49b36ee7916 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -120,6 +120,27 @@ static char *setup_test_group_1M(const char *root, con= st char *name) return NULL; } =20 +/* + * Writeback is asynchronous; poll until at least one writeback has + * been recorded for @cg, or until @timeout_ms has elapsed. + */ +static long wait_for_writeback(const char *cg, int timeout_ms) +{ + long elapsed, count; + for (elapsed =3D 0; elapsed < timeout_ms; elapsed +=3D 100) { + count =3D get_cg_wb_count(cg); + + if (count < 0) + return -1; + if (count > 0) + return count; + + usleep(100000); + } + + return 0; +} + /* * Sanity test to check that pages are written into zswap. */ @@ -345,7 +366,10 @@ static int test_zswap_writeback_one(const char *cgroup= , bool wb) return -1; =20 /* Verify that zswap writeback occurred only if writeback was enabled */ - zswpwb_after =3D get_cg_wb_count(cgroup); + if (wb) + zswpwb_after =3D wait_for_writeback(cgroup, 5000); + else + zswpwb_after =3D get_cg_wb_count(cgroup); if (zswpwb_after < 0) return -1; =20 @@ -476,7 +500,7 @@ static int test_no_invasive_cgroup_shrink(const char *r= oot) } =20 /* Verify that only zswapped memory from gwb_group has been written back = */ - if (get_cg_wb_count(wb_group) > 0 && get_cg_wb_count(zw_group) =3D=3D 0) + if (wait_for_writeback(wb_group, 5000) > 0 && get_cg_wb_count(zw_group) = =3D=3D 0) ret =3D KSFT_PASS; out: cg_enter_current(root); --=20 2.53.0