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

Re: [Xen-devel] A suggestion about processing irq

thank you for the patch and sorry for my late reply.

On Mon, 19 Aug 2013, êìë wrote:
> Hello,
> While I was reading gic handling part of xen arm, I noticed that, in 
> gic_set_guest_irq function, 
> if lr_pending is not empty, the arrival irq is also stored into pending list.
> I think although lr_pending is not empty, there maybe empty slots in lr, and 
> if so, we can insert 
> IRQ immediately. 

Yes, the idea is that if not list_empty(&v->arch.vgic.lr_pending),
somebody else is already queuing for a free LR register, so there is no
point in trying to find one.

If you look at maintenance_interrupt, you'll see that as soon as an LR
is freed, the first irq in the lr_pending queue is going to be removed
from the queue and added to the register. So if at least one irq is
prensent in lr_pending, all lr registers must be already in use.

> Since I'd like to keep the IRQ in priority order, how about checking the 
> highest priority in lr_pending list rather than emptiness?

Injecting irqs in priority order is a good goal to have, but it requires
more than this change.
From gic_set_guest_irq you would need to find an LR register with an IRQ
of lower priority that is PENDING and not ACTIVE and remove it from the
register, replacing it with the new irq. You would need to add the
removed irq to lr_pending again.

Also keep in mind that lower priority numbers mean higher priority.

> Here goes the simple patch:
> Signed-off-by: Jaemin Kim <jmkim.kim@xxxxxxxxxxx>
> ---
> diff -urN xen/arch/arm/gic.c xen2/arch/arm/gic.c
> --- xen/arch/arm/gic.c  2013-07-30 10:16:45.076382483 +0900
> +++ xen2/arch/arm/gic.c 2013-07-31 11:19:28.094799335 +0900
> @@ -587,12 +587,17 @@
>          unsigned int state, unsigned int priority)
>  {
>      int i;
> -    struct pending_irq *iter, *n;
> +    struct pending_irq *iter, *n, *first_item;
>      unsigned long flags;
>      spin_lock_irqsave(&gic.lock, flags);
> +
> +   first_item = list_entry( (&v->arch.vgic.lr_pending)->next,
> +                           typeof(*iter), lr_queue );
> -    if (( v == current ) &&  (list_empty(&v->arch.vgic.lr_pending) ))
> +    if ( ( v == current ) &&
> +         ( list_empty(&v->arch.vgic.lr_pending) ||
> +           ( priority > first_item->priority ) ) )
>      {
>          i = find_first_zero_bit(&this_cpu(lr_mask), nr_lrs);
>          if (i < nr_lrs) {
Xen-devel mailing list



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