futex: Consolidate duplicated timer setup code
Add a new futex_setup_timer() helper function to consolidate all the hrtimer_sleeper setup code. Signed-off-by: Waiman Long <longman@redhat.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Darren Hart <dvhart@infradead.org> Cc: Davidlohr Bueso <dave@stgolabs.net> Link: https://lkml.kernel.org/r/20190528160345.24017-1-longman@redhat.com
This commit is contained in:
parent
c0090c4c85
commit
5ca584d935
|
@ -483,6 +483,37 @@ enum futex_access {
|
||||||
FUTEX_WRITE
|
FUTEX_WRITE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* futex_setup_timer - set up the sleeping hrtimer.
|
||||||
|
* @time: ptr to the given timeout value
|
||||||
|
* @timeout: the hrtimer_sleeper structure to be set up
|
||||||
|
* @flags: futex flags
|
||||||
|
* @range_ns: optional range in ns
|
||||||
|
*
|
||||||
|
* Return: Initialized hrtimer_sleeper structure or NULL if no timeout
|
||||||
|
* value given
|
||||||
|
*/
|
||||||
|
static inline struct hrtimer_sleeper *
|
||||||
|
futex_setup_timer(ktime_t *time, struct hrtimer_sleeper *timeout,
|
||||||
|
int flags, u64 range_ns)
|
||||||
|
{
|
||||||
|
if (!time)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hrtimer_init_on_stack(&timeout->timer, (flags & FLAGS_CLOCKRT) ?
|
||||||
|
CLOCK_REALTIME : CLOCK_MONOTONIC,
|
||||||
|
HRTIMER_MODE_ABS);
|
||||||
|
hrtimer_init_sleeper(timeout, current);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If range_ns is 0, calling hrtimer_set_expires_range_ns() is
|
||||||
|
* effectively the same as calling hrtimer_set_expires().
|
||||||
|
*/
|
||||||
|
hrtimer_set_expires_range_ns(&timeout->timer, *time, range_ns);
|
||||||
|
|
||||||
|
return timeout;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_futex_key() - Get parameters which are the keys for a futex
|
* get_futex_key() - Get parameters which are the keys for a futex
|
||||||
* @uaddr: virtual address of the futex
|
* @uaddr: virtual address of the futex
|
||||||
|
@ -2692,7 +2723,7 @@ out:
|
||||||
static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
|
static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
|
||||||
ktime_t *abs_time, u32 bitset)
|
ktime_t *abs_time, u32 bitset)
|
||||||
{
|
{
|
||||||
struct hrtimer_sleeper timeout, *to = NULL;
|
struct hrtimer_sleeper timeout, *to;
|
||||||
struct restart_block *restart;
|
struct restart_block *restart;
|
||||||
struct futex_hash_bucket *hb;
|
struct futex_hash_bucket *hb;
|
||||||
struct futex_q q = futex_q_init;
|
struct futex_q q = futex_q_init;
|
||||||
|
@ -2702,17 +2733,8 @@ static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
q.bitset = bitset;
|
q.bitset = bitset;
|
||||||
|
|
||||||
if (abs_time) {
|
to = futex_setup_timer(abs_time, &timeout, flags,
|
||||||
to = &timeout;
|
current->timer_slack_ns);
|
||||||
|
|
||||||
hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ?
|
|
||||||
CLOCK_REALTIME : CLOCK_MONOTONIC,
|
|
||||||
HRTIMER_MODE_ABS);
|
|
||||||
hrtimer_init_sleeper(to, current);
|
|
||||||
hrtimer_set_expires_range_ns(&to->timer, *abs_time,
|
|
||||||
current->timer_slack_ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
/*
|
/*
|
||||||
* Prepare to wait on uaddr. On success, holds hb lock and increments
|
* Prepare to wait on uaddr. On success, holds hb lock and increments
|
||||||
|
@ -2792,7 +2814,7 @@ static long futex_wait_restart(struct restart_block *restart)
|
||||||
static int futex_lock_pi(u32 __user *uaddr, unsigned int flags,
|
static int futex_lock_pi(u32 __user *uaddr, unsigned int flags,
|
||||||
ktime_t *time, int trylock)
|
ktime_t *time, int trylock)
|
||||||
{
|
{
|
||||||
struct hrtimer_sleeper timeout, *to = NULL;
|
struct hrtimer_sleeper timeout, *to;
|
||||||
struct futex_pi_state *pi_state = NULL;
|
struct futex_pi_state *pi_state = NULL;
|
||||||
struct rt_mutex_waiter rt_waiter;
|
struct rt_mutex_waiter rt_waiter;
|
||||||
struct futex_hash_bucket *hb;
|
struct futex_hash_bucket *hb;
|
||||||
|
@ -2805,13 +2827,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags,
|
||||||
if (refill_pi_state_cache())
|
if (refill_pi_state_cache())
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (time) {
|
to = futex_setup_timer(time, &timeout, FLAGS_CLOCKRT, 0);
|
||||||
to = &timeout;
|
|
||||||
hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME,
|
|
||||||
HRTIMER_MODE_ABS);
|
|
||||||
hrtimer_init_sleeper(to, current);
|
|
||||||
hrtimer_set_expires(&to->timer, *time);
|
|
||||||
}
|
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, FUTEX_WRITE);
|
ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, FUTEX_WRITE);
|
||||||
|
@ -3208,7 +3224,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
|
||||||
u32 val, ktime_t *abs_time, u32 bitset,
|
u32 val, ktime_t *abs_time, u32 bitset,
|
||||||
u32 __user *uaddr2)
|
u32 __user *uaddr2)
|
||||||
{
|
{
|
||||||
struct hrtimer_sleeper timeout, *to = NULL;
|
struct hrtimer_sleeper timeout, *to;
|
||||||
struct futex_pi_state *pi_state = NULL;
|
struct futex_pi_state *pi_state = NULL;
|
||||||
struct rt_mutex_waiter rt_waiter;
|
struct rt_mutex_waiter rt_waiter;
|
||||||
struct futex_hash_bucket *hb;
|
struct futex_hash_bucket *hb;
|
||||||
|
@ -3225,15 +3241,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
|
||||||
if (!bitset)
|
if (!bitset)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (abs_time) {
|
to = futex_setup_timer(abs_time, &timeout, flags,
|
||||||
to = &timeout;
|
current->timer_slack_ns);
|
||||||
hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ?
|
|
||||||
CLOCK_REALTIME : CLOCK_MONOTONIC,
|
|
||||||
HRTIMER_MODE_ABS);
|
|
||||||
hrtimer_init_sleeper(to, current);
|
|
||||||
hrtimer_set_expires_range_ns(&to->timer, *abs_time,
|
|
||||||
current->timer_slack_ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The waiter is allocated on our stack, manipulated by the requeue
|
* The waiter is allocated on our stack, manipulated by the requeue
|
||||||
|
|
Loading…
Reference in New Issue