qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [PATCH v2 13/24] kvm: Set up signal mask also for !CONF


From: Jan Kiszka
Subject: [Qemu-devel] Re: [PATCH v2 13/24] kvm: Set up signal mask also for !CONFIG_IOTHREAD
Date: Mon, 28 Feb 2011 17:49:36 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666

On 2011-02-28 17:45, Avi Kivity wrote:
> On 02/28/2011 06:16 PM, Jan Kiszka wrote:
>> On 2011-02-28 16:55, Avi Kivity wrote:
>>>  On 02/01/2011 11:15 PM, Jan Kiszka wrote:
>>>>  From: Jan Kiszka<address@hidden>
>>>>
>>>>  Block SIG_IPI, unblock it during KVM_RUN, just like in io-thread mode.
>>>>  It's unused so far, but this infrastructure will be required for
>>>>  self-IPIs and to process SIGBUS plus, in KVM mode, SIGIO and SIGALRM. As
>>>>  Windows doesn't support signal services, we need to provide a stub for
>>>>  the init function.
>>>>
>>>
>>>  This patch breaks qemu-kvm after merging.  The symptoms are that Windows
>>>  XP x64 does not respond when netcat connects to some server in it, via
>>>  -net user,hostfwd.  The vcpu thread loops indefinitely on KVM_EXIT_INTR,
>>>  which is consistent with signals being messed up.
>>>
>>>  I verified that 981085dd465c1 merged with ff48eb5fe79ad works,
>>>  while 981085dd465c1 merged with ff48eb5fe79ad^ fails.
>>>
>>>
>>>>  diff --git a/cpus.c b/cpus.c
>>>>  index 42717ba..a33e470 100644
>>>>  --- a/cpus.c
>>>>  +++ b/cpus.c
>>>>  @@ -231,11 +231,9 @@ fail:
>>>>        return err;
>>>>    }
>>>>
>>>>  -#ifdef CONFIG_IOTHREAD
>>>>    static void dummy_signal(int sig)
>>>>    {
>>>>    }
>>>>  -#endif
>>>>
>>>>    #else /* _WIN32 */
>>>>
>>>>  @@ -267,6 +265,32 @@ static void qemu_event_increment(void)
>>>>    #endif /* _WIN32 */
>>>>
>>>>    #ifndef CONFIG_IOTHREAD
>>>>  +static void qemu_kvm_init_cpu_signals(CPUState *env)
>>>>  +{
>>>>  +#ifndef _WIN32
>>>>  +    int r;
>>>>  +    sigset_t set;
>>>>  +    struct sigaction sigact;
>>>>  +
>>>>  +    memset(&sigact, 0, sizeof(sigact));
>>>>  +    sigact.sa_handler = dummy_signal;
>>>>  +    sigaction(SIG_IPI,&sigact, NULL);
>>>>  +
>>>>  +    sigemptyset(&set);
>>>>  +    sigaddset(&set, SIG_IPI);
>>>>  +    pthread_sigmask(SIG_BLOCK,&set, NULL);
>>>>  +
>>>>  +    pthread_sigmask(SIG_BLOCK, NULL,&set);
>>>>  +    sigdelset(&set, SIG_IPI);
>>>>  +    sigdelset(&set, SIGBUS);
>>>>  +    r = kvm_set_signal_mask(env,&set);
>>>>  +    if (r) {
>>>>  +        fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
>>>>  +        exit(1);
>>>>  +    }
>>>>  +#endif
>>>>  +}
>>>>  +
>>>>    int qemu_init_main_loop(void)
>>>>    {
>>>>        cpu_set_debug_excp_handler(cpu_debug_handler);
>>>>  @@ -292,6 +316,7 @@ void qemu_init_vcpu(void *_env)
>>>>                fprintf(stderr, "kvm_init_vcpu failed: %s\n",
>>>>  strerror(-r));
>>>>                exit(1);
>>>>            }
>>>>  +        qemu_kvm_init_cpu_signals(env);
>>
>> Just comment that out as long as qemu-kvm is (mis-)using !IOTHREAD mode.
>> I thought it would run before setup_kernel_sigmask, but it's the other
>> way around, and then the wrong non-iothread signal setup is applied.
> 
> That's what I tried, and it didn't work?!  Maybe I forgot to compile or 
> something.

Well, it maybe failed to build as qemu_kvm_init_cpu_signals became
unused and the compiler should have bailed out? Probably it's better to
disable it directly in the function.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux



reply via email to

[Prev in Thread] Current Thread [Next in Thread]