public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Eric Dumazet <dada1@cosmosbay.com>
To: Eric Dumazet <dada1@cosmosbay.com>
Cc: Ulrich Drepper <drepper@redhat.com>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: second, bigger problem with private futexes
Date: Mon, 21 May 2007 21:26:25 +0200	[thread overview]
Message-ID: <4651F261.2040903@cosmosbay.com> (raw)
In-Reply-To: <4651E992.9080205@cosmosbay.com>

Eric Dumazet a écrit :
> Ulrich Drepper a écrit :
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Eric Dumazet wrote:
>>> Do you mean POSIX allowed to mix PROCESS_PRIVATE and PROCESS_SHARED
>>> condvar and mutexes ? Seems silly to me :(
>>
> 
>> Don't judge what you don't understand.
> 
> Yes, I kindly apologise for this crime.
> 
>  > If all waiters are always in one
>> process but the notifiers can be in different processes, this setup
>> might make a lot of sense.
> 
> Thanks for providing this information.
> 
> I assume in this case the condvar is PSHARED, while mutex could be/is 
> PRIVATE ?
> 
> I wonder how old (assuming all shared) code could work, since the 
> notifier would call FUTEX_CMP_REQUEUE giving a target address outside of 
> this process vm ?
> 
> My understanding (probably bad, since I know nothing about POSIX as you 
> mentioned)
> 
> - Old code could not use FUTEX_CMP_REQUEUE if mutex was private.
> -> Old code was using a normal FUTEX_WAKE in this case.
> 
> So I repeat my question : Should we really add yer another futex command 
> in kernel for a corner case ?
> 

Reading this I realize it's confusing... :(

Because a process issuing a futex() syscall cannot point to another process vm 
(without giving more information than just a virtual address), I do think :

1) pthread_cond_broadcast() SHOULD use FUTEX_CMP_REQUEUE if :

condvar & mutex are PSHARED

2) pthread_cond_broadcast() MUST use FUTEX_CMP_REQUEUE_PRIVATE if :

condvar & mutex are PRIVATE

3) if condvar is PRIVATE and mutex is SHARED, a FUTEX_WAKE_PRIVATE should be 
done. (and loose the REQUEUE optim)
Yes we could add a special futex primitive for this special case. But I cannot 
see how a program could use such a construct.

4) if condvar is SHARED and mutex is private, we have a *problem*, because the 
process doing the broadcast() can be in another mm. So a requeue is not 
possible at all. -> a FUTEX_WAKE is necessary (no REQUEUE optim)
I guess it's OK performance wise since the notifier in this case probably 
doesnt hold a lock on the mutex. And probably old glibc was doing same thing, 
since the mutex address stored in condvar was possibly in another vm, and 
notifier had the same problem.


Thanks


  reply	other threads:[~2007-05-21 19:45 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-21 17:26 second, bigger problem with private futexes Ulrich Drepper
2007-05-21 18:15 ` Eric Dumazet
2007-05-21 18:26   ` Ulrich Drepper
2007-05-21 18:48     ` Eric Dumazet
2007-05-21 19:26       ` Eric Dumazet [this message]
2007-05-21 19:43         ` Ulrich Drepper
2007-05-21 19:55           ` Eric Dumazet

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=4651F261.2040903@cosmosbay.com \
    --to=dada1@cosmosbay.com \
    --cc=akpm@linux-foundation.org \
    --cc=drepper@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    /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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox