From: Daniele Personal <d.dario76@gmail.com>
To: Florian Weimer <fweimer@redhat.com>
Cc: Rich Felker <dalias@libc.org>, musl@lists.openwall.com
Subject: Re: [musl] pthread_mutex_t shared between processes with different pid namespaces
Date: Thu, 06 Feb 2025 08:45:14 +0100 [thread overview]
Message-ID: <bafba9da6767a89c1acecf265873aed9cd0e4418.camel@gmail.com> (raw)
In-Reply-To: <87wme4hebo.fsf@oldenburg.str.redhat.com>
On Wed, 2025-02-05 at 11:32 +0100, Florian Weimer wrote:
> * Daniele Personal:
>
> > On Tue, 2025-02-04 at 13:53 -0500, Rich Felker wrote:
> > > On Mon, Feb 03, 2025 at 06:25:41PM +0100, Florian Weimer wrote:
> > > > * Daniele Personal:
> > > >
> > > > > On Sat, 2025-02-01 at 17:03 +0100, Florian Weimer wrote:
> > > > > > * Daniele Personal:
> > > > > >
> > > > > > > > Is this required for implementing the unlock-if-not-
> > > > > > > > owner
> > > > > > > > error
> > > > > > > > code
> > > > > > > > on mutex unlock?
> > > > > > >
> > > > > > > No, I don't see problems related to EOWNERDEAD.
> > > > > >
> > > > > > Sorry, what I meant is that the TID is needed for efficient
> > > > > > reporting
> > > > > > of
> > > > > > usage errors. It's not imposed by the robust list protocol
> > > > > > as
> > > > > > such..
> > > > > > There could be a PID-namespace-compatible robust mutex type
> > > > > > that does
> > > > > > not have this problem (but with less error checking).
> > > > > >
> > > > > > Thanks,
> > > > > > Florian
> > > > > >
> > > > >
> > > > > Are you saying that there are pthread_mutexes which can be
> > > > > shared
> > > > > across processes run on different pid namespaces? If yes I'm
> > > > > definitely
> > > > > interested on this. Can you tell me something more?
> > > >
> > > > You would have to add a new mutex type that is a mix of
> > > > PTHREAD_MUTEX_NORMAL amd PTHREAD_MUTEX_ROBUST. Closer to the
> > > > latter,
> > > > but without the ownership checks.
> > >
> > > This is inaccurate. Robust mutexes fundamentally depend on having
> > > the
> > > owner's tid in the owner field, and on this value not matching
> > > the
> > > tid of any other task that might hold the mutex. If these
> > > properties
> > > don't hold, the mutex may fail to unlock when the owner dies, or
> > > incorrectly unlock when another task mimicking the owner dies.
> > >
> > > The Linux robust mutex protocol fundamentally does not work
> > > across
> > > pid namespaces.
>
> Thank you, Rich, for the correction.
>
> > Looking at the code for musl 1.2.4, a pthread_mutex_t which has
> > been
> > initialized as shared and robust but not PI capable leaves
> > uncovered
> > only the case of pthread_mutex_unlock().
>
> > As mentioned by Rich, since TIDs are not unique across different
> > namespaces, a task might unlock a mutex hold by another one if they
> > have the same TID.
> >
> > I don't see other possible errors, am I missing something?
>
> The kernel code uses the owner TID to handle some special cases:
>
> /*
> * Special case for regular (non PI) futexes. The unlock
> path in
> * user space has two race scenarios:
> *
> * 1. The unlock path releases the user space futex value
> and
> * before it can execute the futex() syscall to wake up
> * waiters it is killed.
> *
> * 2. A woken up waiter is killed before it can acquire the
> * futex in user space.
> *
> * In the second case, the wake up notification could be
> generated
> * by the unlock path in user space after setting the futex
> value
> * to zero or by the kernel after setting the OWNER_DIED bit
> below.
> *
> * In both cases the TID validation below prevents a wakeup
> of
> * potential waiters which can cause these waiters to block
> * forever.
> *
> * In both cases the following conditions are met:
> *
> * 1) task->robust_list->list_op_pending != NULL
> * @pending_op == true
> * 2) The owner part of user space futex value == 0
> * 3) Regular futex: @pi == false
> *
> * If these conditions are met, it is safe to attempt waking
> up a
> * potential waiter without touching the user space futex
> value and
> * trying to set the OWNER_DIED bit. If the futex value is
> zero,
> * the rest of the user space mutex state is consistent, so
> a woken
> * waiter will just take over the uncontended futex. Setting
> the
> * OWNER_DIED bit would create inconsistent state and
> malfunction
> * of the user space owner died handling. Otherwise, the
> OWNER_DIED
> * bit is already set, and the woken waiter is expected to
> deal with
> * this.
> */
> owner = uval & FUTEX_TID_MASK;
>
> if (pending_op && !pi && !owner) {
> futex_wake(uaddr, FLAGS_SIZE_32 | FLAGS_SHARED, 1,
> FUTEX_BITSET_MATCH_ANY);
> return 0;
> }
>
> As a result, it's definitely just a userspace-only change if you need
> to
> use the robust mutex list across PID namespaces.
>
I tried to understand what you mean here but can't: can you please
explain me which userspace-only change is needed?
> Thanks,
> Florian
>
next prev parent reply other threads:[~2025-02-06 7:45 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-28 13:22 Daniele Personal
2025-01-28 15:02 ` Rich Felker
2025-01-28 16:13 ` Daniele Personal
2025-01-28 18:24 ` Florian Weimer
2025-01-31 9:31 ` Daniele Personal
2025-01-31 20:30 ` Markus Wichmann
2025-02-03 13:54 ` Daniele Personal
2025-02-01 16:03 ` Florian Weimer
2025-02-03 12:58 ` Daniele Personal
2025-02-03 17:25 ` Florian Weimer
2025-02-04 16:48 ` Daniele Personal
2025-02-04 18:53 ` Rich Felker
2025-02-05 10:17 ` Daniele Personal
2025-02-05 10:32 ` Florian Weimer
2025-02-06 7:45 ` Daniele Personal [this message]
2025-02-07 16:19 ` Rich Felker
2025-02-08 9:20 ` Daniele Dario
2025-02-08 12:39 ` Rich Felker
2025-02-08 14:40 ` Daniele Dario
2025-02-08 14:52 ` Rich Felker
2025-02-10 16:12 ` Daniele Personal
2025-02-10 18:14 ` Rich Felker
2025-02-11 9:34 ` Daniele Personal
2025-02-11 11:38 ` Rich Felker
2025-02-11 13:53 ` Daniele Personal
2025-02-10 18:44 ` Jeffrey Walton
2025-02-10 18:58 ` Rich Felker
2025-02-07 16:34 ` Florian Weimer
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=bafba9da6767a89c1acecf265873aed9cd0e4418.camel@gmail.com \
--to=d.dario76@gmail.com \
--cc=dalias@libc.org \
--cc=fweimer@redhat.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).