mailing list of musl libc
 help / color / mirror / code / Atom feed
From: changdiankang <changdiankang@huawei.com>
To: "musl@lists.openwall.com" <musl@lists.openwall.com>
Subject: [musl] [PATCH] set tid address in fork
Date: Thu, 20 Jul 2023 13:53:11 +0000	[thread overview]
Message-ID: <953a6adcee154977b4695bb9e485225c@huawei.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 912 bytes --]

In pthrad_exit the exiting thread will hold the thread list lock,
and will unlock it in kernel by clear the tid address &__thread_list_lock.

A thread created by pthrad_create is created with clone syscall with
CLONE_CHILD_CLEARTID flag and &__thread_list_lock as child_tid
parameter. When the thread exits, the thread list lock can be woke up
(see man clone CLONE_CHILD_CLEARTID).

But in fork, the main thread is created with fork syscall or with
clone syscall without CLONE_CHILD_CLEARTID flag. The &__thread_list_lock
is not be set to tid address. So when the main thread exits, the thread
list lock can't be woke up by kernel. This may lead some problems when
other child threads try to hold this lock. For example, a child thread
blocks at waiting thread list lock when joining the main thread.

To fix this issue, we should set &__thread_list_lock to the main thread tid
address in fork.

[-- Attachment #2: 0001-set-tid-address-in-fork.patch --]
[-- Type: application/octet-stream, Size: 1685 bytes --]

From 237ed44f50b266ee6e1acbcbb433fe4264b0e36a Mon Sep 17 00:00:00 2001
From: Chang Diankang <changdiankang@huawei.com>
Date: Thu, 20 Jul 2023 17:25:01 +0800
Subject: [PATCH] set tid address in fork

In pthrad_exit the exiting thread will hold the thread list lock,
and will unlock it in kernel by clear the tid address &__thread_list_lock.

A thread created by pthrad_create is created with clone syscall with
CLONE_CHILD_CLEARTID flag and &__thread_list_lock as child_tid
parameter. When the thread exits, the thread list lock can be woke up
(see man clone CLONE_CHILD_CLEARTID).

But in fork, the main thread is created with fork syscall or with
clone syscall without CLONE_CHILD_CLEARTID flag. The &__thread_list_lock
is not be set to tid address. So when the main thread exits, the thread
list lock can't be woke up by kernel. This may leads some problems when
other child threads try to hold this lock. For example, a child thread
blocks at waiting thread list lock when joining the main thread.

To fix this issue, we should set &__thread_list_lock to the main thread tid
address in fork.

Signed-off-by: Chang Diankang <changdiankang@huawei.com>
---
 src/process/_Fork.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/process/_Fork.c b/src/process/_Fork.c
index da063868..a192e5a2 100644
--- a/src/process/_Fork.c
+++ b/src/process/_Fork.c
@@ -23,7 +23,7 @@ pid_t _Fork(void)
 #endif
 	if (!ret) {
 		pthread_t self = __pthread_self();
-		self->tid = __syscall(SYS_gettid);
+		self->tid = __syscall(SYS_set_tid_address, &__thread_list_lock);
 		self->robust_list.off = 0;
 		self->robust_list.pending = 0;
 		self->next = self->prev = self;
-- 
2.25.1


             reply	other threads:[~2023-07-20 14:08 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-20 13:53 changdiankang [this message]
2023-07-20 14:22 ` Alexey Izbyshev
2023-07-20 17:30   ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=953a6adcee154977b4695bb9e485225c@huawei.com \
    --to=changdiankang@huawei.com \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).