@@ -2751,23 +2751,18 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
2751
2751
* @ts: upper bound on process time suspension
2752
2752
*/
2753
2753
int do_sigtimedwait (const sigset_t * which , siginfo_t * info ,
2754
- const struct timespec * ts )
2754
+ const struct timespec * ts )
2755
2755
{
2756
+ ktime_t * to = NULL , timeout = { .tv64 = KTIME_MAX };
2756
2757
struct task_struct * tsk = current ;
2757
- long timeout = MAX_SCHEDULE_TIMEOUT ;
2758
2758
sigset_t mask = * which ;
2759
- int sig ;
2759
+ int sig , ret = 0 ;
2760
2760
2761
2761
if (ts ) {
2762
2762
if (!timespec_valid (ts ))
2763
2763
return - EINVAL ;
2764
- timeout = timespec_to_jiffies (ts );
2765
- /*
2766
- * We can be close to the next tick, add another one
2767
- * to ensure we will wait at least the time asked for.
2768
- */
2769
- if (ts -> tv_sec || ts -> tv_nsec )
2770
- timeout ++ ;
2764
+ timeout = timespec_to_ktime (* ts );
2765
+ to = & timeout ;
2771
2766
}
2772
2767
2773
2768
/*
@@ -2778,7 +2773,7 @@ int do_sigtimedwait(const sigset_t *which, siginfo_t *info,
2778
2773
2779
2774
spin_lock_irq (& tsk -> sighand -> siglock );
2780
2775
sig = dequeue_signal (tsk , & mask , info );
2781
- if (!sig && timeout ) {
2776
+ if (!sig && timeout . tv64 ) {
2782
2777
/*
2783
2778
* None ready, temporarily unblock those we're interested
2784
2779
* while we are sleeping in so that we'll be awakened when
@@ -2790,8 +2785,9 @@ int do_sigtimedwait(const sigset_t *which, siginfo_t *info,
2790
2785
recalc_sigpending ();
2791
2786
spin_unlock_irq (& tsk -> sighand -> siglock );
2792
2787
2793
- timeout = freezable_schedule_timeout_interruptible (timeout );
2794
-
2788
+ __set_current_state (TASK_INTERRUPTIBLE );
2789
+ ret = freezable_schedule_hrtimeout_range (to , tsk -> timer_slack_ns ,
2790
+ HRTIMER_MODE_REL );
2795
2791
spin_lock_irq (& tsk -> sighand -> siglock );
2796
2792
__set_task_blocked (tsk , & tsk -> real_blocked );
2797
2793
sigemptyset (& tsk -> real_blocked );
@@ -2801,7 +2797,7 @@ int do_sigtimedwait(const sigset_t *which, siginfo_t *info,
2801
2797
2802
2798
if (sig )
2803
2799
return sig ;
2804
- return timeout ? - EINTR : - EAGAIN ;
2800
+ return ret ? - EINTR : - EAGAIN ;
2805
2801
}
2806
2802
2807
2803
/**
0 commit comments