diff mbox series

getrusage03: Forcing context switches to update resource usage

Message ID 20240805063616.12572-1-liwang@redhat.com
State New
Headers show
Series getrusage03: Forcing context switches to update resource usage | expand

Commit Message

Li Wang Aug. 5, 2024, 6:36 a.m. UTC
Our CI sporadically complains that this test grandchild's MAXRSS did not reach
the expected 300MB size.

    12 getrusage03.c:86: TFAIL: child.children = 258048, expected 307200

As the ru_maxrss value is generally updated at certain intervals or under
specific conditions, such as page faults or context switches. There may be
delay between the completion of memset() and the update of ru_maxrss.

To address this issue, we create a function to force context switches by
calling sched_yield() multiple times. This approach helps to ensure that
the system has the opportunity to update the ru_maxrss value more promptly.

Reproted-by: Scott Weaver <scweaver@redhat.com>
Signed-off-by: Li Wang <liwang@redhat.com>
---
 testcases/kernel/syscalls/getrusage/getrusage03.h | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Li Wang Aug. 5, 2024, 6:58 a.m. UTC | #1
I proposed a patch in upstream ML:
  https://lists.linux.it/pipermail/ltp/2024-August/039693.html

On Mon, Aug 5, 2024 at 2:36 PM Li Wang <liwang@redhat.com> wrote:

> Our CI sporadically complains that this test grandchild's MAXRSS did not
> reach
> the expected 300MB size.
>
>     12 getrusage03.c:86: TFAIL: child.children = 258048, expected 307200
>
> As the ru_maxrss value is generally updated at certain intervals or under
> specific conditions, such as page faults or context switches. There may be
> delay between the completion of memset() and the update of ru_maxrss.
>
> To address this issue, we create a function to force context switches by
> calling sched_yield() multiple times. This approach helps to ensure that
> the system has the opportunity to update the ru_maxrss value more promptly.
>
> Reproted-by: Scott Weaver <scweaver@redhat.com>
> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
>  testcases/kernel/syscalls/getrusage/getrusage03.h | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/testcases/kernel/syscalls/getrusage/getrusage03.h
> b/testcases/kernel/syscalls/getrusage/getrusage03.h
> index 8bee0b9e5..58a98b430 100644
> --- a/testcases/kernel/syscalls/getrusage/getrusage03.h
> +++ b/testcases/kernel/syscalls/getrusage/getrusage03.h
> @@ -6,10 +6,19 @@
>  #ifndef LTP_GETRUSAGE03_H
>  #define LTP_GETRUSAGE03_H
>
> +#include <sched.h>
>  #include "tst_test.h"
>
>  #define DELTA_MAX 20480
>
> +static void force_context_switches(int iterations)
> +{
> +       tst_res(TINFO, "Forcing context switch %d times", iterations);
> +
> +       for (int i = 0; i < iterations; i++)
> +               sched_yield();
> +}
> +
>  static void consume_mb(int consume_nr)
>  {
>         void *ptr;
> @@ -22,6 +31,8 @@ static void consume_mb(int consume_nr)
>         ptr = SAFE_MALLOC(size);
>         memset(ptr, 0, size);
>
> +       force_context_switches(10);
> +
>         SAFE_FILE_LINES_SCANF("/proc/self/status", "VmSwap: %lu",
> &vmswap_size);
>         if (vmswap_size > 0)
>                 tst_brk(TBROK, "VmSwap is not zero");
> --
> 2.45.2
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
>
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/getrusage/getrusage03.h b/testcases/kernel/syscalls/getrusage/getrusage03.h
index 8bee0b9e5..58a98b430 100644
--- a/testcases/kernel/syscalls/getrusage/getrusage03.h
+++ b/testcases/kernel/syscalls/getrusage/getrusage03.h
@@ -6,10 +6,19 @@ 
 #ifndef LTP_GETRUSAGE03_H
 #define LTP_GETRUSAGE03_H
 
+#include <sched.h>
 #include "tst_test.h"
 
 #define DELTA_MAX 20480
 
+static void force_context_switches(int iterations)
+{
+	tst_res(TINFO, "Forcing context switch %d times", iterations);
+
+	for (int i = 0; i < iterations; i++)
+		sched_yield();
+}
+
 static void consume_mb(int consume_nr)
 {
 	void *ptr;
@@ -22,6 +31,8 @@  static void consume_mb(int consume_nr)
 	ptr = SAFE_MALLOC(size);
 	memset(ptr, 0, size);
 
+	force_context_switches(10);
+
 	SAFE_FILE_LINES_SCANF("/proc/self/status", "VmSwap: %lu", &vmswap_size);
 	if (vmswap_size > 0)
 		tst_brk(TBROK, "VmSwap is not zero");