From: Yosry Ahmed <yosryahmed@google.com>
To: Nhat Pham <nphamcs@gmail.com>
Cc: akpm@linux-foundation.org, riel@surriel.com, shuah@kernel.org,
hannes@cmpxchg.org, tj@kernel.org, lizefan.x@bytedance.com,
roman.gushchin@linux.dev, linux-mm@kvack.org,
kernel-team@meta.com, linux-kernel@vger.kernel.org,
cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [PATCH v3 3/3] selftests: add zswapin and no zswap tests
Date: Mon, 5 Feb 2024 23:05:02 +0000 [thread overview]
Message-ID: <ZcFpnokh3W1DFBCj@google.com> (raw)
In-Reply-To: <20240205225608.3083251-4-nphamcs@gmail.com>
On Mon, Feb 05, 2024 at 02:56:08PM -0800, Nhat Pham wrote:
> Add a selftest to cover the zswapin code path, allocating more memory
> than the cgroup limit to trigger swapout/zswapout, then reading the
> pages back in memory several times. This is inspired by a recently
> encountered kernel crash on the zswapin path in our internal kernel,
> which went undetected because of a lack of test coverage for this path.
>
> Add a selftest to verify that when memory.zswap.max = 0, no pages can go
> to the zswap pool for the cgroup.
>
> Suggested-by: Rik van Riel <riel@surriel.com>
> Suggested-by: Yosry Ahmed <yosryahmed@google.com>
> Signed-off-by: Nhat Pham <nphamcs@gmail.com>
LGTM with a few nits below:
Acked-by: Yosry Ahmed <yosryahmed@google.com>
Thanks!
> ---
> tools/testing/selftests/cgroup/test_zswap.c | 120 +++++++++++++++++++-
> 1 file changed, 119 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/selftests/cgroup/test_zswap.c
> index 32ce975b21d1..c263610a4a60 100644
> --- a/tools/testing/selftests/cgroup/test_zswap.c
> +++ b/tools/testing/selftests/cgroup/test_zswap.c
> @@ -60,6 +60,27 @@ static long get_zswpout(const char *cgroup)
> return cg_read_key_long(cgroup, "memory.stat", "zswpout ");
> }
>
> +static int allocate_and_read_bytes(const char *cgroup, void *arg)
> +{
> + size_t size = (size_t)arg;
> + char *mem = (char *)malloc(size);
> + int ret = 0;
> +
> + if (!mem)
> + return -1;
> + for (int i = 0; i < size; i += 4095)
> + mem[i] = 'a';
> +
> + /* go through the allocated memory to (z)swap in and out pages */
nit: s/go/Go
> + for (int i = 0; i < size; i += 4095) {
> + if (mem[i] != 'a')
> + ret = -1;
> + }
> +
> + free(mem);
> + return ret;
> +}
> +
> static int allocate_bytes(const char *cgroup, void *arg)
> {
> size_t size = (size_t)arg;
> @@ -100,7 +121,6 @@ static int test_zswap_usage(const char *root)
> int ret = KSFT_FAIL;
> char *test_group;
>
> - /* Set up */
We removed this comment here.
> test_group = cg_name(root, "no_shrink_test");
> if (!test_group)
> goto out;
> @@ -133,6 +153,102 @@ static int test_zswap_usage(const char *root)
> return ret;
> }
>
> +/*
> + * Check that when memory.zswap.max = 0, no pages can go to the zswap pool for
> + * the cgroup.
> + */
> +static int test_swapin_nozswap(const char *root)
> +{
> + int ret = KSFT_FAIL;
> + char *test_group;
> + long swap_peak, zswpout;
> +
> + test_group = 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"))
> + goto out;
> + if (cg_write(test_group, "memory.zswap.max", "0"))
> + goto out;
> +
> + /* Allocate and read more than memory.max to trigger swapin */
> + if (cg_run(test_group, allocate_and_read_bytes, (void *)MB(32)))
> + goto out;
> +
> + /* Verify that pages are swapped out, but no zswap happened */
> + swap_peak = cg_read_long(test_group, "memory.swap.peak");
> + if (swap_peak < 0) {
> + ksft_print_msg("failed to get cgroup's swap_peak\n");
> + goto out;
> + }
> +
> + if (swap_peak == 0) {
> + ksft_print_msg("pages should be swapped out\n");
> + goto out;
> + }
We can actually check that this number is >= 24M instead. Not a big
deal, but might as well.
> +
> + zswpout = get_zswpout(test_group);
> + if (zswpout < 0) {
> + ksft_print_msg("failed to get zswpout\n");
> + goto out;
> + }
> +
> + if (zswpout > 0) {
> + ksft_print_msg("zswapout > 0 when memory.zswap.max = 0\n");
> + goto out;
> + }
> +
> + ret = KSFT_PASS;
> +
> +out:
> + cg_destroy(test_group);
> + free(test_group);
> + return ret;
> +}
> +
> +/* Simple test to verify the (z)swapin code paths */
> +static int test_zswapin(const char *root)
> +{
> + int ret = KSFT_FAIL;
> + char *test_group;
> + long zswpin;
> +
> + /* Set up */
Yet we added a similar one here :)
> + test_group = cg_name(root, "zswapin_test");
> + if (!test_group)
> + goto out;
> + if (cg_create(test_group))
> + goto out;
> + if (cg_write(test_group, "memory.max", "8M"))
> + goto out;
> + if (cg_write(test_group, "memory.zswap.max", "max"))
> + goto out;
> +
> + /* Allocate and read more than memory.max to trigger (z)swap in */
> + if (cg_run(test_group, allocate_and_read_bytes, (void *)MB(32)))
> + goto out;
> +
> + zswpin = cg_read_key_long(test_group, "memory.stat", "zswpin ");
> + if (zswpin < 0) {
> + ksft_print_msg("failed to get zswpin\n");
> + goto out;
> + }
> +
> + if (zswpin == 0) {
> + ksft_print_msg("zswpin should not be 0\n");
> + goto out;
> + }
Same here, we can check that zswpin is at least 24M worth of events.
Again, not a big deal, but might as well.
next prev parent reply other threads:[~2024-02-05 23:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-05 22:56 [PATCH v3 0/3] fix and extend zswap kselftests Nhat Pham
2024-02-05 22:56 ` [PATCH v3 1/3] selftests: zswap: add zswap selftest file to zswap maintainer entry Nhat Pham
2024-02-05 22:56 ` [PATCH v3 2/3] selftests: fix the zswap invasive shrink test Nhat Pham
2024-02-05 22:56 ` [PATCH v3 3/3] selftests: add zswapin and no zswap tests Nhat Pham
2024-02-05 23:05 ` Yosry Ahmed [this message]
2024-02-05 23:25 ` Nhat Pham
2024-02-22 4:31 ` [PATCH v3 3/3] selftests: add zswapin and no zswap tests (fix) Nhat Pham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZcFpnokh3W1DFBCj@google.com \
--to=yosryahmed@google.com \
--cc=akpm@linux-foundation.org \
--cc=cgroups@vger.kernel.org \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lizefan.x@bytedance.com \
--cc=nphamcs@gmail.com \
--cc=riel@surriel.com \
--cc=roman.gushchin@linux.dev \
--cc=shuah@kernel.org \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.