From: Deepa Dinamani
Sent: 24 May 2019 18:02
...
Look at the code before 854a6ed56839a:
/* * If we changed the signal mask, we need to restore the original one. * In case we've got a signal while waiting, we do not restore the * signal mask yet, and we allow do_signal() to deliver the signal on * the way back to userspace, before the signal mask is restored. */ if (sigmask) { ####### This err has not been changed since ep_poll() ####### So if there is a signal before this point, but err = 0, then we goto else. if (err == -EINTR) { memcpy(¤t->saved_sigmask, &sigsaved, sizeof(sigsaved)); set_restore_sigmask(); } else ############ This is a problem if there is signal pending that is sigmask should block. ########### This is the whole reason we have current->saved_sigmask? set_current_blocked(&sigsaved); }
What happens if all that crap is just deleted (I presume from the bottom of ep_wait()) ?
I'm guessing that on the way back to userspace signal handlers for signals enabled in the process's current mask (the one specified to epoll_pwait) get called. Then the signal mask is loaded from current->saved_sigmask and and enabled signal handlers are called again. No special code there that depends on the syscall result, errno of the syscall number.
That seems exactly correct!
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)