lkml.org 
[lkml]   [2023]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v1 08/14] futex: Add flags2 argument to futex_requeue()
    In order to support mixed size requeue, add a second flags argument to
    the internal futex_requeue() function.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    kernel/futex/futex.h | 5 +++--
    kernel/futex/requeue.c | 12 +++++++-----
    kernel/futex/syscalls.c | 6 +++---
    3 files changed, 13 insertions(+), 10 deletions(-)

    --- a/kernel/futex/futex.h
    +++ b/kernel/futex/futex.h
    @@ -318,8 +318,9 @@ extern int futex_wait_requeue_pi(u32 __u
    val, ktime_t *abs_time, u32 bitset, u32 __user
    *uaddr2);

    -extern int futex_requeue(u32 __user *uaddr1, unsigned int flags,
    - u32 __user *uaddr2, int nr_wake, int nr_requeue,
    +extern int futex_requeue(u32 __user *uaddr1, unsigned int flags1,
    + u32 __user *uaddr2, unsigned int flags2,
    + int nr_wake, int nr_requeue,
    u32 *cmpval, int requeue_pi);

    extern int __futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
    --- a/kernel/futex/requeue.c
    +++ b/kernel/futex/requeue.c
    @@ -346,8 +346,9 @@ futex_proxy_trylock_atomic(u32 __user *p
    /**
    * futex_requeue() - Requeue waiters from uaddr1 to uaddr2
    * @uaddr1: source futex user address
    - * @flags: futex flags (FLAGS_SHARED, etc.)
    + * @flags1: futex flags (FLAGS_SHARED, etc.)
    * @uaddr2: target futex user address
    + * @flags2: futex flags (FLAGS_SHARED, etc.)
    * @nr_wake: number of waiters to wake (must be 1 for requeue_pi)
    * @nr_requeue: number of waiters to requeue (0-INT_MAX)
    * @cmpval: @uaddr1 expected value (or %NULL)
    @@ -361,7 +362,8 @@ futex_proxy_trylock_atomic(u32 __user *p
    * - >=0 - on success, the number of tasks requeued or woken;
    * - <0 - on error
    */
    -int futex_requeue(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2,
    +int futex_requeue(u32 __user *uaddr1, unsigned int flags1,
    + u32 __user *uaddr2, unsigned int flags2,
    int nr_wake, int nr_requeue, u32 *cmpval, int requeue_pi)
    {
    union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT;
    @@ -424,10 +426,10 @@ int futex_requeue(u32 __user *uaddr1, un
    }

    retry:
    - ret = get_futex_key(uaddr1, flags, &key1, FUTEX_READ);
    + ret = get_futex_key(uaddr1, flags1, &key1, FUTEX_READ);
    if (unlikely(ret != 0))
    return ret;
    - ret = get_futex_key(uaddr2, flags, &key2,
    + ret = get_futex_key(uaddr2, flags2, &key2,
    requeue_pi ? FUTEX_WRITE : FUTEX_READ);
    if (unlikely(ret != 0))
    return ret;
    @@ -459,7 +461,7 @@ int futex_requeue(u32 __user *uaddr1, un
    if (ret)
    return ret;

    - if (!(flags & FLAGS_SHARED))
    + if (!(flags1 & FLAGS_SHARED))
    goto retry_private;

    goto retry;
    --- a/kernel/futex/syscalls.c
    +++ b/kernel/futex/syscalls.c
    @@ -106,9 +106,9 @@ long do_futex(u32 __user *uaddr, int op,
    case FUTEX_WAKE_BITSET:
    return futex_wake(uaddr, flags, val, val3);
    case FUTEX_REQUEUE:
    - return futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0);
    + return futex_requeue(uaddr, flags, uaddr2, flags, val, val2, NULL, 0);
    case FUTEX_CMP_REQUEUE:
    - return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0);
    + return futex_requeue(uaddr, flags, uaddr2, flags, val, val2, &val3, 0);
    case FUTEX_WAKE_OP:
    return futex_wake_op(uaddr, flags, uaddr2, val, val2, val3);
    case FUTEX_LOCK_PI:
    @@ -125,7 +125,7 @@ long do_futex(u32 __user *uaddr, int op,
    return futex_wait_requeue_pi(uaddr, flags, val, timeout, val3,
    uaddr2);
    case FUTEX_CMP_REQUEUE_PI:
    - return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1);
    + return futex_requeue(uaddr, flags, uaddr2, flags, val, val2, &val3, 1);
    }
    return -ENOSYS;
    }

    \
     
     \ /
      Last update: 2023-07-21 13:01    [W:4.022 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site