On 2011-02-28 16:55, Avi Kivity wrote: > On 02/01/2011 11:15 PM, Jan Kiszka wrote: >> From: Jan Kiszka<jan.kiszka@xxxxxxxxxxx> >> >> 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 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html