[PATCH]: Fix blocking pthread_join.

Stefan Liebler stli@linux.vnet.ibm.com
Wed Apr 25 11:27:00 GMT 2018


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?

Bye
Stefan

---

ChangeLog:

	* sysdeps/nptl/lowlevellock.h (lll_wait_tid):
	Use a volatile pointer to load __tid.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 20180425_lll_wait_tid.patch
Type: text/x-patch
Size: 1890 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20180425/146c3f8a/attachment.bin>


More information about the Libc-alpha mailing list