On 04/29, Joel Fernandes wrote:
However, in your code above, it is avoided because we get:
Task A (poller) Task B (exiting task being polled)
poll() called add_wait_queue() exit_state is set to non-zero read exit_state remove_wait_queue() wake_up_all()
just to clarify... No, sys_poll() path doesn't do remove_wait_queue() until it returns to user mode, and that is why we can't race with set-exit_code + wake_up().
pidfd_poll() can race with the exiting task, miss exit_code != 0, and return zero. However, do_poll() won't block after that and pidfd_poll() will be called again.
Oleg.