* [rfc][patch] futex: restartable futex_wait?
@ 2007-03-07 15:33 Nick Piggin
2007-03-08 17:29 ` Ingo Molnar
0 siblings, 1 reply; 8+ messages in thread
From: Nick Piggin @ 2007-03-07 15:33 UTC (permalink / raw)
To: Ingo Molnar, Linux Kernel Mailing List
Hi Ingo,
I'm seeing an LTP test fail for ltp test sigaction_16_24. Basically,
it tests whether the SA_RESTART flag works for the sem_wait operation.
I see sem_wait is implemented with futex_wait, so I wonder whether we
can make it restartable? Am I going about it the right way? (Seems to
fix the testcase here).
Thanks,
Nick
--
Index: linux-2.6/kernel/futex.c
===================================================================
--- linux-2.6.orig/kernel/futex.c
+++ linux-2.6/kernel/futex.c
@@ -978,6 +978,7 @@ static void unqueue_me_pi(struct futex_q
drop_futex_key_refs(&q->key);
}
+static long futex_wait_restart(struct restart_block *restart);
static int futex_wait(u32 __user *uaddr, u32 val, unsigned long time)
{
struct task_struct *curr = current;
@@ -1077,11 +1078,22 @@ static int futex_wait(u32 __user *uaddr,
return 0;
if (time == 0)
return -ETIMEDOUT;
+
/*
* We expect signal_pending(current), but another thread may
* have handled it for us already.
*/
- return -EINTR;
+ if (time == MAX_SCHEDULE_TIMEOUT)
+ return -ERESTARTSYS;
+ else {
+ struct restart_block *restart;
+ restart = ¤t_thread_info()->restart_block;
+ restart->fn = futex_wait_restart;
+ restart->arg0 = (unsigned long)uaddr;
+ restart->arg1 = (unsigned long)val;
+ restart->arg2 = time;
+ return -ERESTART_RESTARTBLOCK;
+ }
out_unlock_release_sem:
queue_unlock(&q, hb);
@@ -1091,6 +1103,17 @@ static int futex_wait(u32 __user *uaddr,
return ret;
}
+static long futex_wait_restart(struct restart_block *restart)
+{
+ u32 __user *uaddr = (u32 __user *)restart->arg0;
+ u32 val = (u32)restart->arg1;
+ unsigned long time = restart->arg2;
+
+ restart->fn = do_no_restart_syscall;
+ return (long)futex_wait(uaddr, val, time);
+}
+
+
/*
* Userspace tried a 0 -> TID atomic transition of the futex value
* and failed. The kernel side here does the whole locking operation:
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-07 15:33 [rfc][patch] futex: restartable futex_wait? Nick Piggin
@ 2007-03-08 17:29 ` Ingo Molnar
2007-03-08 23:02 ` Thomas Gleixner
2007-03-09 5:10 ` Nick Piggin
0 siblings, 2 replies; 8+ messages in thread
From: Ingo Molnar @ 2007-03-08 17:29 UTC (permalink / raw)
To: Nick Piggin; +Cc: Linux Kernel Mailing List, Thomas Gleixner
* Nick Piggin <npiggin@suse.de> wrote:
> Hi Ingo,
>
> I'm seeing an LTP test fail for ltp test sigaction_16_24. Basically,
> it tests whether the SA_RESTART flag works for the sem_wait operation.
>
> I see sem_wait is implemented with futex_wait, so I wonder whether we
> can make it restartable? Am I going about it the right way? (Seems to
> fix the testcase here).
i think that's quite right. I'm wondering why this never came up before?
But your fix is not complete i think:
> + restart->arg2 = time;
> + return -ERESTART_RESTARTBLOCK;
> + }
'time' here is relative, so the restarted syscall will do a /full/ wait
again.
maybe we should rather convert futex timed-waits to hrtimers? Thomas?
Ingo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-08 17:29 ` Ingo Molnar
@ 2007-03-08 23:02 ` Thomas Gleixner
2007-03-09 5:15 ` Nick Piggin
2007-03-09 5:10 ` Nick Piggin
1 sibling, 1 reply; 8+ messages in thread
From: Thomas Gleixner @ 2007-03-08 23:02 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Nick Piggin, Linux Kernel Mailing List, Ulrich Drepper
On Thu, 2007-03-08 at 18:29 +0100, Ingo Molnar wrote:
> * Nick Piggin <npiggin@suse.de> wrote:
>
> > Hi Ingo,
> >
> > I'm seeing an LTP test fail for ltp test sigaction_16_24. Basically,
> > it tests whether the SA_RESTART flag works for the sem_wait operation.
Not sure, whether the testcase is correct or not. See below
> > I see sem_wait is implemented with futex_wait, so I wonder whether we
> > can make it restartable? Am I going about it the right way? (Seems to
> > fix the testcase here).
>
> i think that's quite right. I'm wondering why this never came up before?
> But your fix is not complete i think:
>
> > + restart->arg2 = time;
> > + return -ERESTART_RESTARTBLOCK;
> > + }
>
> 'time' here is relative, so the restarted syscall will do a /full/ wait
> again.
>
> maybe we should rather convert futex timed-waits to hrtimers? Thomas?
The problem is that the original API is based on relative time and
therefor can not be changed.
sem_wait returns -EINTR to the application when it is interrupted, while
pthread_mutex_lock does not.
http://www.opengroup.org/onlinepubs/009695399/functions/sem_wait.html
http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html
We need to create a seperate op for the futex - just like the pi_futex
and use absolute time there too.
tglx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-08 23:02 ` Thomas Gleixner
@ 2007-03-09 5:15 ` Nick Piggin
0 siblings, 0 replies; 8+ messages in thread
From: Nick Piggin @ 2007-03-09 5:15 UTC (permalink / raw)
To: Thomas Gleixner; +Cc: Ingo Molnar, Linux Kernel Mailing List, Ulrich Drepper
On Fri, Mar 09, 2007 at 12:02:31AM +0100, Thomas Gleixner wrote:
> On Thu, 2007-03-08 at 18:29 +0100, Ingo Molnar wrote:
> > * Nick Piggin <npiggin@suse.de> wrote:
> >
> > > Hi Ingo,
> > >
> > > I'm seeing an LTP test fail for ltp test sigaction_16_24. Basically,
> > > it tests whether the SA_RESTART flag works for the sem_wait operation.
>
> Not sure, whether the testcase is correct or not. See below
>
> > > I see sem_wait is implemented with futex_wait, so I wonder whether we
> > > can make it restartable? Am I going about it the right way? (Seems to
> > > fix the testcase here).
> >
> > i think that's quite right. I'm wondering why this never came up before?
> > But your fix is not complete i think:
> >
> > > + restart->arg2 = time;
> > > + return -ERESTART_RESTARTBLOCK;
> > > + }
> >
> > 'time' here is relative, so the restarted syscall will do a /full/ wait
> > again.
> >
> > maybe we should rather convert futex timed-waits to hrtimers? Thomas?
>
> The problem is that the original API is based on relative time and
> therefor can not be changed.
>
> sem_wait returns -EINTR to the application when it is interrupted, while
> pthread_mutex_lock does not.
But this still means sem_wait should restart if SA_RESTART is set, right?
And pthread_mutex_lock could be implemented to not return -EINTR, even if
futex_wait does, couldn't it? (I guess it probably already is, considering
that futex_wait alsready returns -EINTR).
>
> http://www.opengroup.org/onlinepubs/009695399/functions/sem_wait.html
>
> http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html
>
> We need to create a seperate op for the futex - just like the pi_futex
> and use absolute time there too.
>
> tglx
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-08 17:29 ` Ingo Molnar
2007-03-08 23:02 ` Thomas Gleixner
@ 2007-03-09 5:10 ` Nick Piggin
2007-03-09 9:38 ` Thomas Gleixner
1 sibling, 1 reply; 8+ messages in thread
From: Nick Piggin @ 2007-03-09 5:10 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Linux Kernel Mailing List, Thomas Gleixner
On Thu, Mar 08, 2007 at 06:29:02PM +0100, Ingo Molnar wrote:
>
> * Nick Piggin <npiggin@suse.de> wrote:
>
> > Hi Ingo,
> >
> > I'm seeing an LTP test fail for ltp test sigaction_16_24. Basically,
> > it tests whether the SA_RESTART flag works for the sem_wait operation.
> >
> > I see sem_wait is implemented with futex_wait, so I wonder whether we
> > can make it restartable? Am I going about it the right way? (Seems to
> > fix the testcase here).
>
> i think that's quite right. I'm wondering why this never came up before?
> But your fix is not complete i think:
>
> > + restart->arg2 = time;
> > + return -ERESTART_RESTARTBLOCK;
> > + }
>
> 'time' here is relative, so the restarted syscall will do a /full/ wait
> again.
But it has been modified by schedule_timeout?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-09 5:10 ` Nick Piggin
@ 2007-03-09 9:38 ` Thomas Gleixner
2007-03-09 12:24 ` Nick Piggin
0 siblings, 1 reply; 8+ messages in thread
From: Thomas Gleixner @ 2007-03-09 9:38 UTC (permalink / raw)
To: Nick Piggin; +Cc: Ingo Molnar, Linux Kernel Mailing List
On Fri, 2007-03-09 at 06:10 +0100, Nick Piggin wrote:
> > i think that's quite right. I'm wondering why this never came up before?
> > But your fix is not complete i think:
> >
> > > + restart->arg2 = time;
> > > + return -ERESTART_RESTARTBLOCK;
> > > + }
> >
> > 'time' here is relative, so the restarted syscall will do a /full/ wait
> > again.
>
> But it has been modified by schedule_timeout?
But this does not change the syscall registers, so it is restarted in
the same way. We need a new futex OP for this, which takes absolute time
like the PI futex op does.
tglx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-09 9:38 ` Thomas Gleixner
@ 2007-03-09 12:24 ` Nick Piggin
2007-03-09 13:10 ` Thomas Gleixner
0 siblings, 1 reply; 8+ messages in thread
From: Nick Piggin @ 2007-03-09 12:24 UTC (permalink / raw)
To: Thomas Gleixner; +Cc: Ingo Molnar, Linux Kernel Mailing List
On Fri, Mar 09, 2007 at 10:38:35AM +0100, Thomas Gleixner wrote:
> On Fri, 2007-03-09 at 06:10 +0100, Nick Piggin wrote:
> > > i think that's quite right. I'm wondering why this never came up before?
> > > But your fix is not complete i think:
> > >
> > > > + restart->arg2 = time;
> > > > + return -ERESTART_RESTARTBLOCK;
> > > > + }
> > >
> > > 'time' here is relative, so the restarted syscall will do a /full/ wait
> > > again.
> >
> > But it has been modified by schedule_timeout?
>
> But this does not change the syscall registers, so it is restarted in
> the same way. We need a new futex OP for this, which takes absolute time
> like the PI futex op does.
Forgive me if I'm missing something here, but I'm using the restart block
and saving the updated value of time in ->arg2, and using that as the new
time parameter passed into futex_wait from futex_wait_restart.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][patch] futex: restartable futex_wait?
2007-03-09 12:24 ` Nick Piggin
@ 2007-03-09 13:10 ` Thomas Gleixner
0 siblings, 0 replies; 8+ messages in thread
From: Thomas Gleixner @ 2007-03-09 13:10 UTC (permalink / raw)
To: Nick Piggin; +Cc: Ingo Molnar, Linux Kernel Mailing List
On Fri, 2007-03-09 at 13:24 +0100, Nick Piggin wrote:
> > > > 'time' here is relative, so the restarted syscall will do a /full/ wait
> > > > again.
> > >
> > > But it has been modified by schedule_timeout?
> >
> > But this does not change the syscall registers, so it is restarted in
> > the same way. We need a new futex OP for this, which takes absolute time
> > like the PI futex op does.
>
> Forgive me if I'm missing something here, but I'm using the restart block
> and saving the updated value of time in ->arg2, and using that as the new
> time parameter passed into futex_wait from futex_wait_restart.
Oops. I went into confusion mode. You are right, the restart block keeps
that.
tglx
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2007-03-09 13:11 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-03-07 15:33 [rfc][patch] futex: restartable futex_wait? Nick Piggin
2007-03-08 17:29 ` Ingo Molnar
2007-03-08 23:02 ` Thomas Gleixner
2007-03-09 5:15 ` Nick Piggin
2007-03-09 5:10 ` Nick Piggin
2007-03-09 9:38 ` Thomas Gleixner
2007-03-09 12:24 ` Nick Piggin
2007-03-09 13:10 ` Thomas Gleixner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®