diff options
Diffstat (limited to 'kernel/time/hrtimer.c')
| -rw-r--r-- | kernel/time/hrtimer.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 3ae661ab6260..e8c08292defc 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -2089,7 +2089,7 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode,  	u64 slack;  	slack = current->timer_slack_ns; -	if (dl_task(current) || rt_task(current)) +	if (rt_task(current))  		slack = 0;  	hrtimer_init_sleeper_on_stack(&t, clockid, mode); @@ -2126,6 +2126,7 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,  	if (!timespec64_valid(&tu))  		return -EINVAL; +	current->restart_block.fn = do_no_restart_syscall;  	current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE;  	current->restart_block.nanosleep.rmtp = rmtp;  	return hrtimer_nanosleep(timespec64_to_ktime(tu), HRTIMER_MODE_REL, @@ -2147,6 +2148,7 @@ SYSCALL_DEFINE2(nanosleep_time32, struct old_timespec32 __user *, rqtp,  	if (!timespec64_valid(&tu))  		return -EINVAL; +	current->restart_block.fn = do_no_restart_syscall;  	current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE;  	current->restart_block.nanosleep.compat_rmtp = rmtp;  	return hrtimer_nanosleep(timespec64_to_ktime(tu), HRTIMER_MODE_REL, @@ -2270,7 +2272,7 @@ void __init hrtimers_init(void)  /**   * schedule_hrtimeout_range_clock - sleep until timeout   * @expires:	timeout value (ktime_t) - * @delta:	slack in expires timeout (ktime_t) + * @delta:	slack in expires timeout (ktime_t) for SCHED_OTHER tasks   * @mode:	timer mode   * @clock_id:	timer clock to be used   */ @@ -2297,6 +2299,13 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,  		return -EINTR;  	} +	/* +	 * Override any slack passed by the user if under +	 * rt contraints. +	 */ +	if (rt_task(current)) +		delta = 0; +  	hrtimer_init_sleeper_on_stack(&t, clock_id, mode);  	hrtimer_set_expires_range_ns(&t.timer, *expires, delta);  	hrtimer_sleeper_start_expires(&t, mode); @@ -2316,7 +2325,7 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock);  /**   * schedule_hrtimeout_range - sleep until timeout   * @expires:	timeout value (ktime_t) - * @delta:	slack in expires timeout (ktime_t) + * @delta:	slack in expires timeout (ktime_t) for SCHED_OTHER tasks   * @mode:	timer mode   *   * Make the current task sleep until the given expiry time has @@ -2324,7 +2333,8 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock);   * the current task state has been set (see set_current_state()).   *   * The @delta argument gives the kernel the freedom to schedule the - * actual wakeup to a time that is both power and performance friendly. + * actual wakeup to a time that is both power and performance friendly + * for regular (non RT/DL) tasks.   * The kernel give the normal best effort behavior for "@expires+@delta",   * but may decide to fire the timer earlier, but no earlier than @expires.   *  | 
