This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2 02/21] nptl: Fix testcases for new pthread cancellation mechanism
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: Zack Weinberg <zackw at panix dot com>, libc-alpha at sourceware dot org
- Date: Mon, 7 May 2018 14:13:32 -0300
- Subject: Re: [PATCH v2 02/21] nptl: Fix testcases for new pthread cancellation mechanism
- Autocrypt: addr=adhemerval dot zanella at linaro dot org; prefer-encrypt=mutual; keydata= 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
- Openpgp: preference=signencrypt
- References: <20180507024909.5598-1-zackw@panix.com> <20180507024909.5598-2-zackw@panix.com>
On 06/05/2018 23:49, Zack Weinberg wrote:
> On 26 Feb 2018, Adhemerval Zanella wrote:
>> With upcoming fix for BZ#12683, pthread cancellation does not act for:
>>
>> 1. If syscall is blocked but with some side effects already having
>> taken place (e.g. a partial read or write).
>> 2. After the syscall has returned.
>>
>> The main change is due the fact programs need to act in syscalls with
>> side-effects (for instance, to avoid leak of allocated resources or
>> handle partial read/write).
>>
>> This patch changes the NPTL testcase that assumes the old behavior and
>> also remove the tst-cancel-wrappers.sh test (which checks for symbols
>> that will not exist anymore).
>
> It's OK and expected that we have to adjust test cases that were
> expecting the old behavior ...
>
>> For tst-cancel{2,3} case it remove the pipe close because it might
>> cause the write syscall to return with side effects if the close is
>> executed before the pthread cancel.
>
> ... however, this change appears to be wrong. If cancellation is
> broken, these tests will now deadlock rather than failing cleanly.
On current cancellation implementation the thread will finish regardless
and sigcancel_handler will act whether there is side-effects or not
(the pipe close). The issue is cancellation should not happen if syscall
returns but some side effects already took place, in this case the pipe
close.
>
> If I understand correctly, the problem you're trying to avoid is that
> the 'tf' thread could conceivably receive the closed-pipe event before
> the cancellation signal, even though the 'do_test' thread triggers the
> cancellation signal first. I don't know of any way to fix this 100%,
> but I think it would be good enough to use pthread_timedjoin_np to
> sleep for a hundred milliseconds or so in the 'do_test' thread, and
> then close the pipe if the 'tf' thread is still alive.
Yes, although for this specific case I am not sure if this could happen
in practice. I assume if a thread issues a 'signal' followed by a 'close',
the signal target thread will receive the events in a ordered manner, i.e,
the signal handler will be activated before the syscall sees any
side-effects (the close). It seems to be Linux behaviour, but I am not
sure if a different system might act differently.
And I try to avoid the timing check, such as pthread_timedjoin_np,
because they tend to quite fragile in practice for such cases (due either
to system load when testing glibc, machine performance, etc.).
I will remove the close removal changes in next iteration.
>
> (tst-cancel4.c appears to be trying to ensure that cancellations are
> pending with a pthread_barrier_t, but as far as I know there's no
> guarantee that if a thread does
>
> pthread_cancel(th);
> pthread_barrier_wait(ba);
>
> where 'th' also waits on 'ba', the SIGCANCEL will actually be
> delivered before the barrier unblocks, either. Feh.)
>
>> It also changes how to call the read syscall on tst-backtrace{5,6}
>> to use syscall instead of read cancelable syscall to avoid need to
>> handle the cancelable bridge function calls. It requires a change
>> on powerpc syscall implementation to create a stackframe, since
>> powerpc backtrace rely on such information.
>
> It doesn't look technically difficult to me to handle an additional
> stack frame or two in the trace. They're always going to be there,
> aren't they? In the new world order, the stack trace will always be
>
> 0 handle_signal
> 1 <signal trampoline>
> 2 __syscall_cancel_arch
> 3 __syscall_cancel
> 4 read
> 5 fn
> 6 fn
> 7 fn
> 8 do_test
>
> won't it? I think teaching the backtrace logic about this would be
> better than needing to use a raw syscall() and then mess with the
> PowerPC implementation of syscall(). I might feel differently about
> this change if __read_nocancel were a public API, but it isn't...
With your current suggestion to powerpc syscall bits, there is no need
to actually change the powerpc syscall implementation besides an
additional CFI mechanism. But I do not mind to change the testcase on
the bz12683 fix itself, the only advantage I see is by using indirect
syscall there is no need to actually change it again.
>
>> Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
>> aarch64-linux-gnu, arm-linux-gnueabihf, powerpc64le-linux-gnu,
>> powerpc-linux-gnu, sparcv9-linux-gnu, and sparc64-linux-gnu.
>
> When you say checked, do you mean you actually ran the test cases, or
> did you just compile them (perhaps with a cross-compiler)?
It is a full make check on native machines.
>
>> * nptl/Makefile [$(run-built-tests) = yes] (tests-special): Remove
>> tst-cancel-wrappers.sh.
>> * nptl/tst-cancel-wrappers.sh: Remove file.
>
> This part is OK.
>
>> * nptl/tst-cancel4.c (tf_write): Handle cancelled syscall with
>> side-effects.
>> (tf_send): Likewise.
>
> This part is also OK. I think the test can still fail spuriously due
> to races, but this one can't deadlock, at least, so we can live with it.
>
>> * sysdeps/unix/sysv/linux/powerpc/syscall.S (syscall): Create stack
>> frame.
>
> This ChangeLog entry belongs to patch 1.
Ack. I will remove it.
>
> zw
>