From nobody Sat Sep 26 03:50:47 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8731138B7D6 for ; Fri, 4 Sep 2026 22:51:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788562271; cv=none; b=ppQVHH6TDOLdEh3NbiWEzao8mW1ht1zQ5OB8xhpl+hwxOVjRCcL1WhxXUoiNwKc335jR4uuzA+ZOhIqgq4vKBp4fxgFtCsfsyAyMmRyc0wUpyoSxIn38/+BG20/SI/8tQbW/WfcRKyoAvI3ohrn6aTuMH8iNe4ZwI6wj+LwQsZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788562271; c=relaxed/simple; bh=BH0sJiRzFlk64hqG4rCWsKMMTvzMukqzBxeOy8VRpSU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ltud7l7dgV11sUitgewh0Xmaxzm12glD3ojnb0VfJoHnEkJlKme4V8oVuEggnEHFXOrPmYW1OhTiWzdIz0ooO+P7OgiFohfJwe/b7dYwREA9jUWUoa3KMoJtNiZJjX7v04qQt73fFppjkM5xHisrf4aTFQ0B0EMYP//fM0x2PIM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wfelipe.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AwWmW932; arc=none smtp.client-ip=209.85.215.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wfelipe.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AwWmW932" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-cc1c1cc5206so1833000a12.3 for ; Fri, 04 Sep 2026 15:51:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788562269; x=1789167069; darn=vger.kernel.org; h=content-transfer-encoding:content-type:cc:to:from:subject :message-id:references:mime-version:in-reply-to:date:from:to:cc :subject:date:message-id:reply-to:content-type; bh=etVT3JR9OsRtloAyimt/t5S2ubPCA2IZVBKjgKO3AfA=; b=AwWmW932FkhjNUV6DIYweOvyEHcmC+At/HTdWgGsKzsaMLu41wtvvOQkahEZfEwFl1 vHtrO4tB+YiweA/OBUXJE8DY5OUO4qTFZJhts0/onDK1jIAeoWNoQ7ztTz5nCvCIxLAF 3dcn1FDWawsnRbGsDQEP1kH6n+hSAGVOw0Qce4aYhEJyJwzyWURAcxIe2EKGOOvkO5Px G3+a6VcvzPClmn0x5MuDwhgqtjb9TkVwWS4g4CmrR6cpvOKa7QRRkjKbaDrGS/6S7uiM gg02gYVjfYLqT7hi5nhnhrnNx1pFiRgHr0HzsCrLpYplizdHlij+FP6mb5lxMg9YNxLf vHNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788562269; x=1789167069; h=content-transfer-encoding:content-type:cc:to:from:subject :message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=etVT3JR9OsRtloAyimt/t5S2ubPCA2IZVBKjgKO3AfA=; b=EY8xSVS06vixVSfThKXZ5h4NVZWKCjWl20JO6qBfTezpTrhvLfsDN6tH35ISqdsg3H NqNvHbbx442YOBSoeBpjyUipJDFcL2wXfBpUe+z8nvVMrDfw9l/GnBCPoOML8WjA/OHt a1RinM3de/iWc3PEkAiWEQ4nBP+RK8Vf2gmtkmCBSwbsJp6Q0ayUAAGHittuBKi43RPN fhMU6rd1T0y3Sc8FEQd4JT7Ljv3y7NMXXuspiFeo+SAwHMPxP699l1ztiWbuQrwPObrm mBTgPC2A0S9Vmx/K0kSYcfW+qtEDF3LYYp0WRm8SyaPb66qiMoZ/UXs8zRenX5/Esj6T l3KQ== X-Forwarded-Encrypted: i=1; AKwUvBzKWPVLCRwKOXtltvkrectV30tehc0eqDekZbw+En1mQNl3G52huFvgCqrTI/FsknKaWLI3W0kIpDF6XjU=@vger.kernel.org X-Gm-Message-State: AFuF++naCjvMEwUmfw6pBNPNlq6OGB7+8TUnaxNM1sOi9YOC4sdqRSXf zBEEPvtctGQwfEIQKqzkKJ3ww/DltifVm9i7m9OTBRDUvtq/1Fhr+1ksnc+Qk+CKxM4jRv4ys4J Q4Byjvpj9SQ== X-Received: from pgu38.prod.google.com ([2002:a63:1466:0:b0:c9a:53ea:434a]) (user=wfelipe job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:4388:b0:3da:1e2f:3be9 with SMTP id adf61e73a8af0-3da3a0b0070mr14239936637.22.1788562268577; Fri, 04 Sep 2026 15:51:08 -0700 (PDT) Date: Fri, 4 Sep 2026 22:45:13 +0000 In-Reply-To: <20260904225103.2955759-1-wfelipe@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260904225103.2955759-1-wfelipe@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260904225103.2955759-2-wfelipe@google.com> Subject: [PATCH v6 1/3] selftests/cgroup: test_zswap: wait for cgroup to unpopulate in test_zswap_writeback From: Wilson Felipe Pereira To: Andrew Morton , Johannes Weiner , Yosry Ahmed , Nhat Pham , Chengming Zhou , Tejun Heo , "=?UTF-8?q?Michal=20Koutn=C3=BD?=" , Shuah Khan Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Wilson Felipe Pereira Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When running test_zswap on a single-core VM (-smp 1) with 4GB of RAM, test_zswap_writeback intermittently fails on the initial run after boot. In test_zswap_writeback(), after waitpid() reaps the child process created by test_zswap_writeback_one(), writing "+memory" to cgroup.subtree_control can fail with -EBUSY. Under cgroup v2, enabling domain subtree controllers is forbidden while any tasks remain in cgroup.procs. When a child process exits, exit_notify() wakes the parent process, allowing waitpid() to return immediately. However, the cgroup populated task count (nr_populated_csets) is only decremented when the exiting task is switched away via finish_task_switch() -> cgroup_task_dead(). On single-core systems, the parent runs before the dead child has been switched out, causing "+memory" to fail with -EBUSY if written immediately after waitpid() returns. Fix this by waiting for cgroup.events to report "populated 0\n" via cg_read_strcmp_wait() before enabling subtree control. Signed-off-by: Wilson Felipe Pereira Acked-by: Michal Koutn=C3=BD --- tools/testing/selftests/cgroup/test_zswap.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 609c48f38524..8f2c9aa4776c 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -408,6 +408,8 @@ static int test_zswap_writeback(const char *root, bool = wb) * Thus, the parent's setting shall be what's in effect. */ if (cg_write(test_group, "memory.zswap.max", "max")) goto out; + if (cg_read_strcmp_wait(test_group, "cgroup.events", "populated 0\n")) + goto out; if (cg_write(test_group, "cgroup.subtree_control", "+memory")) goto out; =20 --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 03:50:47 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82E55386443 for ; Fri, 4 Sep 2026 22:51:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788562274; cv=none; b=tsdiId8sKMNWPwS41zLR+IEwb465myUU11cN+zUEjXUL/xDSuzF0m9gQqQNWdorUsBS8Iz0xe0rhZ48b7t7S9aO5F8ejCXI780yq4cI9R6S0J7yxwFNKFu4e6/RoMa80PWRK3JN8Fja69ShEBuvhX7wsCLTUuEH2Ai/cOG42JaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788562274; c=relaxed/simple; bh=WiARXsVrcUN7nPEF+Rx5skQuwS7dCACWSBSEeBhA4Ww=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=C8WAlECGdtR3LDLoycmvIiL4YO6C0YWfGq5unzmdfLCHGcqEbDJwWCJYV5DbeqGRDrin4Z3UbDs++Lqh7ZNfTKqPX+VHNhFmFzHZS56mN5KzMQcgpMN1FPQqcfQzLQaKZT57F4D9kk6VdZ4lFuw7Byq6G6tjMBMbZ9h9kS9A+o8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wfelipe.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=HAj9O38j; arc=none smtp.client-ip=209.85.215.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wfelipe.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="HAj9O38j" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-cc1b8088202so1559313a12.3 for ; Fri, 04 Sep 2026 15:51:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788562270; x=1789167070; darn=vger.kernel.org; h=content-transfer-encoding:content-type:cc:to:from:subject :message-id:references:mime-version:in-reply-to:date:from:to:cc :subject:date:message-id:reply-to:content-type; bh=Vo1MFgtlqGPiG+qDdKpsYG1y1rkQIQcATIEbRYCEGj0=; b=HAj9O38jmIqY/U8Zg6WbrNgriBbAznbx1+Z8TaSoqb6KnoaXhaSOU9bCOugcaLcoNW 9GmYKUThyz1rT1F4N3lkHu5Ivpt19dhpwqgqMIEX0hyhsuK8jtLDYRbkMjtgaM6KR9YT B4FNeI72ClkodFdTrsrd0qsHUZJvoEAdKMPuzu58VU0xI4DohbpMSKP3PQuYwoBuA2kU Py0zgwk89wTsL0JkDqfuEN/eLshaDDhSBHNNDjSO6WjghdRtVFOqjFrH4wSGpcMD8i2B bDxEFmzJRwiewgItN3z9f7+PMzeDx8xgCwICJWL+bPxT4mbfnZjHeAd08N3aguUmk3Wd Lb+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788562270; x=1789167070; h=content-transfer-encoding:content-type:cc:to:from:subject :message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Vo1MFgtlqGPiG+qDdKpsYG1y1rkQIQcATIEbRYCEGj0=; b=tTVXcrhhcApCpUmwKTbfyqxz59IPH6TVQNimYtBz7wqofnbSF7DdS9zwWqlasb9nCp Ybnzn5a5wITGkk/gWlzH7q1ni+Ev+OXox2VPf3zbi1c+9O05WlxWPJiSSQfbBF4TsTJp QxtNs24zUSg5iHM7UlGYI3OP8o1CxDXGZZ+YmP6/q+wwmSuOrrbBp/tDS6j/Y+mFaDVA dud/mv6JPuiwtwIAFCoor9NoLygeZeYuF+RRX10RHgKtr+5BUd3h9vNA5/OSZ7dUyt8Q nrKTyPnDaP3mjKM/7rMhqLJjErgDLsXtBLY2ITM0ABmhxYA/G8PlpG5guARqv7oobxIN 10rw== X-Forwarded-Encrypted: i=1; AKwUvByN8yU1EKKetYcn3QEDxvTbZZKJij0WRGPtinuWGLjiAnHRMSNS1gTSg5di66xPrXPyciM9Z2/c+W6l098=@vger.kernel.org X-Gm-Message-State: AFuF++nHy725dWa57Xn6lLAUJ7ibeI7pSCnVEfdw7Ckr8MWUQJTehE1I S3JufL5ZkI3+KCNYZlxTuel+EjD4nrce4VgU9Uq7YHjIWOL1JdkQtrzAH4S7QPVtLB2z7CWgDrv gTYEGLnrXiA== X-Received: from pgbj10-n1.prod.google.com ([2002:a05:6a02:61ca:10b0:cc1:c7d3:7c7b]) (user=wfelipe job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:e58b:b0:3b4:8880:2089 with SMTP id adf61e73a8af0-3da3a0aa620mr14983327637.16.1788562269370; Fri, 04 Sep 2026 15:51:09 -0700 (PDT) Date: Fri, 4 Sep 2026 22:45:14 +0000 In-Reply-To: <20260904225103.2955759-1-wfelipe@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260904225103.2955759-1-wfelipe@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260904225103.2955759-3-wfelipe@google.com> Subject: [PATCH v6 2/3] selftests/cgroup: convert cg_read_key_*() helpers to s64 From: Wilson Felipe Pereira To: Andrew Morton , Johannes Weiner , Yosry Ahmed , Nhat Pham , Chengming Zhou , Tejun Heo , "=?UTF-8?q?Michal=20Koutn=C3=BD?=" , Shuah Khan Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Wilson Felipe Pereira Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In the kernel, cgroup statistics and event counters in multi-key control files (such as memory.stat, cpu.stat, and memory.events) are internally stored and exported as 64-bit values. On 32-bit platforms, cg_read_key_long() relies on atol(), which returns a 32-bit signed long. When values in memory.stat or event counters exceed 2.14GB (such as on 32-bit systems with large memory), the parsed value overflows and wraps into negative numbers, leading to subtle bugs and false test failures. Standardize on explicitly-sized 64-bit helpers and types across the cgroup selftests: - Define s64 in cgroup_util.h as signed long long. - Convert cg_read_key_long() to cg_read_key_s64() using atoll(). - Convert cg_read_key_long_poll() to cg_read_key_s64_poll(), updating both the return type and the expected argument to s64. - Update values_close() and values_close_report() to operate on s64 and use llabs() to prevent downcasting/truncation of 64-bit differences. - Migrate helper functions (get_cg_wb_count(), get_zswpout(), get_zswap_incomp(), wait_for_writeback(), and cg_check_freezetime()) and their callers to s64. - Migrate all callers across test_cpu, test_kmem, test_memcontrol, test_pids, test_freezer, and test_zswap to cg_read_key_s64(). - Update corresponding printf formats to %lld and difference checks to llabs() for s64. Suggested-by: Michal Koutn=C3=BD Signed-off-by: Wilson Felipe Pereira --- .../selftests/cgroup/lib/cgroup_util.c | 14 ++-- .../cgroup/lib/include/cgroup_util.h | 22 +++--- tools/testing/selftests/cgroup/test_cpu.c | 47 ++++++------- tools/testing/selftests/cgroup/test_freezer.c | 16 ++--- tools/testing/selftests/cgroup/test_kmem.c | 56 ++++++++------- .../selftests/cgroup/test_memcontrol.c | 69 ++++++++++--------- tools/testing/selftests/cgroup/test_pids.c | 5 +- tools/testing/selftests/cgroup/test_zswap.c | 54 ++++++++------- 8 files changed, 148 insertions(+), 135 deletions(-) diff --git a/tools/testing/selftests/cgroup/lib/cgroup_util.c b/tools/testi= ng/selftests/cgroup/lib/cgroup_util.c index 2596c12cd864..ed3c4893833a 100644 --- a/tools/testing/selftests/cgroup/lib/cgroup_util.c +++ b/tools/testing/selftests/cgroup/lib/cgroup_util.c @@ -172,7 +172,7 @@ long cg_read_long_fd(int fd) return atol(buf); } =20 -long cg_read_key_long(const char *cgroup, const char *control, const char = *key) +s64 cg_read_key_s64(const char *cgroup, const char *control, const char *k= ey) { char buf[BUF_SIZE]; char *ptr; @@ -184,18 +184,18 @@ long cg_read_key_long(const char *cgroup, const char = *control, const char *key) if (!ptr) return -1; =20 - return atol(ptr + strlen(key)); + return atoll(ptr + strlen(key)); } =20 -long cg_read_key_long_poll(const char *cgroup, const char *control, - const char *key, long expected, int retries, - useconds_t wait_interval_us) +s64 cg_read_key_s64_poll(const char *cgroup, const char *control, + const char *key, s64 expected, int retries, + useconds_t wait_interval_us) { - long val =3D -1; + s64 val =3D -1; int i; =20 for (i =3D 0; i < retries; i++) { - val =3D cg_read_key_long(cgroup, control, key); + val =3D cg_read_key_s64(cgroup, control, key); if (val < 0) return val; =20 diff --git a/tools/testing/selftests/cgroup/lib/include/cgroup_util.h b/too= ls/testing/selftests/cgroup/lib/include/cgroup_util.h index 5d39c709ac7a..ddb05932d9c7 100644 --- a/tools/testing/selftests/cgroup/lib/include/cgroup_util.h +++ b/tools/testing/selftests/cgroup/lib/include/cgroup_util.h @@ -2,6 +2,8 @@ #include #include =20 +typedef signed long long s64; + #ifndef BUF_SIZE #define BUF_SIZE 4096 #endif @@ -24,25 +26,25 @@ /* * Checks if two given values differ by less than err% of their sum. */ -static inline int values_close(long a, long b, int err) +static inline int values_close(s64 a, s64 b, int err) { - return labs(a - b) <=3D (a + b) / 100 * err; + return llabs(a - b) <=3D (a + b) / 100 * err; } =20 /* * Checks if two given values differ by less than err% of their sum and as= sert * with detailed debug info if not. */ -static inline int values_close_report(long a, long b, int err) +static inline int values_close_report(s64 a, s64 b, int err) { - long diff =3D labs(a - b); - long limit =3D (a + b) / 100 * err; + s64 diff =3D llabs(a - b); + s64 limit =3D (a + b) / 100 * err; double actual_err =3D (a + b) ? (100.0 * diff / (a + b)) : 0.0; int close =3D diff <=3D limit; =20 if (!close) fprintf(stderr, - "[FAIL] actual=3D%ld expected=3D%ld | diff=3D%ld | limit=3D%ld | " + "[FAIL] actual=3D%lld expected=3D%lld | diff=3D%lld | limit=3D%lld | " "tolerance=3D%d%% | actual_error=3D%.2f%%\n", a, b, diff, limit, err, actual_err); =20 @@ -69,10 +71,10 @@ extern int cg_read_strstr(const char *cgroup, const cha= r *control, const char *needle); extern long cg_read_long(const char *cgroup, const char *control); extern long cg_read_long_fd(int fd); -long cg_read_key_long(const char *cgroup, const char *control, const char = *key); -long cg_read_key_long_poll(const char *cgroup, const char *control, - const char *key, long expected, int retries, - useconds_t wait_interval_us); +s64 cg_read_key_s64(const char *cgroup, const char *control, const char *k= ey); +s64 cg_read_key_s64_poll(const char *cgroup, const char *control, + const char *key, s64 expected, int retries, + useconds_t wait_interval_us); extern long cg_read_lc(const char *cgroup, const char *control); extern int cg_write(const char *cgroup, const char *control, char *buf); extern int cg_open(const char *cgroup, const char *control, int flags); diff --git a/tools/testing/selftests/cgroup/test_cpu.c b/tools/testing/self= tests/cgroup/test_cpu.c index 735a53bb222b..11da1de9cdeb 100644 --- a/tools/testing/selftests/cgroup/test_cpu.c +++ b/tools/testing/selftests/cgroup/test_cpu.c @@ -24,7 +24,7 @@ enum hog_clock_type { struct cpu_hogger { char *cgroup; pid_t pid; - long usage; + s64 usage; }; =20 struct cpu_hog_func_param { @@ -185,7 +185,7 @@ static int hog_cpus_timed(const char *cgroup, void *arg) static int test_cpucg_stats(const char *root) { int ret =3D KSFT_FAIL; - long usage_usec, user_usec, system_usec; + s64 usage_usec, user_usec, system_usec; long usage_seconds =3D 2; long expected_usage_usec =3D usage_seconds * USEC_PER_SEC; char *cpucg; @@ -197,9 +197,9 @@ static int test_cpucg_stats(const char *root) if (cg_create(cpucg)) goto cleanup; =20 - usage_usec =3D cg_read_key_long(cpucg, "cpu.stat", "usage_usec"); - user_usec =3D cg_read_key_long(cpucg, "cpu.stat", "user_usec"); - system_usec =3D cg_read_key_long(cpucg, "cpu.stat", "system_usec"); + usage_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "usage_usec"); + user_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "user_usec"); + system_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "system_usec"); if (usage_usec !=3D 0 || user_usec !=3D 0 || system_usec !=3D 0) goto cleanup; =20 @@ -214,8 +214,8 @@ static int test_cpucg_stats(const char *root) if (cg_run(cpucg, hog_cpus_timed, (void *)¶m)) goto cleanup; =20 - usage_usec =3D cg_read_key_long(cpucg, "cpu.stat", "usage_usec"); - user_usec =3D cg_read_key_long(cpucg, "cpu.stat", "user_usec"); + usage_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "usage_usec"); + user_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "user_usec"); if (user_usec <=3D 0) goto cleanup; =20 @@ -239,7 +239,7 @@ static int test_cpucg_nice(const char *root) { int ret =3D KSFT_FAIL; int status; - long user_usec, nice_usec; + s64 user_usec, nice_usec; long usage_seconds =3D 2; long expected_nice_usec =3D usage_seconds * USEC_PER_SEC; char *cpucg; @@ -252,8 +252,8 @@ static int test_cpucg_nice(const char *root) if (cg_create(cpucg)) goto cleanup; =20 - user_usec =3D cg_read_key_long(cpucg, "cpu.stat", "user_usec"); - nice_usec =3D cg_read_key_long(cpucg, "cpu.stat", "nice_usec"); + user_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "user_usec"); + nice_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "nice_usec"); if (nice_usec =3D=3D -1) ret =3D KSFT_SKIP; if (user_usec !=3D 0 || nice_usec !=3D 0) @@ -289,8 +289,8 @@ static int test_cpucg_nice(const char *root) if (!WIFEXITED(status)) goto cleanup; =20 - user_usec =3D cg_read_key_long(cpucg, "cpu.stat", "user_usec"); - nice_usec =3D cg_read_key_long(cpucg, "cpu.stat", "nice_usec"); + user_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "user_usec"); + nice_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "nice_usec"); if (user_usec <=3D 0) goto cleanup; if (!values_close_report(nice_usec, expected_nice_usec, 1)) @@ -357,8 +357,8 @@ run_cpucg_weight_test( } =20 for (i =3D 0; i < ARRAY_SIZE(children); i++) - children[i].usage =3D cg_read_key_long(children[i].cgroup, - "cpu.stat", "usage_usec"); + children[i].usage =3D cg_read_key_s64(children[i].cgroup, + "cpu.stat", "usage_usec"); =20 if (validate(children, ARRAY_SIZE(children))) goto cleanup; @@ -486,7 +486,7 @@ run_cpucg_nested_weight_test(const char *root, bool ove= rprovisioned) int ret =3D KSFT_FAIL, i; char *parent =3D NULL, *child =3D NULL; struct cpu_hogger leaf[3] =3D {}; - long nested_leaf_usage, child_usage; + s64 nested_leaf_usage, child_usage; int nprocs =3D get_nprocs(); =20 if (!overprovisioned) { @@ -567,8 +567,8 @@ run_cpucg_nested_weight_test(const char *root, bool ove= rprovisioned) } =20 for (i =3D 0; i < ARRAY_SIZE(leaf); i++) { - leaf[i].usage =3D cg_read_key_long(leaf[i].cgroup, - "cpu.stat", "usage_usec"); + leaf[i].usage =3D cg_read_key_s64(leaf[i].cgroup, "cpu.stat", + "usage_usec"); if (leaf[i].usage <=3D 0) goto cleanup; } @@ -580,8 +580,7 @@ run_cpucg_nested_weight_test(const char *root, bool ove= rprovisioned) } else if (!values_close_report(leaf[0].usage * 2, nested_leaf_usage, 15)) goto cleanup; =20 - - child_usage =3D cg_read_key_long(child, "cpu.stat", "usage_usec"); + child_usage =3D cg_read_key_s64(child, "cpu.stat", "usage_usec"); if (child_usage <=3D 0) goto cleanup; if (!values_close_report(child_usage, nested_leaf_usage, 1)) @@ -679,7 +678,8 @@ static int test_cpucg_max(const char *root) long duration_seconds =3D 1; =20 long duration_usec; - long usage_usec, n_periods, remainder_usec, expected_usage_usec; + long n_periods, remainder_usec, expected_usage_usec; + s64 usage_usec; char *cpucg; char quota_buf[32]; =20 @@ -708,7 +708,7 @@ static int test_cpucg_max(const char *root) if (cg_run(cpucg, hog_cpus_timed, (void *)¶m)) goto cleanup; =20 - usage_usec =3D cg_read_key_long(cpucg, "cpu.stat", "usage_usec"); + usage_usec =3D cg_read_key_s64(cpucg, "cpu.stat", "usage_usec"); if (usage_usec <=3D 0) goto cleanup; =20 @@ -746,7 +746,8 @@ static int test_cpucg_max_nested(const char *root) long duration_seconds =3D 1; =20 long duration_usec; - long usage_usec, n_periods, remainder_usec, expected_usage_usec; + long n_periods, remainder_usec, expected_usage_usec; + s64 usage_usec; char *parent, *child; char quota_buf[32]; =20 @@ -782,7 +783,7 @@ static int test_cpucg_max_nested(const char *root) if (cg_run(child, hog_cpus_timed, (void *)¶m)) goto cleanup; =20 - usage_usec =3D cg_read_key_long(child, "cpu.stat", "usage_usec"); + usage_usec =3D cg_read_key_s64(child, "cpu.stat", "usage_usec"); if (usage_usec <=3D 0) goto cleanup; =20 diff --git a/tools/testing/selftests/cgroup/test_freezer.c b/tools/testing/= selftests/cgroup/test_freezer.c index f28bb02e9783..f4f082c13d4b 100644 --- a/tools/testing/selftests/cgroup/test_freezer.c +++ b/tools/testing/selftests/cgroup/test_freezer.c @@ -807,10 +807,9 @@ static int test_cgfreezer_vfork(const char *root) /* * Get the current frozen_usec for the cgroup. */ -static long cg_check_freezetime(const char *cgroup) +static s64 cg_check_freezetime(const char *cgroup) { - return cg_read_key_long(cgroup, "cgroup.stat.local", - "frozen_usec "); + return cg_read_key_s64(cgroup, "cgroup.stat.local", "frozen_usec "); } =20 /* @@ -820,7 +819,7 @@ static int test_cgfreezer_time_empty(const char *root) { int ret =3D KSFT_FAIL; char *cgroup =3D NULL; - long prev, curr; + s64 prev, curr; =20 cgroup =3D cg_name(root, "cg_time_test_empty"); if (!cgroup) @@ -839,7 +838,7 @@ static int test_cgfreezer_time_empty(const char *root) goto cleanup; } if (curr > 0) { - debug("Expect time (%ld) to be 0\n", curr); + debug("Expect time (%lld) to be 0\n", curr); goto cleanup; } =20 @@ -853,8 +852,7 @@ static int test_cgfreezer_time_empty(const char *root) usleep(1000); curr =3D cg_check_freezetime(cgroup); if (curr < 1000) { - debug("Expect time (%ld) to be at least 1000 us\n", - curr); + debug("Expect time (%lld) to be at least 1000 us\n", curr); goto cleanup; } =20 @@ -867,7 +865,7 @@ static int test_cgfreezer_time_empty(const char *root) prev =3D curr; curr =3D cg_check_freezetime(cgroup); if (curr <=3D prev) { - debug("Expect time (%ld) to be more than previous check (%ld)\n", + debug("Expect time (%lld) to be more than previous check (%lld)\n", curr, prev); goto cleanup; } @@ -879,7 +877,7 @@ static int test_cgfreezer_time_empty(const char *root) prev =3D curr; curr =3D cg_check_freezetime(cgroup); if (curr !=3D prev) { - debug("Expect time (%ld) to be unchanged from previous check (%ld)\n", + debug("Expect time (%lld) to be unchanged from previous check (%lld)\n", curr, prev); goto cleanup; } diff --git a/tools/testing/selftests/cgroup/test_kmem.c b/tools/testing/sel= ftests/cgroup/test_kmem.c index 437f2d35f205..249898f3b81e 100644 --- a/tools/testing/selftests/cgroup/test_kmem.c +++ b/tools/testing/selftests/cgroup/test_kmem.c @@ -54,7 +54,8 @@ static int test_kmem_basic(const char *root) { int ret =3D KSFT_FAIL; char *cg =3D NULL; - long slab0, slab1, current; + s64 slab0, slab1; + long current; =20 cg =3D cg_name(root, "kmem_basic_test"); if (!cg) @@ -66,7 +67,7 @@ static int test_kmem_basic(const char *root) if (cg_run(cg, alloc_dcache, (void *)100000)) goto cleanup; =20 - slab0 =3D cg_read_key_long(cg, "memory.stat", "slab "); + slab0 =3D cg_read_key_s64(cg, "memory.stat", "slab "); if (slab0 < (1 << 20)) goto cleanup; =20 @@ -75,7 +76,7 @@ static int test_kmem_basic(const char *root) /* wait for RCU freeing */ sleep(1); =20 - slab1 =3D cg_read_key_long(cg, "memory.stat", "slab "); + slab1 =3D cg_read_key_s64(cg, "memory.stat", "slab "); if (slab1 < 0) goto cleanup; =20 @@ -167,7 +168,8 @@ static int cg_run_in_subcgroups(const char *parent, */ static int test_kmem_memcg_deletion(const char *root) { - long current, anon, file, kernel, sock, sum; + long current; + s64 anon, file, kernel, sock, sum; int ret =3D KSFT_FAIL; char *parent; =20 @@ -185,23 +187,23 @@ static int test_kmem_memcg_deletion(const char *root) goto cleanup; =20 current =3D cg_read_long(parent, "memory.current"); - anon =3D cg_read_key_long(parent, "memory.stat", "anon "); - file =3D cg_read_key_long(parent, "memory.stat", "file "); - kernel =3D cg_read_key_long(parent, "memory.stat", "kernel "); - sock =3D cg_read_key_long(parent, "memory.stat", "sock "); + anon =3D cg_read_key_s64(parent, "memory.stat", "anon "); + file =3D cg_read_key_s64(parent, "memory.stat", "file "); + kernel =3D cg_read_key_s64(parent, "memory.stat", "kernel "); + sock =3D cg_read_key_s64(parent, "memory.stat", "sock "); if (current < 0 || anon < 0 || file < 0 || kernel < 0 || sock < 0) goto cleanup; =20 sum =3D anon + file + kernel + sock; - if (labs(sum - current) < MAX_VMSTAT_ERROR) { + if (llabs(sum - current) < MAX_VMSTAT_ERROR) { ret =3D KSFT_PASS; } else { printf("memory.current =3D %ld\n", current); - printf("anon + file + kernel + sock =3D %ld\n", sum); - printf("anon =3D %ld\n", anon); - printf("file =3D %ld\n", file); - printf("kernel =3D %ld\n", kernel); - printf("sock =3D %ld\n", sock); + printf("anon + file + kernel + sock =3D %lld\n", sum); + printf("anon =3D %lld\n", anon); + printf("file =3D %lld\n", file); + printf("kernel =3D %lld\n", kernel); + printf("sock =3D %lld\n", sock); } =20 cleanup: @@ -248,7 +250,7 @@ static int spawn_1000_threads(const char *cgroup, void = *arg) int nr_threads =3D 1000; pthread_t *tinfo; unsigned long i; - long stack; + s64 stack; int ret =3D -1; =20 tinfo =3D calloc(nr_threads, sizeof(pthread_t)); @@ -263,7 +265,7 @@ static int spawn_1000_threads(const char *cgroup, void = *arg) } } =20 - stack =3D cg_read_key_long(cgroup, "memory.stat", "kernel_stack "); + stack =3D cg_read_key_s64(cgroup, "memory.stat", "kernel_stack "); if (stack >=3D 4096 * 1000) ret =3D 0; =20 @@ -307,7 +309,7 @@ static int test_kmem_dead_cgroups(const char *root) { int ret =3D KSFT_FAIL; char *parent; - long dead =3D -1; + s64 dead =3D -1; =20 parent =3D cg_name(root, "kmem_dead_cgroups_test"); if (!parent) @@ -328,9 +330,10 @@ static int test_kmem_dead_cgroups(const char *root) * from a specific kernel constant, and can be adjusted if reclaim * behavior changes in the future. */ - dead =3D cg_read_key_long_poll(parent, "cgroup.stat", - "nr_dying_descendants ", 0, KMEM_DEAD_WAIT_RETRIES, - DEFAULT_WAIT_INTERVAL_US); + dead =3D cg_read_key_s64_poll(parent, "cgroup.stat", + "nr_dying_descendants ", 0, + KMEM_DEAD_WAIT_RETRIES, + DEFAULT_WAIT_INTERVAL_US); if (dead) goto cleanup; =20 @@ -353,7 +356,8 @@ static int test_percpu_basic(const char *root) { int ret =3D KSFT_FAIL; char *parent, *child; - long current, percpu, slab; + long current; + s64 percpu, slab; int i; =20 parent =3D cg_name(root, "percpu_basic_test"); @@ -382,15 +386,15 @@ static int test_percpu_basic(const char *root) } =20 current =3D cg_read_long(parent, "memory.current"); - percpu =3D cg_read_key_long(parent, "memory.stat", "percpu "); - slab =3D cg_read_key_long(parent, "memory.stat", "slab "); + percpu =3D cg_read_key_s64(parent, "memory.stat", "percpu "); + slab =3D cg_read_key_s64(parent, "memory.stat", "slab "); =20 if (current > 0 && percpu > 0 && slab >=3D 0 && - labs(current - (percpu + slab)) < MAX_VMSTAT_ERROR) + llabs(current - (percpu + slab)) < MAX_VMSTAT_ERROR) ret =3D KSFT_PASS; else - printf("memory.current %ld\npercpu %ld\nslab %ld\ndelta %ld\n", - current, percpu, slab, current - (percpu + slab)); + printf("memory.current %ld\npercpu %lld\nslab %lld\ndelta %lld\n", + current, percpu, slab, current - (percpu + slab)); =20 cleanup_children: for (i =3D 0; i < 1000; i++) { diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testi= ng/selftests/cgroup/test_memcontrol.c index 3a84d068fbf3..539650c1d562 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -192,7 +192,8 @@ static int alloc_anon_50M_check(const char *cgroup, voi= d *arg) { size_t size =3D MB(50); char *buf; - long anon, current; + s64 anon; + long current; int ret =3D -1; =20 buf =3D alloc_and_populate_anon(size); @@ -206,7 +207,7 @@ static int alloc_anon_50M_check(const char *cgroup, voi= d *arg) if (!values_close(size, current, 3)) goto cleanup; =20 - anon =3D cg_read_key_long(cgroup, "memory.stat", "anon "); + anon =3D cg_read_key_s64(cgroup, "memory.stat", "anon "); if (anon < 0) goto cleanup; =20 @@ -223,7 +224,8 @@ static int alloc_pagecache_50M_check(const char *cgroup= , void *arg) { size_t size =3D MB(50); int ret =3D -1; - long current, file; + long current; + s64 file; int fd; =20 fd =3D get_temp_fd(); @@ -237,7 +239,7 @@ static int alloc_pagecache_50M_check(const char *cgroup= , void *arg) if (current < size) goto cleanup; =20 - file =3D cg_read_key_long(cgroup, "memory.stat", "file "); + file =3D cg_read_key_s64(cgroup, "memory.stat", "file "); if (file < 0) goto cleanup; =20 @@ -623,10 +625,10 @@ static int test_memcg_protection(const char *root, bo= ol min) for (i =3D 0; i < ARRAY_SIZE(children); i++) { int ignore_low_events_index =3D has_recursiveprot ? 2 : -1; int no_low_events_index =3D 1; - long low, oom; + s64 low, oom; =20 - oom =3D cg_read_key_long(children[i], "memory.events", "oom "); - low =3D cg_read_key_long(children[i], "memory.events", "low "); + oom =3D cg_read_key_s64(children[i], "memory.events", "oom "); + low =3D cg_read_key_s64(children[i], "memory.events", "low "); =20 if (oom) goto cleanup; @@ -711,7 +713,7 @@ static int test_memcg_high(const char *root) { int ret =3D KSFT_FAIL; char *memcg; - long high; + s64 high; =20 memcg =3D cg_name(root, "memcg_test"); if (!memcg) @@ -738,7 +740,7 @@ static int test_memcg_high(const char *root) if (cg_run(memcg, alloc_pagecache_max_30M, NULL)) goto cleanup; =20 - high =3D cg_read_key_long(memcg, "memory.events", "high "); + high =3D cg_read_key_s64(memcg, "memory.events", "high "); if (high <=3D 0) goto cleanup; =20 @@ -774,8 +776,8 @@ static int test_memcg_high_sync(const char *root) { int ret =3D KSFT_FAIL, pid, fd =3D -1; char *memcg; - long pre_high, pre_max; - long post_high, post_max; + s64 pre_high, pre_max; + s64 post_high, post_max; =20 memcg =3D cg_name(root, "memcg_test"); if (!memcg) @@ -784,8 +786,8 @@ static int test_memcg_high_sync(const char *root) if (cg_create(memcg)) goto cleanup; =20 - pre_high =3D cg_read_key_long(memcg, "memory.events", "high "); - pre_max =3D cg_read_key_long(memcg, "memory.events", "max "); + pre_high =3D cg_read_key_s64(memcg, "memory.events", "high "); + pre_max =3D cg_read_key_s64(memcg, "memory.events", "max "); if (pre_high < 0 || pre_max < 0) goto cleanup; =20 @@ -808,8 +810,8 @@ static int test_memcg_high_sync(const char *root) =20 cg_wait_for(fd); =20 - post_high =3D cg_read_key_long(memcg, "memory.events", "high "); - post_max =3D cg_read_key_long(memcg, "memory.events", "max "); + post_high =3D cg_read_key_s64(memcg, "memory.events", "high "); + post_max =3D cg_read_key_s64(memcg, "memory.events", "max "); if (post_high < 0 || post_max < 0) goto cleanup; =20 @@ -836,7 +838,8 @@ static int test_memcg_max(const char *root) { int ret =3D KSFT_FAIL; char *memcg; - long current, max; + long current; + s64 max; =20 memcg =3D cg_name(root, "memcg_test"); if (!memcg) @@ -865,7 +868,7 @@ static int test_memcg_max(const char *root) if (current > MB(30) || !current) goto cleanup; =20 - max =3D cg_read_key_long(memcg, "memory.events", "max "); + max =3D cg_read_key_s64(memcg, "memory.events", "max "); if (max <=3D 0) goto cleanup; =20 @@ -1029,7 +1032,8 @@ static int test_memcg_swap_max_peak(const char *root) { int ret =3D KSFT_FAIL; char *memcg; - long max, peak; + s64 max; + long peak; struct stat ss; int swap_peak_fd =3D -1, mem_peak_fd =3D -1; =20 @@ -1122,10 +1126,10 @@ static int test_memcg_swap_max_peak(const char *roo= t) if (!cg_run(memcg, alloc_anon, (void *)MB(100))) goto cleanup; =20 - if (cg_read_key_long(memcg, "memory.events", "oom ") !=3D 1) + if (cg_read_key_s64(memcg, "memory.events", "oom ") !=3D 1) goto cleanup; =20 - if (cg_read_key_long(memcg, "memory.events", "oom_kill ") !=3D 1) + if (cg_read_key_s64(memcg, "memory.events", "oom_kill ") !=3D 1) goto cleanup; =20 peak =3D cg_read_long(memcg, "memory.peak"); @@ -1186,7 +1190,7 @@ static int test_memcg_swap_max_peak(const char *root) if (cg_run(memcg, alloc_anon_50M_check_swap, (void *)MB(30))) goto cleanup; =20 - max =3D cg_read_key_long(memcg, "memory.events", "max "); + max =3D cg_read_key_s64(memcg, "memory.events", "max "); if (max <=3D 0) goto cleanup; =20 @@ -1248,10 +1252,10 @@ static int test_memcg_oom_events(const char *root) if (cg_read_strcmp(memcg, "cgroup.procs", "")) goto cleanup; =20 - if (cg_read_key_long(memcg, "memory.events", "oom ") !=3D 1) + if (cg_read_key_s64(memcg, "memory.events", "oom ") !=3D 1) goto cleanup; =20 - if (cg_read_key_long(memcg, "memory.events", "oom_kill ") !=3D 1) + if (cg_read_key_s64(memcg, "memory.events", "oom_kill ") !=3D 1) goto cleanup; =20 ret =3D KSFT_PASS; @@ -1354,13 +1358,14 @@ static int tcp_client(const char *cgroup, unsigned = short port) ret =3D KSFT_FAIL; while (retries--) { uint8_t buf[0x100000]; - long current, sock; + long current; + s64 sock; =20 if (read(sk, buf, sizeof(buf)) <=3D 0) goto close_sk; =20 current =3D cg_read_long(cgroup, "memory.current"); - sock =3D cg_read_key_long(cgroup, "memory.stat", "sock "); + sock =3D cg_read_key_s64(cgroup, "memory.stat", "sock "); =20 if (current < 0 || sock < 0) goto close_sk; @@ -1392,7 +1397,7 @@ static int test_memcg_sock(const char *root) int bind_retries =3D 5, ret =3D KSFT_FAIL, pid, err; unsigned short port; char *memcg; - long sock_post =3D -1; + s64 sock_post =3D -1; =20 memcg =3D cg_name(root, "memcg_test"); if (!memcg) @@ -1459,7 +1464,7 @@ static int test_memcg_sock(const char *root) * scheduling slack) and require that the "sock " counter * eventually drops to zero. */ - sock_post =3D cg_read_key_long_poll(memcg, "memory.stat", "sock ", 0, + sock_post =3D cg_read_key_s64_poll(memcg, "memory.stat", "sock ", 0, MEMCG_SOCKSTAT_WAIT_RETRIES, DEFAULT_WAIT_INTERVAL_US); if (sock_post) @@ -1484,7 +1489,7 @@ static int test_memcg_oom_group_leaf_events(const cha= r *root) { int ret =3D KSFT_FAIL; char *parent, *child; - long parent_oom_events; + s64 parent_oom_events; =20 parent =3D cg_name(root, "memcg_test_0"); child =3D cg_name(root, "memcg_test_0/memcg_test_1"); @@ -1519,11 +1524,11 @@ static int test_memcg_oom_group_leaf_events(const c= har *root) if (cg_test_proc_killed(child)) goto cleanup; =20 - if (cg_read_key_long(child, "memory.events", "oom_kill ") <=3D 0) + if (cg_read_key_s64(child, "memory.events", "oom_kill ") <=3D 0) goto cleanup; =20 - parent_oom_events =3D cg_read_key_long( - parent, "memory.events", "oom_kill "); + parent_oom_events =3D + cg_read_key_s64(parent, "memory.events", "oom_kill "); /* * If memory_localevents is not enabled (the default), the parent should * count OOM events in its children groups. Otherwise, it should not @@ -1639,7 +1644,7 @@ static int test_memcg_oom_group_score_events(const ch= ar *root) if (!cg_run(memcg, alloc_anon, (void *)MB(100))) goto cleanup; =20 - if (cg_read_key_long(memcg, "memory.events", "oom_kill ") !=3D 3) + if (cg_read_key_s64(memcg, "memory.events", "oom_kill ") !=3D 3) goto cleanup; =20 if (kill(safe_pid, SIGKILL)) diff --git a/tools/testing/selftests/cgroup/test_pids.c b/tools/testing/sel= ftests/cgroup/test_pids.c index 710109b53dfe..f4d5bc9f5f24 100644 --- a/tools/testing/selftests/cgroup/test_pids.c +++ b/tools/testing/selftests/cgroup/test_pids.c @@ -111,12 +111,11 @@ static int test_pids_events(const char *root) if (kill(pid, SIGINT)) goto cleanup; =20 - if (cg_read_key_long(cg_child, "pids.events", "max ") !=3D 0) + if (cg_read_key_s64(cg_child, "pids.events", "max ") !=3D 0) goto cleanup; - if (cg_read_key_long(cg_parent, "pids.events", "max ") !=3D 1) + if (cg_read_key_s64(cg_parent, "pids.events", "max ") !=3D 1) goto cleanup; =20 - ret =3D KSFT_PASS; =20 cleanup: diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index 8f2c9aa4776c..f4ee440b3c66 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -59,14 +59,14 @@ static int get_zswap_stored_pages(size_t *value) return read_int(PATH_ZSWAP_STORED_PAGES, value); } =20 -static long get_cg_wb_count(const char *cg) +static s64 get_cg_wb_count(const char *cg) { - return cg_read_key_long(cg, "memory.stat", "zswpwb"); + return cg_read_key_s64(cg, "memory.stat", "zswpwb"); } =20 -static long get_zswpout(const char *cgroup) +static s64 get_zswpout(const char *cgroup) { - return cg_read_key_long(cgroup, "memory.stat", "zswpout "); + return cg_read_key_s64(cgroup, "memory.stat", "zswpout "); } =20 static int allocate_and_read_bytes(const char *cgroup, void *arg) @@ -125,9 +125,10 @@ static char *setup_test_group_1M(const char *root, con= st char *name) * 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) +static s64 wait_for_writeback(const char *cg, int timeout_ms) { - long elapsed, count; + long elapsed; + s64 count; for (elapsed =3D 0; elapsed < timeout_ms; elapsed +=3D 100) { count =3D get_cg_wb_count(cg); =20 @@ -147,7 +148,7 @@ static long wait_for_writeback(const char *cg, int time= out_ms) */ static int test_zswap_usage(const char *root) { - long zswpout_before, zswpout_after; + s64 zswpout_before, zswpout_after; int ret =3D KSFT_FAIL; char *test_group; =20 @@ -191,7 +192,8 @@ 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; + long swap_peak, min_swap; + s64 zswpout; size_t allocation_size =3D page_size * 512; =20 min_swap =3D allocation_size / 4; @@ -248,7 +250,7 @@ static int test_zswapin(const char *root) { int ret =3D KSFT_FAIL; char *test_group; - long zswpin; + s64 zswpin; =20 test_group =3D cg_name(root, "zswapin_test"); if (!test_group) @@ -264,7 +266,7 @@ static int test_zswapin(const char *root) if (cg_run(test_group, allocate_and_read_bytes, (void *)MB(32))) goto out; =20 - zswpin =3D cg_read_key_long(test_group, "memory.stat", "zswpin "); + zswpin =3D cg_read_key_s64(test_group, "memory.stat", "zswpin "); if (zswpin < 0) { ksft_print_msg("failed to get zswpin\n"); goto out; @@ -355,11 +357,11 @@ static int attempt_writeback(const char *cgroup, void= *arg) =20 static int test_zswap_writeback_one(const char *cgroup, bool wb) { - long zswpwb_before, zswpwb_after; + s64 zswpwb_before, zswpwb_after; =20 zswpwb_before =3D get_cg_wb_count(cgroup); if (zswpwb_before !=3D 0) { - ksft_print_msg("zswpwb_before =3D %ld instead of 0\n", zswpwb_before); + ksft_print_msg("zswpwb_before =3D %lld instead of 0\n", zswpwb_before); return -1; } =20 @@ -375,7 +377,7 @@ static int test_zswap_writeback_one(const char *cgroup,= bool wb) return -1; =20 if (wb !=3D !!zswpwb_after) { - ksft_print_msg("zswpwb_after is %ld while wb is %s\n", + ksft_print_msg("zswpwb_after is %lld while wb is %s\n", zswpwb_after, wb ? "enabled" : "disabled"); return -1; } @@ -487,7 +489,7 @@ static int test_no_invasive_cgroup_shrink(const char *r= oot) 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) + if (cg_read_key_s64(zw_group, "memory.stat", "zswapped") < 1) goto out; =20 /* Push wb_group memory into zswap with hard-to-compress data to trigger = wb */ @@ -630,7 +632,7 @@ static int test_no_kmem_bypass(const char *root) break; /* 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 = "); + s64 zswapped =3D cg_read_key_s64(test_group, "memory.stat", "zswapped "= ); int delta =3D stored_pages * page_size - zswapped; int result_ok =3D delta < stored_pages * page_size / 4; =20 @@ -703,9 +705,9 @@ static int allocate_random_and_wait(const char *cgroup,= void *arg) return 0; } =20 -static long get_zswap_incomp(const char *cgroup) +static s64 get_zswap_incomp(const char *cgroup) { - return cg_read_key_long(cgroup, "memory.stat", "zswap_incomp "); + return cg_read_key_s64(cgroup, "memory.stat", "zswap_incomp "); } =20 /* @@ -721,7 +723,7 @@ static int test_zswap_incompressible(const char *root) int ret =3D KSFT_FAIL; struct incomp_child_args *values; char *test_group; - long zswap_incomp; + s64 zswap_incomp; pid_t child_pid; int child_status; char buf; @@ -757,13 +759,15 @@ static int test_zswap_incompressible(const char *root) =20 zswap_incomp =3D get_zswap_incomp(test_group); if (zswap_incomp <=3D 0) { - long zswpout =3D get_zswpout(test_group); - long zswapped =3D cg_read_key_long(test_group, "memory.stat", "zswapped = "); - long zswap_b =3D cg_read_key_long(test_group, "memory.stat", "zswap "); - - ksft_print_msg("zswap_incomp not increased: %ld\n", zswap_incomp); - ksft_print_msg("debug: zswpout=3D%ld zswapped=3D%ld zswap_b=3D%ld\n", - zswpout, zswapped, zswap_b); + s64 zswpout =3D get_zswpout(test_group); + s64 zswapped =3D + cg_read_key_s64(test_group, "memory.stat", "zswapped "); + s64 zswap_b =3D + cg_read_key_s64(test_group, "memory.stat", "zswap "); + + ksft_print_msg("zswap_incomp not increased: %lld\n", zswap_incomp); + ksft_print_msg("debug: zswpout=3D%lld zswapped=3D%lld zswap_b=3D%lld\n", + zswpout, zswapped, zswap_b); ksft_print_msg("debug: madvise ret=3D%d errno=3D%d\n", values->madvise_ret, values->madvise_errno); goto out_kill; --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 03:50:47 2026 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15B9D3914EE for ; Fri, 4 Sep 2026 22:51:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788562272; cv=none; b=Zp6vu87ezzQKgkR5/ezLOg4o9FwuMWpjrfD4gvPclELOKRX3ZSgcIomZlIKkJ2HcqDLKMfZLwRCQytFbe4DyE9jwr1633gmsl+mfFQD1xR6t/tpJrliXbT/ORPtCSdH1RyjOJmJ3ooXU/hqLSIl9wtpu/Ng5tXA8nlS/G74Cg/0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788562272; c=relaxed/simple; bh=7Rr4cZf23G1AhSmC6yHNaypWuZm8NnD+lG4o7s9xYsQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Kwo7d/5ooFOWUPJWdIPlAjqjmArxIz0+qL8z8V59oKP2RR2MkvAKk/zNDv5JVLKi+Obl+BPCkLtpBRXU4h2EzxWT3Ys9RFVEgf4DKuGy64lt49MRWXDjc4pBSNebFn02dw2lNvhumIRmpuGR1eHHmGbBZAN0/XsPXG6bg8Lpmco= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wfelipe.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pMPWpmHv; arc=none smtp.client-ip=209.85.216.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--wfelipe.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pMPWpmHv" Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-381250979d5so1806368a91.0 for ; Fri, 04 Sep 2026 15:51:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788562270; x=1789167070; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=VNAQcGgCzsGn8fB04Y1RcaGfsgoCFdcws+Wtu5yA69s=; b=pMPWpmHvPvN5zEtwTLfiDUwwtHC9VZdApTNgYP7e3Ok+eo1Xts9Fvyb+b8istJf6St 4Vn5dsgfbIag6TjgVEKTt5ds6e7AB1uARD0bDhOn30lv7W92DLAiWMEd+ixT/wf95ywD i6VaHyXO5Ru0Mh+Hc0nk64A3sCiglprJBxBEZHv18R0mTGNteQIFVAlfDC/e2NFPDdGl +6oei6f+NNsnLAZ6BjU5BOW6scwTLSTTRuAQofF7T5aQGRtWFos//U/Na2v0LK2I3lR8 MccdtCStSJXqxtu02pILHGq95bkGtgoRimyoXtpWDw9R7MT0DpvYrPAOYRQ4LBTYWZaU j0rQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788562270; x=1789167070; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VNAQcGgCzsGn8fB04Y1RcaGfsgoCFdcws+Wtu5yA69s=; b=e36PosFa4lRqsBDpOEs0dtxD/CEE+ua3WMlnfWBtQguqJhsTvswTZP2FNHGCX9yMZW LRjgTTnbzUlc8FrsmknG/gKOBi47wS8rme/nbUdSwPfEw0uU6ymdqSLKC+wAYgB/rN6S A+08Ik0zqsS48dAcfp4VFl2w7Z0i30qZvqWLjiTlBAdkPDwWyEEZ7SUwrauQrV3cBxZe E3+S5/FKKvoi7NWZ6zBJugoq0UX20Z2USn8PZDy8HDR+XdnoR7Mp4G0gQM1s9a7k6L6o urp9ahHRlbVJm8A533l5YsXegdGMn6+iP58llHKISBCFCVlyJqkm7qL4KukPeOyZP3y9 C1+Q== X-Forwarded-Encrypted: i=1; AKwUvBySWVLnJa2LTHmJFJLqDa7A3+95I/rjCIgJnhy11feYOeUMoamVO5VugdjbgWBQDzx8nBWmUTqu5mUK3R0=@vger.kernel.org X-Gm-Message-State: AFuF++m2SEnSEq+Umz7hTiMtrY+LupSJ+OUkMki4VVXAir4xns4GBM7N o5S6xpmeMWbgVklImUIUZHdPPp0EhqVbq63YuwnaWkEP/JZoQtzjfnjsmZyaSJaExV7r4pqaPdf uGBBrDAGhKw== X-Received: from pjbsj10.prod.google.com ([2002:a17:90b:2d8a:b0:398:ff5d:7e24]) (user=wfelipe job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5243:b0:38e:c232:9d3f with SMTP id 98e67ed59e1d1-39b2614df1emr14776303a91.5.1788562270186; Fri, 04 Sep 2026 15:51:10 -0700 (PDT) Date: Fri, 4 Sep 2026 22:45:15 +0000 In-Reply-To: <20260904225103.2955759-1-wfelipe@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260904225103.2955759-1-wfelipe@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260904225103.2955759-4-wfelipe@google.com> Subject: [PATCH v6 3/3] selftests/cgroup: test_zswap: fix implicit unsigned promotion bug in test_no_kmem_bypass From: Wilson Felipe Pereira To: Andrew Morton , Johannes Weiner , Yosry Ahmed , Nhat Pham , Chengming Zhou , Tejun Heo , "=?UTF-8?q?Michal=20Koutn=C3=BD?=" , Shuah Khan Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Wilson Felipe Pereira Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In test_no_kmem_bypass(), delta (stored_pages * page_size - zswapped) is checked against stored_pages * page_size / 4 to verify that the pages pushed to zswap belong to the test memory cgroup. Due to slight stat update timing differences, delta can evaluate to a small negative number (e.g. -5MB out of 1GB). Because delta was declared as a signed int and stored_pages is an unsigned size_t, C's usual arithmetic conversions implicitly promote a negative delta to a large unsigned 64-bit integer, causing `delta < stored_pages * page_size / 4` to falsely evaluate to 0 and fail the test. Fix this by declaring delta and max_delta as signed 64-bit values (s64), explicitly casting stored_pages, and comparing against a signed threshold, ensuring negative deltas correctly evaluate to true. Fixes: a549f9f31561 ("selftests: cgroup: add test_zswap with no kmem bypass= test") Signed-off-by: Wilson Felipe Pereira --- tools/testing/selftests/cgroup/test_zswap.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/se= lftests/cgroup/test_zswap.c index f4ee440b3c66..6e7ee11bc97a 100644 --- a/tools/testing/selftests/cgroup/test_zswap.c +++ b/tools/testing/selftests/cgroup/test_zswap.c @@ -632,11 +632,12 @@ static int test_no_kmem_bypass(const char *root) break; /* If memory was pushed to zswap, verify it belongs to memcg */ if (stored_pages > stored_pages_threshold) { - s64 zswapped =3D cg_read_key_s64(test_group, "memory.stat", "zswapped "= ); - int delta =3D stored_pages * page_size - zswapped; - int result_ok =3D delta < stored_pages * page_size / 4; + s64 zswapped =3D cg_read_key_s64( + test_group, "memory.stat", "zswapped "); + s64 delta =3D (s64)stored_pages * page_size - zswapped; + s64 max_delta =3D (s64)stored_pages * page_size / 4; =20 - ret =3D result_ok ? KSFT_PASS : KSFT_FAIL; + ret =3D (delta < max_delta) ? KSFT_PASS : KSFT_FAIL; break; } } --=20 2.55.0.979.g7e5102b832-goog