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<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. > > 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 -- 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