diff mbox series

process_madvise01: running the test in mem_cg

Message ID 20241126085808.14616-1-liwang@redhat.com
State Accepted
Headers show
Series process_madvise01: running the test in mem_cg | expand

Commit Message

Li Wang Nov. 26, 2024, 8:58 a.m. UTC
The MADV_PAGEOUT behavior in the kernel is advisory and may skip
swapping if the system has sufficient free RAM, even when the
advice is explicitly requested. This causes sporadic false positives
in our CI, particularly on systems with large amounts of RAM:

  process_madvise01.c:38: TINFO: Allocate memory: 1048576 bytes
  process_madvise01.c:99: TINFO: Reclaim memory using MADV_PAGEOUT
  process_madvise01.c:62: TFAIL: Expect: Most of the memory has been swapped out: 0kB out of 1024kB

To address this, the patch confines the test to a memory cgroup
with configured limits for memory.max and memory.swap.max, improving
control over memory and swap usage. This reduces the likelihood of
false positives caused by system-wide memory conditions.

Signed-off-by: Li Wang <liwang@redhat.com>
---
 .../syscalls/process_madvise/process_madvise01.c   | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Petr Vorel Jan. 2, 2025, 2:59 p.m. UTC | #1
Hi Li,

> The MADV_PAGEOUT behavior in the kernel is advisory and may skip
> swapping if the system has sufficient free RAM, even when the
> advice is explicitly requested. This causes sporadic false positives
> in our CI, particularly on systems with large amounts of RAM:

>   process_madvise01.c:38: TINFO: Allocate memory: 1048576 bytes
>   process_madvise01.c:99: TINFO: Reclaim memory using MADV_PAGEOUT
>   process_madvise01.c:62: TFAIL: Expect: Most of the memory has been swapped out: 0kB out of 1024kB

> To address this, the patch confines the test to a memory cgroup
> with configured limits for memory.max and memory.swap.max, improving
> control over memory and swap usage. This reduces the likelihood of
> false positives caused by system-wide memory conditions.

Out of curiosity, on how many RAM does it fail? And is it arch specific?

...
> +++ b/testcases/kernel/syscalls/process_madvise/process_madvise01.c
> @@ -23,7 +23,9 @@
>  #include "lapi/syscalls.h"
>  #include "process_madvise.h"

> -#define MEM_CHILD	(1 * TST_MB)
> +#define MEM_LIMIT   (100 * TST_MB)
> +#define MEMSW_LIMIT (200 * TST_MB)
> +#define MEM_CHILD   (1   * TST_MB)
...
> @@ -123,7 +131,9 @@ static struct tst_test test = {
>  	.min_kver = "5.10",
>  	.needs_checkpoints = 1,
>  	.needs_root = 1,
> -	.min_swap_avail = MEM_CHILD / TST_MB,
> +	.min_mem_avail = 2 * MEM_LIMIT / TST_MB,
Requiring 200 MB for test looks LGTM.

Reviewed-by: Petr Vorel <pvorel@suse.cz>

Kind regards,
Petr

> +	.min_swap_avail = 2 * MEM_CHILD / TST_MB,
> +	.needs_cgroup_ctrls = (const char *const []){ "memory", NULL },
Li Wang Jan. 3, 2025, 8:35 a.m. UTC | #2
On Thu, Jan 2, 2025 at 10:59 PM Petr Vorel <pvorel@suse.cz> wrote:

> Hi Li,
>
> > The MADV_PAGEOUT behavior in the kernel is advisory and may skip
> > swapping if the system has sufficient free RAM, even when the
> > advice is explicitly requested. This causes sporadic false positives
> > in our CI, particularly on systems with large amounts of RAM:
>
> >   process_madvise01.c:38: TINFO: Allocate memory: 1048576 bytes
> >   process_madvise01.c:99: TINFO: Reclaim memory using MADV_PAGEOUT
> >   process_madvise01.c:62: TFAIL: Expect: Most of the memory has been
> swapped out: 0kB out of 1024kB
>
> > To address this, the patch confines the test to a memory cgroup
> > with configured limits for memory.max and memory.swap.max, improving
> > control over memory and swap usage. This reduces the likelihood of
> > false positives caused by system-wide memory conditions.
>
> Out of curiosity, on how many RAM does it fail? And is it arch specific?
>
>
Ah, I completely forgot the context of this patch, my memory is bad now :/.


> ...
> > +++ b/testcases/kernel/syscalls/process_madvise/process_madvise01.c
> > @@ -23,7 +23,9 @@
> >  #include "lapi/syscalls.h"
> >  #include "process_madvise.h"
>
> > -#define MEM_CHILD    (1 * TST_MB)
> > +#define MEM_LIMIT   (100 * TST_MB)
> > +#define MEMSW_LIMIT (200 * TST_MB)
> > +#define MEM_CHILD   (1   * TST_MB)
> ...
> > @@ -123,7 +131,9 @@ static struct tst_test test = {
> >       .min_kver = "5.10",
> >       .needs_checkpoints = 1,
> >       .needs_root = 1,
> > -     .min_swap_avail = MEM_CHILD / TST_MB,
> > +     .min_mem_avail = 2 * MEM_LIMIT / TST_MB,
> Requiring 200 MB for test looks LGTM.
>
> Reviewed-by: Petr Vorel <pvorel@suse.cz>
>

Thanks for the review, after reading the patch summary I guess it
still makes sense to apply it, since MADV_PAGEOUT is indeed not
a mandatory option and still may ignored by kernel in the test.
Petr Vorel Jan. 3, 2025, 8:50 a.m. UTC | #3
Hi Li,

...
> Thanks for the review, after reading the patch summary I guess it
> still makes sense to apply it, since MADV_PAGEOUT is indeed not
> a mandatory option and still may ignored by kernel in the test.

Sure, please go ahead and merge the patchset.

Kind regards,
Petr
Li Wang Jan. 3, 2025, 9:36 a.m. UTC | #4
On Fri, Jan 3, 2025 at 4:50 PM Petr Vorel <pvorel@suse.cz> wrote:

> Hi Li,
>
> ...
> > Thanks for the review, after reading the patch summary I guess it
> > still makes sense to apply it, since MADV_PAGEOUT is indeed not
> > a mandatory option and still may ignored by kernel in the test.
>
> Sure, please go ahead and merge the patchset.
>

Merged, thanks!
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/process_madvise/process_madvise01.c b/testcases/kernel/syscalls/process_madvise/process_madvise01.c
index 0fd3c1ef4..ca314c4da 100644
--- a/testcases/kernel/syscalls/process_madvise/process_madvise01.c
+++ b/testcases/kernel/syscalls/process_madvise/process_madvise01.c
@@ -23,7 +23,9 @@ 
 #include "lapi/syscalls.h"
 #include "process_madvise.h"
 
-#define MEM_CHILD	(1 * TST_MB)
+#define MEM_LIMIT   (100 * TST_MB)
+#define MEMSW_LIMIT (200 * TST_MB)
+#define MEM_CHILD   (1   * TST_MB)
 
 static void **data_ptr;
 
@@ -67,6 +69,12 @@  static void child_alloc(void)
 
 static void setup(void)
 {
+	SAFE_CG_PRINTF(tst_cg, "memory.max", "%d", MEM_LIMIT);
+	if (SAFE_CG_HAS(tst_cg, "memory.swap.max"))
+		SAFE_CG_PRINTF(tst_cg, "memory.swap.max", "%d", MEMSW_LIMIT);
+
+	SAFE_CG_PRINTF(tst_cg, "cgroup.procs", "%d", getpid());
+
 	data_ptr = SAFE_MMAP(NULL, sizeof(void *),
 			PROT_READ | PROT_WRITE,
 			MAP_SHARED | MAP_ANONYMOUS, -1, 0);
@@ -123,7 +131,9 @@  static struct tst_test test = {
 	.min_kver = "5.10",
 	.needs_checkpoints = 1,
 	.needs_root = 1,
-	.min_swap_avail = MEM_CHILD / TST_MB,
+	.min_mem_avail = 2 * MEM_LIMIT / TST_MB,
+	.min_swap_avail = 2 * MEM_CHILD / TST_MB,
+	.needs_cgroup_ctrls = (const char *const []){ "memory", NULL },
 	.needs_kconfigs = (const char *[]) {
 		"CONFIG_SWAP=y",
 		NULL