[uclibc-ng-devel] [PATCH v2] Fix subtle race in tst-cancel2 / tst-cancelx2

Vineet Gupta Vineet.Gupta1 at synopsys.com
Mon Dec 18 11:18:40 PST 2017


On 12/08/2017 10:07 AM, Vineet Gupta wrote:
> When ran on ARC, these tests would ocassionally fail
> 
> | [ARCLinux]# for i in 1 2 3 4 5 ; do ./tst-cancel2; echo $?; done
> | write succeeded
> | result is wrong: expected 0xffffffff, got 0x1
> | 1							<-- fail
> | 0							<-- pass
> | 0							<--- pass
> | 0							<-- pass
> | write succeeded
> | result is wrong: expected 0xffffffff, got 0x1
> | 1							<-- fail
> 
> Same test (which originated form glibc) doesn't fail in glibc builds.
> Turns out there's a subtle race in uclibc version
> 
> The test creates a new thread, makes it do a looong write call, and
> parent then cancels the thread, expecting it to unwind out of write
> call cleanly. However the write (even for 10k bytes) could finish
> before parent gets a chance to resume and/or cancel it, causing the
> occasional failure.
> 
> Fix this subtelty by making it write not just once but forever.
> 
> Cc: Cupertino Miranda <cmiranda at synopsys.com>
> Signed-off-by: Vineet Gupta <vgupta at synopsys.com>
> ---
> Change since v1: fix typos in changelogs
> ---

Ping ?


>   test/nptl/tst-cancel2.c | 6 +-----
>   1 file changed, 1 insertion(+), 5 deletions(-)
> 
> diff --git a/test/nptl/tst-cancel2.c b/test/nptl/tst-cancel2.c
> index 45c9e8ea957a..08dd13b10f37 100644
> --- a/test/nptl/tst-cancel2.c
> +++ b/test/nptl/tst-cancel2.c
> @@ -32,11 +32,7 @@ tf (void *arg)
>        write blocks.  */
>     char buf[100000];
>   
> -  if (write (fd[1], buf, sizeof (buf)) == sizeof (buf))
> -    {
> -      puts ("write succeeded");
> -      return (void *) 1l;
> -    }
> +  while (write (fd[1], buf, sizeof (buf)) > 0);
>   
>     return (void *) 42l;
>   }
> 




More information about the linux-snps-arc mailing list