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

Re: [Xen-devel] [PATCH v2] x86: re-inject emulated level pirqs in PV on HVM guests if still asserted



On Fri, Nov 18, 2011 at 11:13:13AM +0000, Stefano Stabellini wrote:
> This patch is a backport of CS 24007 for xen-4.1-testing.
> 
> PV on HVM guests can loose level interrupts coming from emulated
> devices if they have been remapped onto event channels.  The reason is
> that we are missing the code to inject a pirq again in the guest when
> the guest EOIs it, if it corresponds to an emulated level interrupt
> and the interrupt is still asserted.
> 

Btw this issue also happens with pure HVM guests using emulated devices.
I was seeing this bug with Linux F16 HVM guest with IDE disk and realtek 
emulated NIC.
The emulated realtek nic didn't work before applying this patch.

-- Pasi


> Fix this issue and also return error when the guest tries to get the
> irq_status of a non-existing pirq.
> 
> 
> Changes in v2:
> 
> - move the spinlock afterward to cover the new code only.
> 
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> 
> 
> diff -r e73ada19a69d xen/arch/x86/physdev.c
> --- a/xen/arch/x86/physdev.c  Thu Nov 17 09:13:25 2011 +0000
> +++ b/xen/arch/x86/physdev.c  Fri Nov 18 09:42:03 2011 +0000
> @@ -268,6 +268,20 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>              ret = pirq_guest_eoi(v->domain, eoi.irq);
>          else
>              ret = 0;
> +        spin_lock(&v->domain->event_lock);
> +        if ( is_hvm_domain(v->domain) &&
> +                domain_pirq_to_emuirq(v->domain, eoi.irq) > 0 )
> +        {
> +            struct hvm_irq *hvm_irq = &v->domain->arch.hvm_domain.irq;
> +            int gsi = domain_pirq_to_emuirq(v->domain, eoi.irq);
> +
> +            /* if this is a level irq and count > 0, send another
> +             * notification */ 
> +            if ( gsi >= NR_ISAIRQS /* ISA irqs are edge triggered */
> +                    && hvm_irq->gsi_assert_count[gsi] )
> +                send_guest_pirq(v->domain, eoi.irq);
> +        }
> +        spin_unlock(&v->domain->event_lock);
>          break;
>      }
>  
> @@ -323,9 +337,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>              break;
>          irq_status_query.flags = 0;
>          if ( is_hvm_domain(v->domain) &&
> -             domain_pirq_to_irq(v->domain, irq) <= 0 )
> +                domain_pirq_to_irq(v->domain, irq) <= 0 &&
> +                domain_pirq_to_emuirq(v->domain, irq) == IRQ_UNBOUND )
>          {
> -            ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
> +            ret = -EINVAL;
>              break;
>          }
>  
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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