From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH v2 13/24] kvm: Set up signal mask also for !CONFIG_IOTHREAD Date: Mon, 28 Feb 2011 17:49:36 +0100 Message-ID: <4D6BD220.6010606@siemens.com> References: <688de146287dc589a2e0fcce4cdec85d4f2c1127.1296594961.git.jan.kiszka@web.de> <4D6BC55B.9030805@redhat.com> <4D6BCA6A.9060507@siemens.com> <4D6BD144.5050406@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , "kvm@vger.kernel.org" , "qemu-devel@nongnu.org" To: Avi Kivity Return-path: Received: from thoth.sbs.de ([192.35.17.2]:18816 "EHLO thoth.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755518Ab1B1Qtw (ORCPT ); Mon, 28 Feb 2011 11:49:52 -0500 In-Reply-To: <4D6BD144.5050406@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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 >>>> >>>> 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