On Wed, Oct 20, 2010 at 02:51:56PM -0500, Anthony Liguori wrote: > >+ e = errno; > >+ > >+ qemu_mutex_lock(&qemu_global_mutex); > >+ > >+ if (r == -1&& !(e == EAGAIN || e == EINTR)) { > >+ fprintf(stderr, "sigtimedwait: %s\n", strerror(e)); > >+ exit(1); > >+ } > >+ > >+ switch (r) { > >+ case SIGBUS: > >+#ifdef TARGET_I386 > >+ if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) > >+#endif > >+ sigbus_reraise(); > >+ break; > >+ default: > >+ break; > >+ } > >+ > >+ r = sigpending(&chkset); > >+ if (r == -1) { > >+ fprintf(stderr, "sigpending: %s\n", strerror(e)); > >+ exit(1); > >+ } > >+ } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS)); > > } > > I don't understand why this loop is needed but we specifically wait > for a signal to get delivered that's either SIG_IPI or SIGBUS. We > then check whether a SIG_IPI or SIGBUS is pending and loop waiting > for signals again. > > Shouldn't we be looping on just sigismember(SIGBUS)? Think of SIG_IPI and SIGBUS pending. SIGBUS must be processed immediately. Yes, sigismember(SIGBUS) would be fine. But the current code too. > BTW, we're no longer respecting timeout because we're not adjusting > ts after each iteration. Right, timeout not used at the moment. -- 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