diff options
| author | David S. Miller <davem@davemloft.net> | 2021-02-10 13:30:12 -0800 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2021-02-10 13:30:12 -0800 |
| commit | dc9d87581d464e7b7d38853d6904b70b6c920d99 (patch) | |
| tree | 15aa27fefb867814899c0a0c194adf327675ba10 /arch/um/os-Linux/time.c | |
| parent | de1db4a6ed6241e34cab0e5059d4b56f6bae39b9 (diff) | |
| parent | 291009f656e8eaebbdfd3a8d99f6b190a9ce9deb (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Diffstat (limited to 'arch/um/os-Linux/time.c')
| -rw-r--r-- | arch/um/os-Linux/time.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index a61cbf73a179..6c5041c5560b 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c @@ -104,5 +104,18 @@ long long os_nsecs(void) */ void os_idle_sleep(void) { - pause(); + struct itimerspec its; + sigset_t set, old; + + /* block SIGALRM while we analyze the timer state */ + sigemptyset(&set); + sigaddset(&set, SIGALRM); + sigprocmask(SIG_BLOCK, &set, &old); + + /* check the timer, and if it'll fire then wait for it */ + timer_gettime(event_high_res_timer, &its); + if (its.it_value.tv_sec || its.it_value.tv_nsec) + sigsuspend(&old); + /* either way, restore the signal mask */ + sigprocmask(SIG_UNBLOCK, &set, NULL); } |
