From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH v2 13/24] kvm: Set up signal mask also for !CONFIG_IOTHREAD Date: Mon, 28 Feb 2011 18:45:56 +0200 Message-ID: <4D6BD144.5050406@redhat.com> References: <688de146287dc589a2e0fcce4cdec85d4f2c1127.1296594961.git.jan.kiszka@web.de> <4D6BC55B.9030805@redhat.com> <4D6BCA6A.9060507@siemens.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org, qemu-devel@nongnu.org To: Jan Kiszka Return-path: Received: from mx1.redhat.com ([209.132.183.28]:27540 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755508Ab1B1QqD (ORCPT ); Mon, 28 Feb 2011 11:46:03 -0500 In-Reply-To: <4D6BCA6A.9060507@siemens.com> Sender: kvm-owner@vger.kernel.org List-ID: 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. -- error compiling committee.c: too many arguments to function