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

Re: [Xen-devel] [XenARM] XEN tools for ARM with Virtualization Extensions - Patch #2



On 07/19/2013 09:45 AM, Ian Campbell wrote:
> On Tue, 2013-07-16 at 12:24 +0100, Stefano Stabellini wrote:
>> On Tue, 16 Jul 2013, Eric Trudeau wrote:
>>>> -----Original Message-----
>>>> From: Julien Grall [mailto:julien.grall@xxxxxxxxxx]
>>>> Sent: Monday, July 15, 2013 7:14 PM
>>>> To: Eric Trudeau
>>>> Cc: xen-devel; Stefano.Stabellini@xxxxxxxxxx; Ian Campbell
>>>> Subject: Re: [Xen-devel] [XenARM] XEN tools for ARM with Virtualization
>>>> Extensions - Patch #2
>>>>
>>>> On 12 July 2013 20:27, Eric Trudeau <etrudeau@xxxxxxxxxxxx> wrote:
>>>>> Second patch submitted with changes based on comments on first patch.
>>>>>
>>>>>>> From 551f174c9653def01890fadd2dd769ab8a9acde7 Mon Sep 17 00:00:00
>>>>>> 2001
>>>>>>> From: Eric Trudeau <etrudeau@xxxxxxxxxxxx>
>>>>>>> Date: Thu, 11 Jul 2013 20:03:51 -0400
>>>>>>> Subject: [PATCH] Add support for Guest physdev irqs
>>>>>>>
>>>>>>> ---
>>>>>>>  xen/arch/arm/domain.c  | 16 ++++++++++++++++
>>>>>>>  xen/arch/arm/gic.c     | 15 ++++++++++-----
>>>>>>>  xen/arch/arm/physdev.c | 48
>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++--
>>>>>>>  xen/arch/arm/vgic.c    |  5 +----
>>>>>>>  4 files changed, 73 insertions(+), 11 deletions(-)
>>>>>>>
>>>>>>> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
>>>>>>> index 4c434a1..52d3429 100644
>>>>>>> --- a/xen/arch/arm/domain.c
>>>>>>> +++ b/xen/arch/arm/domain.c
>>>>>>> @@ -31,6 +31,8 @@
>>>>>>>  #include <asm/gic.h>
>>>>>>>  #include "vtimer.h"
>>>>>>>  #include "vpl011.h"
>>>>>>> +#include <xen/iocap.h>
>>>>>>> +#include <xen/irq.h>
>>>>>>>
>>>>>>>  DEFINE_PER_CPU(struct vcpu *, curr_vcpu);
>>>>>>>
>>>>>>> @@ -513,8 +515,22 @@ fail:
>>>>>>>      return rc;
>>>>>>>  }
>>>>>>>
>>>>>>> +static int release_domain_irqs(struct domain *d)
>>>>>>> +{
>>>>>>> +    int i;
>>>>>>> +    for (i = 0; i <= d->nr_pirqs; i++) {
>>>>>>> +        if (irq_access_permitted(d, i)) {
>>>>>>> +            release_irq(i);
>>>>>>> +        }
>>>>>>> +    }
>>>>>>> +    return 0;
>>>>>>> +}
>>>>>>
>>>>>> As you may know, release_irq will spin until the flags IRQ_INPROGRESS
>>>>>> is unset. This is done my the maintenance handler.
>>>>>>
>>>>>> Now, let say the domain has crashed and the IRQ is not yet EOIed, then 
>>>>>> you
>>>>>> will spin forever.
>>>>>>
>>>>>
>>>>> I put a timeout in the IRQ_INPROGRESS check in release_irq() of 100 
>>>>> attempts
>>>>> with a 1 msec delay per loop iteration.
>>>>
>>>> If we plan to only use release_irq when a domain is destroyed, this
>>>> check is useless,
>>>> so it should be removed.
>>>>
>>>> An IRQ stays with the flag IRQ_INPROGRESS until Xen will eoi it.
>>>> If the domain has crashed or received an hard shutdown (ie xl
>>>> destroy), the IRQ will
>>>> remain "inflight" and can never come up again.
>>>>
>>>> You need to check if the IRQ is still inflight and, if yes, eoi it.
>>>>
>>
>> I think that Julien is right: we need to call something similar to
>> xen/arch/arm/gic.c:maintenance_interrupt. I would refactor the code
>> there into a separate function that ends up being called by
>> maintenance_interrupt and release_irq.
>>
>>
>>> I will have to research this implementation as I am not familiar with the 
>>> flow
>>> and functions in the IRQ handler code.  If you have any suggestions, please
>>> let me know.  Is it simply a matter of checking IRQ_INFLIGHT bit in the
>>> desc->status word and then calling a function to EOI the interrupt?
>>
>> First we need to make sure that the domain is paused and about to be
>> destroyed otherwise we risk breaking the gic/vgic interface.  Then we
>> need to check whether the irq is currently inflight, looking at the
>> inflight queue, see for example
>> xen/arch/arm/vgic.c:vgic_vcpu_inject_irq.  If the irq is inflight we
>> need to check whether it's actually in one of the LR registers or just
>> in the lr_queue. See xen/arch/arm/gic.c:gic_set_guest_irq to see how the
>> lr_queue works. If the irq is queued there, just remove it from the
>> lr_queue, EOI it and remove it from the inflight queue. If the irq is
>> not present in lr_queue, it means it's in one of the LR registers. In
>> that case we can call something similar to maintenance_interrupt to
>> remove it from the LR, EOI the interrupt and remove it from the inflight
>> queue.
> 
> This all sounds plausible to me. I'm not sure we need to worry overly
> much about the impact on the guest of pulling an interrupt out from
> under it -- that's not ever going to be a clever thing to do and it
> seems like it should be up to the host and guest admin to arrange that
> the guest has quiesced the device. If the guest admin won't co-operate,
> well then they get to suffer the consequences. I guess that doesn't mean
> we shouldn't try and at least be a bit graceful about it if it's easy
> enough to do.
> 
> The thing to worry about is that the IRQ remains usable at the host
> level and can be assigned to someone else etc.

Is it enough to check IRQ_INPROGRESS flags and if it's enabled Xen will
need to EOI the interrupt?

So the code of release_irq could be:
        1) disable/mask the IRQ
        2) if IRQ_INPROGRESS => EOI it on the right CPU

> One thing to bare in mind is that when you EOI the interrupt, unless the
> guest has dealt with it you might immediately get another, which you may
> not currently be set up to handle.
> 
> You likely want to make sure it is at least masked at the physical level
> or maybe you want to try and ensure you do things in the right order
> such that it is routed to the host before you do the EOI. Safer to mask
> I think.
> 
> Ian.
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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