Messages in this thread | | | Date | Tue, 20 Mar 2007 18:41:50 -0500 | From | Matt Mackall <> | Subject | Re: [patch 13/26] Xen-paravirt_ops: Consistently wrap paravirt ops callsites to make them patchable |
| |
On Tue, Mar 20, 2007 at 03:08:19PM -0800, Zachary Amsden wrote: > Matt Mackall wrote: > >I don't know that you need an xchg there. If you're still on the same > >CPU, it should all be nice and causal even across an interrupt handler. > >So it could be: > > > > pda.intr_mask = 0; /* intr_pending can't get set after this */ > > > > Why not? Oh, I see. intr_mask is inverted form of EFLAGS_IF.
It's not even that. There are two things that can happen:
case 1:
intr_mask = 1; <interrupt occurs and is deferred> intr_mask = 0; /* intr_pending is already set and CLI is in effect */ if(intr_pending)
case 2:
intr_mask = 1; intr_mask = 0; <interrupt occurs and is processed> /* intr_pending remains cleared */ if(intr_pending)
As this is all about local interrupts, it's all on a single CPU and out of order issues aren't visible.. > >(This would actually need a C barrier, but I'll ignore that as this'd > >end up being asm...)
..unless the compiler is doing the reordering, of course.
> >But other interesting things could happen. If we never did a real CLI > >and we get preempted and switched to another CPU between clearing > >intr_mask and checking intr_pending, we get a little confused. > > I think Jeremy's idea was to have interrupt handlers leave interrupts > disabled on exit if pda.intr_mask was set. In which case, they would > bypass all work and we could never get preempted.
I was actually worrying about the case where the interrupt came in "late". But I don't think it's a problem there either.
> I don't think leaving > hardware interrupts disabled for such a long time is good though.
It can only be worse than the current situation by the amount of time it takes to defer an interrupt once. On average, it'll be a lot better as most critical sections are -tiny-.
-- Mathematics is the supreme nostalgia of our time. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |