Re: [PATCH v1] userfaultfd: selftests: infinite loop in faulting_process

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Axel Rasmussen <axelrasmussen@xxxxxxxxxx>

On Mon, Jun 13, 2022 at 4:33 PM Edward Liaw <edliaw@xxxxxxxxxx> wrote:
>
> On Android this test is getting stuck in an infinite loop due to
> indeterminate behavior:
>
> The local variables steps and signalled were being reset to 1 and 0
> respectively after every jump back to sigsetjmp by siglongjmp in the
> signal handler. The test was incrementing them and expecting them to
> retain their incremented values. The documentation for siglongjmp says:
>
> All accessible objects have values as of the time sigsetjmp() was
> called, except that the values of objects of automatic storage duration
> which are local to the function containing the invocation of the
> corresponding sigsetjmp() which do not have volatile-qualified type and
> which are changed between the sigsetjmp() invocation and siglongjmp()
> call are indeterminate.
>
> Tagging steps and signalled with volatile enabled the test to pass.
>
> Signed-off-by: Edward Liaw <edliaw@xxxxxxxxxx>
> ---
>  tools/testing/selftests/vm/userfaultfd.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
> index 0bdfc1955229..2b2a68722ae1 100644
> --- a/tools/testing/selftests/vm/userfaultfd.c
> +++ b/tools/testing/selftests/vm/userfaultfd.c
> @@ -931,7 +931,7 @@ static int faulting_process(int signal_test)
>         unsigned long split_nr_pages;
>         unsigned long lastnr;
>         struct sigaction act;
> -       unsigned long signalled = 0;
> +       volatile unsigned long signalled = 0;
>
>         split_nr_pages = (nr_pages + 1) / 2;
>
> @@ -946,7 +946,7 @@ static int faulting_process(int signal_test)
>         }
>
>         for (nr = 0; nr < split_nr_pages; nr++) {
> -               int steps = 1;
> +               volatile int steps = 1;
>                 unsigned long offset = nr * page_size;
>
>                 if (signal_test) {
> --
> 2.36.1.476.g0c4daa206d-goog
>



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux