This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH]: Fix blocking pthread_join.


On 04/25/2018 06:27 AM, Stefan Liebler wrote:
> Hi,
> 
> On s390 (31bit) if glibc is build with -Os, pthread_join sometimes
> blocks indefinitely. This is e.g. observable with
> testcase intl/tst-gettext6.
> 
> pthread_join is calling lll_wait_tid(tid), which performs the futex-wait
> syscall in a loop as long as tid != 0 (thread is alive).
> 
> On s390 (and build with -Os), tid is loaded from memory before
> comparing against zero and then the tid is loaded a second time
> in order to pass it to the futex-wait-syscall.
> If the thread exits in between, then the futex-wait-syscall is
> called with the value zero and it waits until a futex-wake occurs.
> As the thread is already exited, there won't be a futex-wake.
> 
> In lll_wait_tid, the tid is stored to the local variable __tid,
> which is then used as argument for the futex-wait-syscall.
> But unfortunately the compiler is allowed to reload the value
> from memory.
> 
> With this patch, the tid is loaded by dereferencing a volatile pointer.
> Then the compiler is not allowed to reload the value for __tid from memory.
> 
> Okay to commit?

Would using an atomic type and an atomic load MO relaxed prevent the
compiler from reloading from memory?

I'm unhappy with the use of volatile here because it's not quite
the real semantics. Sure, the memory is volatile, it may change at
any point, but that's not what matters. What matters is that we load
from that memory once and only once.

-- 
Cheers,
Carlos.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]