Re: [Qemu-devel] Re: [PATCH 08/10] MCE: Relay UCR MCE to guest

Marcelo Tosatti
2010-10-20T21:40:06Z

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.