lkml.org 
[lkml]   [2011]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH V5] futex: set FLAGS_HAS_TIMEOUT during futex_wait restart setup
    On Thu, 14 Apr 2011, Darren Hart wrote:

    > The FLAGS_HAS_TIMEOUT flag was not getting set, causing the restart_block to
    > restart futex_wait() without a timeout after a signal.
    >
    > Commit b41277dc7a18ee332d in 2.6.38 introduced the regression by accidentally
    > removing the the FLAGS_HAS_TIMEOUT assignment from futex_wait() during the setup
    > of the restart block. Restore the originaly behavior.
    >
    > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=32922
    >
    > V2: Added references to commit message.
    > V3: Set flag during restart block instead of do_futex()
    > V4: Correct stupid order of assignment mistake pointed out by Eric
    > V5: Correct subject to match implementation, correct stable submission
    >
    > Signed-off-by: Darren Hart <dvhart@linux.intel.com>
    > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
    > Reported-by: Tim Smith <tsmith201104@yahoo.com>
    > Reported-by: Torsten Hilbrich <torsten.hilbrich@secunet.com>
    > Cc: Thomas Gleixner <tglx@linutronix.de>
    > Cc: Peter Zijlstra <peterz@infradead.org>
    > Cc: Ingo Molnar <mingo@elte.hu>
    > Cc: John Kacur <jkacur@redhat.com>
    > Cc: stable@kernel.org
    > ---
    > kernel/futex.c | 2 +-
    > 1 files changed, 1 insertions(+), 1 deletions(-)
    >
    > diff --git a/kernel/futex.c b/kernel/futex.c
    > index bda4157..abd5324 100644
    > --- a/kernel/futex.c
    > +++ b/kernel/futex.c
    > @@ -1886,7 +1886,7 @@ retry:
    > restart->futex.val = val;
    > restart->futex.time = abs_time->tv64;
    > restart->futex.bitset = bitset;
    > - restart->futex.flags = flags;
    > + restart->futex.flags = flags | FLAGS_HAS_TIMEOUT;

    We only get here when a timeout is pending. So why don't we just do
    the obvious:

    --- linux-2.6.orig/kernel/futex.c
    +++ linux-2.6/kernel/futex.c
    @@ -1902,16 +1902,13 @@ out:
    static long futex_wait_restart(struct restart_block *restart)
    {
    u32 __user *uaddr = restart->futex.uaddr;
    - ktime_t t, *tp = NULL;
    + ktime_t t;

    - if (restart->futex.flags & FLAGS_HAS_TIMEOUT) {
    - t.tv64 = restart->futex.time;
    - tp = &t;
    - }
    + t.tv64 = restart->futex.time;
    restart->fn = do_no_restart_syscall;

    return (long)futex_wait(uaddr, restart->futex.flags,
    - restart->futex.val, tp, restart->futex.bitset);
    + restart->futex.val, &t, restart->futex.bitset);
    }

    Thanks,

    tglx

    \
     
     \ /
      Last update: 2011-04-15 10:35    [W:0.029 / U:119.384 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site