public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
@ 2016-06-21  3:39 Li Wang
  2016-06-21  7:00 ` Jan Stancek
  0 siblings, 1 reply; 5+ messages in thread
From: Li Wang @ 2016-06-21  3:39 UTC (permalink / raw)
  To: ltp

We occasionally catch errors like:
oom03       0  TINFO  :  start OOM testing for KSM pages.
oom03       0  TINFO  :  expected victim is 3490.
oom03       6  TFAIL  :  mem.c:163: victim unexpectedly ended with retcode: 0, expected: 12
oom03       0  TINFO  :  set overcommit_memory to 0

It cames from the caller testoom(0, 1, ENOMEM, 1). The issue was occurred
because child_alloc() go into single(lite == 1) thread mode but successfully
finish the memory allocation and return 0. A probably reason is that KSM
scan merged same pages and disturbed the OOM test in cgroup.

In this patch, keep KSM scan off to prevent OOM test in cgroup distrubing.

Signed-off-by: Li Wang <liwang@redhat.com>
---
 testcases/kernel/mem/lib/mem.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
index 3d853a3..b43b7f8 100644
--- a/testcases/kernel/mem/lib/mem.c
+++ b/testcases/kernel/mem/lib/mem.c
@@ -230,7 +230,9 @@ void testoom(int mempolicy, int lite, int retcode, int allow_sigkill)
 	} else {
 		tst_resm(TINFO, "start OOM testing for KSM pages.");
 		SAFE_FILE_SCANF(cleanup, PATH_KSM "run", "%d", &ksm_run_orig);
-		SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1");
+		/* Let KSM off if lite == 1, since limit_in_bytes may vary from
+		 * run to run, which isn't reliable for oom03 cgroup test.*/
+		if (!lite) SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1");
 		oom(KSM, lite, retcode, allow_sigkill);
 		SAFE_FILE_PRINTF(cleanup,PATH_KSM "run", "%d", ksm_run_orig);
 	}
-- 
1.8.3.1


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

* [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
  2016-06-21  3:39 [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread Li Wang
@ 2016-06-21  7:00 ` Jan Stancek
  2016-06-21  7:56   ` Li Wang
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Stancek @ 2016-06-21  7:00 UTC (permalink / raw)
  To: ltp



----- Original Message -----
> From: "Li Wang" <liwang@redhat.com>
> To: jstancek@redhat.com
> Cc: ltp@lists.linux.it
> Sent: Tuesday, 21 June, 2016 5:39:52 AM
> Subject: [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread

The single thread is not important here, it's how much that allocation
contributes to limit_in_bytes. oom01 on 2 CPU system will do all
allocations in single thread and KSM won't be turned off.

> 
> We occasionally catch errors like:
> oom03       0  TINFO  :  start OOM testing for KSM pages.
> oom03       0  TINFO  :  expected victim is 3490.
> oom03       6  TFAIL  :  mem.c:163: victim unexpectedly ended with retcode:
> 0, expected: 12
> oom03       0  TINFO  :  set overcommit_memory to 0
> 
> It cames from the caller testoom(0, 1, ENOMEM, 1). The issue was occurred
> because child_alloc() go into single(lite == 1) thread mode but successfully
> finish the memory allocation and return 0. A probably reason is that KSM
> scan merged same pages and disturbed the OOM test in cgroup.
> 
> In this patch, keep KSM scan off to prevent OOM test in cgroup distrubing.
> 
> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
>  testcases/kernel/mem/lib/mem.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
> index 3d853a3..b43b7f8 100644
> --- a/testcases/kernel/mem/lib/mem.c
> +++ b/testcases/kernel/mem/lib/mem.c
> @@ -230,7 +230,9 @@ void testoom(int mempolicy, int lite, int retcode, int
> allow_sigkill)
>  	} else {
>  		tst_resm(TINFO, "start OOM testing for KSM pages.");
>  		SAFE_FILE_SCANF(cleanup, PATH_KSM "run", "%d", &ksm_run_orig);
> -		SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1");
> +		/* Let KSM off if lite == 1, since limit_in_bytes may vary from
> +		 * run to run, which isn't reliable for oom03 cgroup test.*/
> +		if (!lite) SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1");
>  		oom(KSM, lite, retcode, allow_sigkill);
>  		SAFE_FILE_PRINTF(cleanup,PATH_KSM "run", "%d", ksm_run_orig);
>  	}

What if KSM was enabled before test started?

I'd skip this entire else block if lite == 1. With KSM off, it's nearly
identical to oom(NORMAL).

Regards,
Jan

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

* [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
  2016-06-21  7:00 ` Jan Stancek
@ 2016-06-21  7:56   ` Li Wang
  2016-06-21  8:39     ` Jan Stancek
  0 siblings, 1 reply; 5+ messages in thread
From: Li Wang @ 2016-06-21  7:56 UTC (permalink / raw)
  To: ltp

On Tue, Jun 21, 2016 at 03:00:29AM -0400, Jan Stancek wrote:
> 
> The single thread is not important here, it's how much that allocation
> contributes to limit_in_bytes. oom01 on 2 CPU system will do all
> allocations in single thread and KSM won't be turned off.

Ah, I forgot that situation. yes, it's not about the single thread,
it depends on the parameter 'lite' equal 1 or 0. I'd like to rewrite
these description.

> >  		SAFE_FILE_SCANF(cleanup, PATH_KSM "run", "%d", &ksm_run_orig);
> > -		SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1");
> > +		/* Let KSM off if lite == 1, since limit_in_bytes may vary from
> > +		 * run to run, which isn't reliable for oom03 cgroup test.*/
> > +		if (!lite) SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1");
> >  		oom(KSM, lite, retcode, allow_sigkill);
> >  		SAFE_FILE_PRINTF(cleanup,PATH_KSM "run", "%d", ksm_run_orig);
> >  	}
> 
> What if KSM was enabled before test started?

From what I know about KSM, if a memory area affected by function
madvise(..., MADV_MERGEABLE), the samepages located in that merory will be
easily merged by ksmd as long as we turn it on (echo 1 >/sys/kernel/mm/ksm/run).

And the ".../ksm/run" default value is 0, it means if we just affect
the memory area by madvise() function but with ksmd off, there won't
have any samepages be merged.

So, I add a conditional jugement as 'if (!lite)' before starting the ksmd.
There will be only enable the ksmd while lite == 0, the memory allocated
function go into infinite loop with so many parallel threads. And ksmd
doing samepages merge work but cann't stop OOM occur at the moment.

Am I right in thinking above?

> 
> I'd skip this entire else block if lite == 1. With KSM off, it's nearly
> identical to oom(NORMAL).

Hmm, actually there still have a little bit difference from oom(NORMALNORMAL).

In alloc_mem() function, if testcase == KSM, the memory area will do
madvise operation like:
	madvise(s, length, MADV_MERGEABLE)

That's the reason why I did not skip KSM but just keep it off.


Regards,
Li WANG

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

* [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
  2016-06-21  7:56   ` Li Wang
@ 2016-06-21  8:39     ` Jan Stancek
  2016-06-21  9:07       ` Li Wang
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Stancek @ 2016-06-21  8:39 UTC (permalink / raw)
  To: ltp



----- Original Message -----
> From: "Li Wang" <liwang@redhat.com>
> To: "Jan Stancek" <jstancek@redhat.com>
> Cc: ltp@lists.linux.it
> Sent: Tuesday, 21 June, 2016 9:56:13 AM
> Subject: Re: [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
> > What if KSM was enabled before test started?
> 
> From what I know about KSM, if a memory area affected by function
> madvise(..., MADV_MERGEABLE), the samepages located in that merory will be
> easily merged by ksmd as long as we turn it on (echo 1
> >/sys/kernel/mm/ksm/run).
> 
> And the ".../ksm/run" default value is 0, it means if we just affect
> the memory area by madvise() function but with ksmd off, there won't
> have any samepages be merged.

True, but there's no guarantee that every distro and every user will
keep the default set to 0. As I recall IBM's PowerKVM has KSM enabled
by default.

> > I'd skip this entire else block if lite == 1. With KSM off, it's nearly
> > identical to oom(NORMAL).
> 
> Hmm, actually there still have a little bit difference from
> oom(NORMALNORMAL).
> 
> In alloc_mem() function, if testcase == KSM, the memory area will do
> madvise operation like:
> 	madvise(s, length, MADV_MERGEABLE)

That's what I meant by "nearly identical". Looking at kernel,
only ksm seems to care about that flag, and we turn KSM off:

$ grep -l MADV_MERGEABLE -r mm/
mm/Kconfig
mm/madvise.c
mm/ksm.c

Regards,
Jan

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

* [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
  2016-06-21  8:39     ` Jan Stancek
@ 2016-06-21  9:07       ` Li Wang
  0 siblings, 0 replies; 5+ messages in thread
From: Li Wang @ 2016-06-21  9:07 UTC (permalink / raw)
  To: ltp

On Tue, Jun 21, 2016 at 04:39:50AM -0400, Jan Stancek wrote:
> ----- Original Message -----
> > From: "Li Wang" <liwang@redhat.com>
> > To: "Jan Stancek" <jstancek@redhat.com>
> > Cc: ltp@lists.linux.it
> > Sent: Tuesday, 21 June, 2016 9:56:13 AM
> > Subject: Re: [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread
> > > What if KSM was enabled before test started?
> > 
> > From what I know about KSM, if a memory area affected by function
> > madvise(..., MADV_MERGEABLE), the samepages located in that merory will be
> > easily merged by ksmd as long as we turn it on (echo 1
> > >/sys/kernel/mm/ksm/run).
> > 
> > And the ".../ksm/run" default value is 0, it means if we just affect
> > the memory area by madvise() function but with ksmd off, there won't
> > have any samepages be merged.
> 
> True, but there's no guarantee that every distro and every user will
> keep the default set to 0. As I recall IBM's PowerKVM has KSM enabled
> by default.

Okay, that sounds more reasonable.

> 
> > > I'd skip this entire else block if lite == 1. With KSM off, it's nearly
> > > identical to oom(NORMAL).
> > 
> > Hmm, actually there still have a little bit difference from
> > oom(NORMALNORMAL).
> > 
> > In alloc_mem() function, if testcase == KSM, the memory area will do
> > madvise operation like:
> > 	madvise(s, length, MADV_MERGEABLE)
> 
> That's what I meant by "nearly identical". Looking at kernel,
> only ksm seems to care about that flag, and we turn KSM off:

Seems like skip oom(KSM) here is better than turn it off. :)

I'll rewrite a new one. Thanks!

Regards,
Li WANG

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

end of thread, other threads:[~2016-06-21  9:07 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-21  3:39 [LTP] [PATCH] mem/lib: Keep KSM off when child_alloc() allocate memory in single thread Li Wang
2016-06-21  7:00 ` Jan Stancek
2016-06-21  7:56   ` Li Wang
2016-06-21  8:39     ` Jan Stancek
2016-06-21  9:07       ` Li Wang

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