From: Prakash Sangappa Subject: ipc: update semtimedop() to use hrtimer semtimedop() should be converted to use hrtimer like it has been done for most of the system calls with timeouts. This system call already takes a struct timespec as an argument and can therefore provide finer granularity timed wait. Link: https://lkml.kernel.org/r/1650333099-27214-1-git-send-email-prakash.sangappa@oracle.com Signed-off-by: Prakash Sangappa Cc: Davidlohr Bueso Cc: Manfred Spraul Signed-off-by: Andrew Morton --- ipc/sem.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) --- a/ipc/sem.c~ipc-update-semtimedop-to-use-hrtimer +++ a/ipc/sem.c @@ -1993,7 +1993,10 @@ long __do_semtimedop(int semid, struct s int max, locknum; bool undos = false, alter = false, dupsop = false; struct sem_queue queue; - unsigned long dup = 0, jiffies_left = 0; + unsigned long dup = 0; + ktime_t expires; + int timed_out = 0; + struct timespec64 end_time; if (nsops < 1 || semid < 0) return -EINVAL; @@ -2006,7 +2009,9 @@ long __do_semtimedop(int semid, struct s error = -EINVAL; goto out; } - jiffies_left = timespec64_to_jiffies(timeout); + ktime_get_ts64(&end_time); + end_time = timespec64_add_safe(end_time, *timeout); + expires = timespec64_to_ktime(end_time); } @@ -2165,7 +2170,9 @@ long __do_semtimedop(int semid, struct s rcu_read_unlock(); if (timeout) - jiffies_left = schedule_timeout(jiffies_left); + timed_out = !schedule_hrtimeout_range(&expires, + current->timer_slack_ns, + HRTIMER_MODE_ABS); else schedule(); @@ -2208,7 +2215,7 @@ long __do_semtimedop(int semid, struct s /* * If an interrupt occurred we have to clean up the queue. */ - if (timeout && jiffies_left == 0) + if (timeout && timed_out) error = -EAGAIN; } while (error == -EINTR && !signal_pending(current)); /* spurious */ _