Patchwork Fix signal handling when io-thread is disabled

login
register
mail settings
Submitter Alexandre Raymond
Date June 14, 2011, 3:46 a.m.
Message ID <1308023191-7157-1-git-send-email-cerbere@gmail.com>
Download mbox | patch
Permalink /patch/100279/
State New
Headers show

Comments

Alexandre Raymond - June 14, 2011, 3:46 a.m.
This fix effectively blocks, in the main thread, the signals handled
by signalfd or the compatibility signal thread.

This way, such signals are received synchronously in the main thread
through sigfd_handler() instead of triggering the signal handler
directly, asynchronously.

Signed-off-by: Alexandre Raymond <cerbere@gmail.com>
---
 cpus.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
Jan Kiszka - June 14, 2011, 6:05 a.m.
On 2011-06-14 05:46, Alexandre Raymond wrote:
> This fix effectively blocks, in the main thread, the signals handled
> by signalfd or the compatibility signal thread.
> 
> This way, such signals are received synchronously in the main thread
> through sigfd_handler() instead of triggering the signal handler
> directly, asynchronously.
> 
> Signed-off-by: Alexandre Raymond <cerbere@gmail.com>
> ---
>  cpus.c |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
> 
> diff --git a/cpus.c b/cpus.c
> index 4ab76f0..b6366b5 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -411,6 +411,7 @@ static int qemu_signal_init(void)
>          sigaddset(&set, SIGIO);
>          sigaddset(&set, SIGALRM);
>      }
> +    pthread_sigmask(SIG_BLOCK, &set, NULL);
>  #endif
>  
>      sigfd = qemu_signalfd(&set);

Good catch. Probably remained unnoticed as most of us have signalfd
support on their boxes so that the window for async delivery was rather
small.

But please pull the now common pthread_sigmask out of the #ifdef.

Jan
Alexandre Raymond - June 14, 2011, 2:10 p.m.
Hi Jan,

Thanks for reviewing my patch.

> But please pull the now common pthread_sigmask out of the #ifdef.
Please see v2.

Alexandre

Patch

diff --git a/cpus.c b/cpus.c
index 4ab76f0..b6366b5 100644
--- a/cpus.c
+++ b/cpus.c
@@ -411,6 +411,7 @@  static int qemu_signal_init(void)
         sigaddset(&set, SIGIO);
         sigaddset(&set, SIGALRM);
     }
+    pthread_sigmask(SIG_BLOCK, &set, NULL);
 #endif
 
     sigfd = qemu_signalfd(&set);