Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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.

No functional change intended.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20230921105248.396780136@noisy.programming.kicks-ass.net

+13 -10
+3 -2
kernel/futex/futex.h
··· 328 328 val, ktime_t *abs_time, u32 bitset, u32 __user 329 329 *uaddr2); 330 330 331 - extern int futex_requeue(u32 __user *uaddr1, unsigned int flags, 332 - u32 __user *uaddr2, int nr_wake, int nr_requeue, 331 + extern int futex_requeue(u32 __user *uaddr1, unsigned int flags1, 332 + u32 __user *uaddr2, unsigned int flags2, 333 + int nr_wake, int nr_requeue, 333 334 u32 *cmpval, int requeue_pi); 334 335 335 336 extern int __futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
+7 -5
kernel/futex/requeue.c
··· 346 346 /** 347 347 * futex_requeue() - Requeue waiters from uaddr1 to uaddr2 348 348 * @uaddr1: source futex user address 349 - * @flags: futex flags (FLAGS_SHARED, etc.) 349 + * @flags1: futex flags (FLAGS_SHARED, etc.) 350 350 * @uaddr2: target futex user address 351 + * @flags2: futex flags (FLAGS_SHARED, etc.) 351 352 * @nr_wake: number of waiters to wake (must be 1 for requeue_pi) 352 353 * @nr_requeue: number of waiters to requeue (0-INT_MAX) 353 354 * @cmpval: @uaddr1 expected value (or %NULL) ··· 362 361 * - >=0 - on success, the number of tasks requeued or woken; 363 362 * - <0 - on error 364 363 */ 365 - int futex_requeue(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2, 364 + int futex_requeue(u32 __user *uaddr1, unsigned int flags1, 365 + u32 __user *uaddr2, unsigned int flags2, 366 366 int nr_wake, int nr_requeue, u32 *cmpval, int requeue_pi) 367 367 { 368 368 union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT; ··· 426 424 } 427 425 428 426 retry: 429 - ret = get_futex_key(uaddr1, flags, &key1, FUTEX_READ); 427 + ret = get_futex_key(uaddr1, flags1, &key1, FUTEX_READ); 430 428 if (unlikely(ret != 0)) 431 429 return ret; 432 - ret = get_futex_key(uaddr2, flags, &key2, 430 + ret = get_futex_key(uaddr2, flags2, &key2, 433 431 requeue_pi ? FUTEX_WRITE : FUTEX_READ); 434 432 if (unlikely(ret != 0)) 435 433 return ret; ··· 461 459 if (ret) 462 460 return ret; 463 461 464 - if (!(flags & FLAGS_SHARED)) 462 + if (!(flags1 & FLAGS_SHARED)) 465 463 goto retry_private; 466 464 467 465 goto retry;
+3 -3
kernel/futex/syscalls.c
··· 106 106 case FUTEX_WAKE_BITSET: 107 107 return futex_wake(uaddr, flags, val, val3); 108 108 case FUTEX_REQUEUE: 109 - return futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0); 109 + return futex_requeue(uaddr, flags, uaddr2, flags, val, val2, NULL, 0); 110 110 case FUTEX_CMP_REQUEUE: 111 - return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0); 111 + return futex_requeue(uaddr, flags, uaddr2, flags, val, val2, &val3, 0); 112 112 case FUTEX_WAKE_OP: 113 113 return futex_wake_op(uaddr, flags, uaddr2, val, val2, val3); 114 114 case FUTEX_LOCK_PI: ··· 125 125 return futex_wait_requeue_pi(uaddr, flags, val, timeout, val3, 126 126 uaddr2); 127 127 case FUTEX_CMP_REQUEUE_PI: 128 - return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1); 128 + return futex_requeue(uaddr, flags, uaddr2, flags, val, val2, &val3, 1); 129 129 } 130 130 return -ENOSYS; 131 131 }