[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] x86/upcall: inject a spurious event after setting upcall vector



>>> On 04.01.18 at 13:15, <roger.pau@xxxxxxxxxx> wrote:
> On Thu, Jan 04, 2018 at 05:10:52AM -0700, Jan Beulich wrote:
>> >>> On 04.01.18 at 12:37, <roger.pau@xxxxxxxxxx> wrote:
>> > On Thu, Jan 04, 2018 at 03:53:39AM -0700, Jan Beulich wrote:
>> >> >>> On 04.01.18 at 10:13, <roger.pau@xxxxxxxxxx> wrote:
>> >> > On Tue, Jan 02, 2018 at 09:47:40AM -0700, Jan Beulich wrote:
>> >> >> >>> On 28.12.17 at 13:57, <roger.pau@xxxxxxxxxx> wrote:
>> >> >> > In case the vCPU has pending events to inject. This fixes a bug that
>> >> >> > happened if the guest mapped the vcpu info area using
>> >> >> > VCPUOP_register_vcpu_info without having setup the event channel
>> >> >> > upcall, and then setup the upcall vector.
>> >> >> > 
>> >> >> > In this scenario the guest would not receive any upcalls, because the
>> >> >> > call to VCPUOP_register_vcpu_info would have marked the vCPU as 
>> >> >> > having
>> >> >> > pending events, but the vector could not be injected because it was
>> >> >> > not yet setup.
>> >> >> > 
>> >> >> > This has not caused issues so far because all the consumers first
>> >> >> > setup the vector callback and then map the vcpu info page, but 
>> >> >> > there's
>> >> >> > no limitation that prevents doing it in the inverse order.
>> >> >> 
>> >> >> Hmm, yes, okay, I can see that we may indeed want to do this for
>> >> >> symmetry reasons. There is a small theoretical risk of this causing
>> >> >> races, though, for not entirely well written guest drivers.
>> >> > 
>> >> > Not exactly. In the scenario described above not injecting this event
>> >> > will cause further events to not be injected also. This is because
>> >> > VCPUOP_register_vcpu_info sets evtchn_upcall_pending and tries to
>> >> > inject an event using arch_evtchn_inject. If the vector is not set at
>> >> > this point, arch_evtchn_inject will do nothing, but
>> >> > evtchn_upcall_pending will be left set.
>> >> > 
>> >> > Further calls to vcpu_mark_events_pending will not call into
>> >> > hvm_assert_evtchn_irq because the pending bit is already set, thus
>> >> > preventing the delivery of any event channel interrupts.
>> >> 
>> >> I understand that, but I don't understand how this relates to my
>> >> comment.
>> > 
>> > I don't think this applies to "not entirely well written drivers". I
>> > think it's perfectly fine for a guest to map the vcpu_info page first
>> > and then setup the vector callback. With the current code doing this
>> > will result in no interrupts being injected.
>> 
>> My meaning of "not entirely well written drivers" is unrelated to
>> the scenario you want to fix: When setting the upcall vector, an
>> event would now be received at a time that the drivers may not
>> expect (iirc there's no requirement to relocate the vcpu info out
>> of the shared info page, and even if there was the issue described
>> would still arise if the vector was changed later on).
> 
> Sorry, I misunderstood the context of that sentence. Regarding your
> point, yes, that's right, drivers should be able to cope with spurious
> interrupts. I would be very surprised if an event channel driver is not
> able to cope with spurious interrupts.

I'm not concerned about spurious interrupts in general (i.e. in
the middle of some other operations). What I'm (slightly) worried
about is a driver getting the setup order wrong, and receiving
an interrupt when its handler isn't fully ready yet.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.