[LTP] [PATCH 2/2] mem: ksm: fixes for race conditions
Richard Palethorpe
rpalethorpe@suse.de
Wed Sep 13 09:46:49 CEST 2017
Andrea Arcangeli writes:
> stop_ksm_children doesn't actually stop the children, it waits the
> children to stop themselves after they finished setting up the memory.
>
> Problem is the test was waiting for two passes of KSM (to merge all
> the memory) in wait_ksmd_full_scan before waiting the child to stop
> setting up the memory. Two passes of KSM aren't enough if the children
> aren't settled yet. This fixes it by waiting the children to stop
> operating before waiting KSM to merge the memory.
>
> waitpid WCONTINUED also doesn't make sense, it's better and more
> strict to wait until all children truly exited, otherwise it would
> just return immediately because the children were waken by SIGCONT at
> the last resume. Removing WCONTINUED will let the parent truly wait
> the children to verify the memory and exit after it.
>
> These issues showed up after speeding up the wait_ksmd_full_scan and
> after removing other unnecessary wait times.
>
> The test is now faster and at the same time more accurate by waiting
> at least two passes of KSM which by the kernel implementation we know
> is enough to reach a settled merged state without the need of other
> artificial delays.
>
> In case of failure of the checks, this now also prints the actual
> value to provide more debug info in the log.
>
> Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
> ---
> testcases/kernel/mem/lib/mem.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
> index 6d8945081..4f9779ea5 100644
> --- a/testcases/kernel/mem/lib/mem.c
> +++ b/testcases/kernel/mem/lib/mem.c
> @@ -261,7 +261,8 @@ static void check(char *path, long int value)
> SAFE_FILE_SCANF(fullpath, "%ld", &actual_val);
>
> if (actual_val != value)
> - tst_res(TFAIL, "%s is not %ld.", path, value);
> + tst_res(TFAIL, "%s is not %ld but %ld.", path, value,
> + actual_val);
> else
> tst_res(TPASS, "%s is %ld.", path, actual_val);
> }
> @@ -523,21 +524,20 @@ void create_same_memory(int size, int num, int unit)
> SAFE_FILE_PRINTF(PATH_KSM "sleep_millisecs", "0");
>
> resume_ksm_children(child, num);
> + stop_ksm_children(child, num);
> group_check(1, 2, size * num * pages - 2, 0, 0, 0, size * pages * num);
>
> - stop_ksm_children(child, num);
> resume_ksm_children(child, num);
> + stop_ksm_children(child, num);
> group_check(1, 3, size * num * pages - 3, 0, 0, 0, size * pages * num);
>
> - stop_ksm_children(child, num);
> resume_ksm_children(child, num);
> + stop_ksm_children(child, num);
> group_check(1, 1, size * num * pages - 1, 0, 0, 0, size * pages * num);
>
> - stop_ksm_children(child, num);
> resume_ksm_children(child, num);
> - group_check(1, 1, size * num * pages - 2, 0, 1, 0, size * pages * num);
> -
> stop_ksm_children(child, num);
> + group_check(1, 1, size * num * pages - 2, 0, 1, 0, size * pages * num);
>
> tst_res(TINFO, "KSM unmerging...");
> SAFE_FILE_PRINTF(PATH_KSM "run", "2");
> @@ -549,7 +549,7 @@ void create_same_memory(int size, int num, int unit)
> SAFE_FILE_PRINTF(PATH_KSM "run", "0");
> final_group_check(0, 0, 0, 0, 0, 0, size * pages * num);
>
> - while (waitpid(-1, &status, WUNTRACED | WCONTINUED) > 0)
> + while (waitpid(-1, &status, 0) > 0)
> if (WEXITSTATUS(status) != 0)
> tst_res(TFAIL, "child exit status is %d",
> WEXITSTATUS(status));
Ack, patch-set looks good to me.
--
Thank you,
Richard.
More information about the ltp
mailing list