On 8 Jun 2023, at 21:16, Ilya Maximets wrote:

> The signal_fds pipe and wevent are a mechanism to wake up the process
> after it received a signal and stored the number for the future
> processing.  They are not intended for inter-process communication.
> However, in the current code, descriptors are not closed on fork().
>
> The main scenario where we use fork() is a monitor process.  Monitor
> doesn't actually use poll loops and doesn't wait on the descriptor.
> But when a child process is killed, it (child) sends a byte to itself,
> then it wakes up due to POLLIN on the pipe and terminates itself after
> processing all the callbacks.  The byte stays unread.  And the pipe is
> still open in the monitor process.  When child dies, the monitor wakes
> up and forks again.  New child inherits the same pipe that still
> contains unread data.  This data is never read, so the child will
> constantly wake itself up for no reason.
>
> Interestingly enough raise(SIGSEGV) doesn't immediately kill the
> process.  The execution continues til the end of a signal handler,
> so we're still able to write a byte to a pipe even in this case.
> Presumably because we don't have SA_NODEFER.
>
> Fix the issue by re-creating the pipe/event on fork.  This way
> every new child will have its own notification channel and will
> not wake up any other processes.
>
> There was already an attempt to fix the issue, but it didn't get a
> follow up (see the reported-at tag).  This is an alternative solution.
>
> Fixes: ff8decf1a318 ("daemon: Add support for process monitoring and 
> restart.")
> Reported-at: 
> https://patchwork.ozlabs.org/project/openvswitch/patch/[email protected]/
> Signed-off-by: Ilya Maximets <[email protected]>


The changes look good to me.

Only tested on linux, and looking up the APIs on Windows, that part seems fine.

Acked-by: Eelco Chaudron <[email protected]>


_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to