All preparations have been done - now poll() can set u64 timeout in restart_block. It allows to do the next step - unifying all timeouts in restart_block and provide ptrace() API to read it.
Signed-off-by: Dmitry Safonov <d...@arista.com> --- fs/select.c | 27 +++++++-------------------- include/linux/restart_block.h | 4 +--- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/fs/select.c b/fs/select.c index 4af88feaa2fe..ff2b9c4865cd 100644 --- a/fs/select.c +++ b/fs/select.c @@ -1001,14 +1001,9 @@ static long do_restart_poll(struct restart_block *restart_block) { struct pollfd __user *ufds = restart_block->poll.ufds; int nfds = restart_block->poll.nfds; - ktime_t timeout = 0; + ktime_t timeout = restart_block->poll.timeout; int ret; - if (restart_block->poll.has_timeout) { - timeout = ktime_set(restart_block->poll.tv_sec, - restart_block->poll.tv_nsec); - } - ret = do_sys_poll(ufds, nfds, timeout); if (ret == -ERESTARTNOHAND) { @@ -1021,14 +1016,12 @@ static long do_restart_poll(struct restart_block *restart_block) SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout_msecs) { - struct timespec64 end_time; ktime_t timeout = 0; int ret; if (timeout_msecs >= 0) { - poll_select_set_timeout(&end_time, timeout_msecs / MSEC_PER_SEC, - NSEC_PER_MSEC * (timeout_msecs % MSEC_PER_SEC)); - timeout = timespec64_to_ktime(end_time); + timeout = ktime_add_ms(0, timeout_msecs); + timeout = ktime_add_safe(ktime_get(), timeout); } ret = do_sys_poll(ufds, nfds, timeout); @@ -1037,16 +1030,10 @@ SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds, struct restart_block *restart_block; restart_block = ¤t->restart_block; - restart_block->fn = do_restart_poll; - restart_block->poll.ufds = ufds; - restart_block->poll.nfds = nfds; - - if (timeout_msecs >= 0) { - restart_block->poll.tv_sec = end_time.tv_sec; - restart_block->poll.tv_nsec = end_time.tv_nsec; - restart_block->poll.has_timeout = 1; - } else - restart_block->poll.has_timeout = 0; + restart_block->fn = do_restart_poll; + restart_block->poll.ufds = ufds; + restart_block->poll.nfds = nfds; + restart_block->poll.timeout = timeout; ret = -ERESTART_RESTARTBLOCK; } diff --git a/include/linux/restart_block.h b/include/linux/restart_block.h index e66e982105f4..63d647b65395 100644 --- a/include/linux/restart_block.h +++ b/include/linux/restart_block.h @@ -49,11 +49,9 @@ struct restart_block { } nanosleep; /* For poll */ struct { + u64 timeout; struct pollfd __user *ufds; int nfds; - int has_timeout; - unsigned long tv_sec; - unsigned long tv_nsec; } poll; }; }; -- 2.23.0