Linux Test Project
 help / color / mirror / Atom feed
* [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor
@ 2026-05-26  8:36 Wei Gao via ltp
  2026-05-26 14:10 ` Petr Vorel
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Wei Gao via ltp @ 2026-05-26  8:36 UTC (permalink / raw)
  To: ltp

High memory pressure can cause MemFree to temporarily drop below the
min_free_kbytes threshold before the kernel reclaimer can catch up.
This results in intermittent test failures, particularly observed on
openQA aarch64 machines.

Implement a 1-second grace period with exponential backoff polling
(from 1ms up to 512ms) in check_monitor() to allow the kernel time to
reclaim memory. Also the global 'end' flag is reset for multi-iteration
support (-i).

Signed-off-by: Wei Gao <wegao@suse.com>
---
 .../kernel/mem/tunable/min_free_kbytes.c      | 36 +++++++++++++------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git a/testcases/kernel/mem/tunable/min_free_kbytes.c b/testcases/kernel/mem/tunable/min_free_kbytes.c
index a62e4ae9d..59ba6a9e1 100644
--- a/testcases/kernel/mem/tunable/min_free_kbytes.c
+++ b/testcases/kernel/mem/tunable/min_free_kbytes.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 /*
- * Copyright (c) Linux Test Project, 2012-2025
+ * Copyright (c) Linux Test Project, 2012-2026
  * Copyright (C) 2012-2017  Red Hat, Inc.
  */
 
@@ -53,6 +53,8 @@ static void min_free_kbytes_test(void)
 	int pid, status;
 	struct sigaction sa;
 
+	end = 0;
+
 	sa.sa_handler = sighandler;
 	if (sigemptyset(&sa.sa_mask) < 0)
 		tst_brk(TBROK | TERRNO, "sigemptyset");
@@ -140,14 +142,13 @@ static void test_tune(unsigned long overcommit_policy)
 		} else {
 			if (WIFEXITED(status)) {
 				if (WEXITSTATUS(status) != 0) {
-					tst_res(TFAIL, "child unexpectedly "
-						 "failed: %d", status);
+					tst_res(TFAIL, "child unexpectedly failed: %d",
+						status);
 				}
 			} else if (!WIFSIGNALED(status) ||
 				   WTERMSIG(status) != SIGKILL) {
-				tst_res(TFAIL,
-					 "child unexpectedly failed: %d",
-					 status);
+				tst_res(TFAIL, "child unexpectedly failed: %d",
+					status);
 			}
 		}
 	}
@@ -183,18 +184,33 @@ static void check_monitor(void)
 {
 	unsigned long tune;
 	unsigned long memfree;
+	int i;
 
 	while (!end) {
 		memfree = SAFE_READ_MEMINFO("MemFree:");
 		tune = TST_SYS_CONF_LONG_GET(MIN_FREE_KBYTES);
 
 		if (memfree < tune) {
-			tst_res(TINFO, "MemFree is %lu kB, "
-				 "min_free_kbytes is %lu kB", memfree, tune);
-			tst_res(TFAIL, "MemFree < min_free_kbytes");
+			/*
+			 * Give it some time to reclaim. The kernel should keep
+			 * MemFree above min_free_kbytes, but transient drops
+			 * are possible under high pressure.
+			 */
+			for (i = 1; i < 1024; i *= 2) {
+				usleep(i * 1000);
+				memfree = SAFE_READ_MEMINFO("MemFree:");
+				if (memfree >= tune)
+					break;
+			}
+
+			if (memfree < tune) {
+				tst_res(TINFO, "MemFree is %lu kB, min_free_kbytes is %lu kB",
+					memfree, tune);
+				tst_res(TFAIL, "MemFree < min_free_kbytes");
+			}
 		}
 
-		sleep(2);
+		usleep(100000);
 	}
 }
 
-- 
2.54.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

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

* Re: [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor
  2026-05-26  8:36 [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor Wei Gao via ltp
@ 2026-05-26 14:10 ` Petr Vorel
  2026-05-27  5:08   ` Wei Gao via ltp
  2026-05-26 14:14 ` Petr Vorel
  2026-05-26 15:29 ` [LTP] " linuxtestproject.agent
  2 siblings, 1 reply; 5+ messages in thread
From: Petr Vorel @ 2026-05-26 14:10 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi Wei,

> High memory pressure can cause MemFree to temporarily drop below the
> min_free_kbytes threshold before the kernel reclaimer can catch up.
> This results in intermittent test failures, particularly observed on
> openQA aarch64 machines.

> Implement a 1-second grace period with exponential backoff polling
> (from 1ms up to 512ms) in check_monitor() to allow the kernel time to
> reclaim memory.

> Also the global 'end' flag is reset for multi-iteration
> support (-i).
IMHO this is not needed. Is it just wrong AI hint or you really spot it's
needed?

> Signed-off-by: Wei Gao <wegao@suse.com>
> ---
>  .../kernel/mem/tunable/min_free_kbytes.c      | 36 +++++++++++++------
>  1 file changed, 26 insertions(+), 10 deletions(-)

> diff --git a/testcases/kernel/mem/tunable/min_free_kbytes.c b/testcases/kernel/mem/tunable/min_free_kbytes.c
> index a62e4ae9d..59ba6a9e1 100644
> --- a/testcases/kernel/mem/tunable/min_free_kbytes.c
> +++ b/testcases/kernel/mem/tunable/min_free_kbytes.c
> @@ -1,6 +1,6 @@
>  // SPDX-License-Identifier: GPL-2.0-or-later
>  /*
> - * Copyright (c) Linux Test Project, 2012-2025
> + * Copyright (c) Linux Test Project, 2012-2026
>   * Copyright (C) 2012-2017  Red Hat, Inc.
>   */

> @@ -53,6 +53,8 @@ static void min_free_kbytes_test(void)
>  	int pid, status;
>  	struct sigaction sa;

> +	end = 0;
Why I think it's not needed? Here you're in the parent. But the value is changed
only in child (forked process), they run in a separate memory spaces (change in
child is not visible for the parent).

In patch without it + updated commit message you may add:
Reviewed-by: Petr Vorel <pvorel@suse.cz>

> +
>  	sa.sa_handler = sighandler;
>  	if (sigemptyset(&sa.sa_mask) < 0)
>  		tst_brk(TBROK | TERRNO, "sigemptyset");
> @@ -140,14 +142,13 @@ static void test_tune(unsigned long overcommit_policy)
>  		} else {
>  			if (WIFEXITED(status)) {
>  				if (WEXITSTATUS(status) != 0) {
> -					tst_res(TFAIL, "child unexpectedly "
> -						 "failed: %d", status);
> +					tst_res(TFAIL, "child unexpectedly failed: %d",
> +						status);
>  				}
>  			} else if (!WIFSIGNALED(status) ||
>  				   WTERMSIG(status) != SIGKILL) {
> -				tst_res(TFAIL,
> -					 "child unexpectedly failed: %d",
> -					 status);
> +				tst_res(TFAIL, "child unexpectedly failed: %d",
> +					status);
>  			}
Unrelated cleanup, but thanks.

>  		}
>  	}
> @@ -183,18 +184,33 @@ static void check_monitor(void)
>  {
>  	unsigned long tune;
>  	unsigned long memfree;
> +	int i;

>  	while (!end) {
>  		memfree = SAFE_READ_MEMINFO("MemFree:");
>  		tune = TST_SYS_CONF_LONG_GET(MIN_FREE_KBYTES);

>  		if (memfree < tune) {
> -			tst_res(TINFO, "MemFree is %lu kB, "
> -				 "min_free_kbytes is %lu kB", memfree, tune);
> -			tst_res(TFAIL, "MemFree < min_free_kbytes");
> +			/*
> +			 * Give it some time to reclaim. The kernel should keep
> +			 * MemFree above min_free_kbytes, but transient drops
> +			 * are possible under high pressure.
> +			 */
> +			for (i = 1; i < 1024; i *= 2) {
> +				usleep(i * 1000);
> +				memfree = SAFE_READ_MEMINFO("MemFree:");
> +				if (memfree >= tune)
> +					break;
> +			}
> +
> +			if (memfree < tune) {
> +				tst_res(TINFO, "MemFree is %lu kB, min_free_kbytes is %lu kB",
> +					memfree, tune);
> +				tst_res(TFAIL, "MemFree < min_free_kbytes");
> +			}
>  		}

> -		sleep(2);
> +		usleep(100000);
>  	}
>  }

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

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

* Re: [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor
  2026-05-26  8:36 [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor Wei Gao via ltp
  2026-05-26 14:10 ` Petr Vorel
@ 2026-05-26 14:14 ` Petr Vorel
  2026-05-26 15:29 ` [LTP] " linuxtestproject.agent
  2 siblings, 0 replies; 5+ messages in thread
From: Petr Vorel @ 2026-05-26 14:14 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi Wei,

...
>  	while (!end) {
>  		memfree = SAFE_READ_MEMINFO("MemFree:");
>  		tune = TST_SYS_CONF_LONG_GET(MIN_FREE_KBYTES);

>  		if (memfree < tune) {
> -			tst_res(TINFO, "MemFree is %lu kB, "
> -				 "min_free_kbytes is %lu kB", memfree, tune);
> -			tst_res(TFAIL, "MemFree < min_free_kbytes");
> +			/*
> +			 * Give it some time to reclaim. The kernel should keep
> +			 * MemFree above min_free_kbytes, but transient drops
> +			 * are possible under high pressure.
> +			 */
> +			for (i = 1; i < 1024; i *= 2) {
> +				usleep(i * 1000);
> +				memfree = SAFE_READ_MEMINFO("MemFree:");
> +				if (memfree >= tune)
> +					break;
> +			}
> +
> +			if (memfree < tune) {
> +				tst_res(TINFO, "MemFree is %lu kB, min_free_kbytes is %lu kB",
> +					memfree, tune);
> +				tst_res(TFAIL, "MemFree < min_free_kbytes");
nit: TINFO message followed by TFAIL message is not optimal. I'd either always
print TINFO:

			tst_res(TINFO, "MemFree is %lu kB, min_free_kbytes is %lu kB",
				memfree, tune);

			if (memfree < tune) {
				tst_res(TFAIL, "MemFree < min_free_kbytes");

or combine info in the error message:
			if (memfree < tune) {
				tst_res(TFAIL, "MemFree %lu kB < min_free_kbytes %lu kB", memfree, tune);

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

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

* Re: [LTP] min_free_kbytes: Handle transient memory drops in check_monitor
  2026-05-26  8:36 [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor Wei Gao via ltp
  2026-05-26 14:10 ` Petr Vorel
  2026-05-26 14:14 ` Petr Vorel
@ 2026-05-26 15:29 ` linuxtestproject.agent
  2 siblings, 0 replies; 5+ messages in thread
From: linuxtestproject.agent @ 2026-05-26 15:29 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi Wei,

On Tue May 26 08:36:47 2026 +0000, Wei Gao wrote:
> min_free_kbytes: Handle transient memory drops in check_monitor

>  	struct sigaction sa;
>  
> +	end = 0;
> +

Good catch for multi-iteration support.

> -		sleep(2);
> +		usleep(100000);

Changing from 2s to 100ms makes the monitor much more responsive.

> +		for (i = 1; i < 1024; i *= 2) {
> +			usleep(i * 1000);
> +			memfree = SAFE_READ_MEMINFO("MemFree:");
> +			if (memfree >= tune)
> +				break;
> +		}

The exponential backoff is a good approach. Total wait time is ~1023ms
(1+2+4+8+16+32+64+128+256+512), matching the commit message.

All good. Approved.

---
Note:

The agent can sometimes produce false positives although often its
findings are genuine. If you find issues with the review, please
comment this email or ignore the suggestions.

Regards,
LTP AI Reviewer

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

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

* Re: [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor
  2026-05-26 14:10 ` Petr Vorel
@ 2026-05-27  5:08   ` Wei Gao via ltp
  0 siblings, 0 replies; 5+ messages in thread
From: Wei Gao via ltp @ 2026-05-27  5:08 UTC (permalink / raw)
  To: Petr Vorel; +Cc: ltp

On Tue, May 26, 2026 at 04:10:54PM +0200, Petr Vorel wrote:
> Hi Wei,
> 
> > High memory pressure can cause MemFree to temporarily drop below the
> > min_free_kbytes threshold before the kernel reclaimer can catch up.
> > This results in intermittent test failures, particularly observed on
> > openQA aarch64 machines.
> 
> > Implement a 1-second grace period with exponential backoff polling
> > (from 1ms up to 512ms) in check_monitor() to allow the kernel time to
> > reclaim memory.
> 
> > Also the global 'end' flag is reset for multi-iteration
> > support (-i).
> IMHO this is not needed. Is it just wrong AI hint or you really spot it's
> needed?
Yes, reset 'end' flag is not needed, AI indeed complain wrong hint
firstly and later take this as defence programing.
> 
> > Signed-off-by: Wei Gao <wegao@suse.com>
> > ---
> >  .../kernel/mem/tunable/min_free_kbytes.c      | 36 +++++++++++++------
> >  1 file changed, 26 insertions(+), 10 deletions(-)
> 
> > diff --git a/testcases/kernel/mem/tunable/min_free_kbytes.c b/testcases/kernel/mem/tunable/min_free_kbytes.c
> > index a62e4ae9d..59ba6a9e1 100644
> > --- a/testcases/kernel/mem/tunable/min_free_kbytes.c
> > +++ b/testcases/kernel/mem/tunable/min_free_kbytes.c
> > @@ -1,6 +1,6 @@
> >  // SPDX-License-Identifier: GPL-2.0-or-later
> >  /*
> > - * Copyright (c) Linux Test Project, 2012-2025
> > + * Copyright (c) Linux Test Project, 2012-2026
> >   * Copyright (C) 2012-2017  Red Hat, Inc.
> >   */
> 
> > @@ -53,6 +53,8 @@ static void min_free_kbytes_test(void)
> >  	int pid, status;
> >  	struct sigaction sa;
> 
> > +	end = 0;
> Why I think it's not needed? Here you're in the parent. But the value is changed
> only in child (forked process), they run in a separate memory spaces (change in
> child is not visible for the parent).
> 
> In patch without it + updated commit message you may add:
> Reviewed-by: Petr Vorel <pvorel@suse.cz>
> 
> > +
> >  	sa.sa_handler = sighandler;
> >  	if (sigemptyset(&sa.sa_mask) < 0)
> >  		tst_brk(TBROK | TERRNO, "sigemptyset");
> > @@ -140,14 +142,13 @@ static void test_tune(unsigned long overcommit_policy)
> >  		} else {
> >  			if (WIFEXITED(status)) {
> >  				if (WEXITSTATUS(status) != 0) {
> > -					tst_res(TFAIL, "child unexpectedly "
> > -						 "failed: %d", status);
> > +					tst_res(TFAIL, "child unexpectedly failed: %d",
> > +						status);
> >  				}
> >  			} else if (!WIFSIGNALED(status) ||
> >  				   WTERMSIG(status) != SIGKILL) {
> > -				tst_res(TFAIL,
> > -					 "child unexpectedly failed: %d",
> > -					 status);
> > +				tst_res(TFAIL, "child unexpectedly failed: %d",
> > +					status);
> >  			}
> Unrelated cleanup, but thanks.
> 
> >  		}
> >  	}
> > @@ -183,18 +184,33 @@ static void check_monitor(void)
> >  {
> >  	unsigned long tune;
> >  	unsigned long memfree;
> > +	int i;
> 
> >  	while (!end) {
> >  		memfree = SAFE_READ_MEMINFO("MemFree:");
> >  		tune = TST_SYS_CONF_LONG_GET(MIN_FREE_KBYTES);
> 
> >  		if (memfree < tune) {
> > -			tst_res(TINFO, "MemFree is %lu kB, "
> > -				 "min_free_kbytes is %lu kB", memfree, tune);
> > -			tst_res(TFAIL, "MemFree < min_free_kbytes");
> > +			/*
> > +			 * Give it some time to reclaim. The kernel should keep
> > +			 * MemFree above min_free_kbytes, but transient drops
> > +			 * are possible under high pressure.
> > +			 */
> > +			for (i = 1; i < 1024; i *= 2) {
> > +				usleep(i * 1000);
> > +				memfree = SAFE_READ_MEMINFO("MemFree:");
> > +				if (memfree >= tune)
> > +					break;
> > +			}
> > +
> > +			if (memfree < tune) {
> > +				tst_res(TINFO, "MemFree is %lu kB, min_free_kbytes is %lu kB",
> > +					memfree, tune);
> > +				tst_res(TFAIL, "MemFree < min_free_kbytes");
> > +			}
> >  		}
> 
> > -		sleep(2);
> > +		usleep(100000);
> >  	}
> >  }

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

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

end of thread, other threads:[~2026-05-27  5:08 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-26  8:36 [LTP] [PATCH v1] min_free_kbytes: Handle transient memory drops in check_monitor Wei Gao via ltp
2026-05-26 14:10 ` Petr Vorel
2026-05-27  5:08   ` Wei Gao via ltp
2026-05-26 14:14 ` Petr Vorel
2026-05-26 15:29 ` [LTP] " linuxtestproject.agent

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