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:16:42 +0100 Message-ID: <4D6BCA6A.9060507@siemens.com> References: <688de146287dc589a2e0fcce4cdec85d4f2c1127.1296594961.git.jan.kiszka@web.de> <4D6BC55B.9030805@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]:27146 "EHLO thoth.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754877Ab1B1QQ5 (ORCPT ); Mon, 28 Feb 2011 11:16:57 -0500 In-Reply-To: <4D6BC55B.9030805@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux