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

Re: [Xen-devel] Xen-unstable: pci-passthrough of device using MSI-X interrupts not working after commit x86/MSI: track host and guest masking separately



Tuesday, July 7, 2015, 6:08:25 PM, you wrote:

>>>> On 26.06.15 at 17:48, <linux@xxxxxxxxxxxxxx> wrote:
>> On 2015-06-26 17:22, Jan Beulich wrote:
>>> I have an idea: In
>>> 
>>> static unsigned int startup_msi_irq(struct irq_desc *desc)
>>> {
>>>     bool_t guest_masked = (desc->status & IRQ_GUEST) &&
>>>                           is_hvm_domain(desc->msi_desc->dev->domain);
>>> 
>>>     if ( unlikely(!msi_set_mask_bit(desc, 0, guest_masked)) )
>>>         WARN();
>>>     return 0;
>>> }
>>> 
>>> I think we need to also exclude the emuirq case (which is what I
>>> understand backs the pvhvm interrupt in the guest - Stefano,
>>> please confirm). For testing purposes, could you try simply passing
>>> zero instead of guest_masked here?
>> 
>> I can confirm, with 0 it works !

> Okay, here's something that hopefully could go in (provided of
> course it too works for you).

Hi Jan,

Just tested and it works fine :-)

--
Sander

> Jan

> --- unstable.orig/xen/arch/x86/irq.c    2015-07-07 17:56:52.000000000 +0200
> +++ unstable/xen/arch/x86/irq.c       2015-07-07 17:04:08.000000000 +0200
> @@ -2502,6 +2502,25 @@ int unmap_domain_pirq_emuirq(struct doma
>      return ret;
>  }
>  
> +void arch_evtchn_bind_pirq(struct domain *d, int pirq)
> +{
> +    int irq = domain_pirq_to_irq(d, pirq);
> +    struct irq_desc *desc;
> +    unsigned long flags;
> +
> +    if ( irq <= 0 )
> +        return;
> +
> +    if ( is_hvm_domain(d) )
> +        map_domain_emuirq_pirq(d, pirq, IRQ_PT);
> +
> +    desc = irq_to_desc(irq);
> +    spin_lock_irqsave(&desc->lock, flags);
+    if ( desc->>msi_desc )
> +        guest_mask_msi_irq(desc, 0);
> +    spin_unlock_irqrestore(&desc->lock, flags);
> +}
> +
>  bool_t hvm_domain_use_pirq(const struct domain *d, const struct pirq *pirq)
>  {
>      return is_hvm_domain(d) && pirq &&
> --- unstable.orig/xen/arch/x86/msi.c    2015-07-07 17:56:53.000000000 +0200
> +++ unstable/xen/arch/x86/msi.c       2015-07-07 16:50:02.000000000 +0200
> @@ -422,10 +422,7 @@ void guest_mask_msi_irq(struct irq_desc 
>  
>  static unsigned int startup_msi_irq(struct irq_desc *desc)
>  {
> -    bool_t guest_masked = (desc->status & IRQ_GUEST) &&
> -                          is_hvm_domain(desc->msi_desc->dev->domain);
> -
> -    msi_set_mask_bit(desc, 0, guest_masked);
> +    msi_set_mask_bit(desc, 0, !!(desc->status & IRQ_GUEST));
>      return 0;
>  }
>  
> --- unstable.orig/xen/common/event_channel.c    2015-07-07 17:56:51.000000000 
> +0200
> +++ unstable/xen/common/event_channel.c       2015-07-07 16:53:47.000000000 
> +0200
> @@ -456,10 +456,7 @@ static long evtchn_bind_pirq(evtchn_bind
>  
>      bind->port = port;
>  
> -#ifdef CONFIG_X86
> -    if ( is_hvm_domain(d) && domain_pirq_to_irq(d, pirq) > 0 )
> -        map_domain_emuirq_pirq(d, pirq, IRQ_PT);
> -#endif
> +    arch_evtchn_bind_pirq(d, pirq);
>  
>   out:
>      spin_unlock(&d->event_lock);
> --- unstable.orig/xen/include/asm-arm/irq.h     2015-07-07 17:56:49.000000000 
> +0200
> +++ unstable/xen/include/asm-arm/irq.h  2015-07-07 17:02:00.000000000 +0200
> @@ -48,6 +48,8 @@ int release_guest_irq(struct domain *d, 
>  
>  void arch_move_irqs(struct vcpu *v);
>  
> +#define arch_evtchn_bind_pirq(d, pirq) ((void)((d) + (pirq)))
> +
>  /* Set IRQ type for an SPI */
>  int irq_set_spi_type(unsigned int spi, unsigned int type);
>  
> --- unstable.orig/xen/include/xen/irq.h       2015-07-07 17:56:49.000000000 
> +0200
> +++ unstable/xen/include/xen/irq.h      2015-07-07 17:02:49.000000000 +0200
> @@ -172,4 +172,8 @@ unsigned int set_desc_affinity(struct ir
>  unsigned int arch_hwdom_irqs(domid_t);
>  #endif
>  
> +#ifndef arch_evtchn_bind_pirq
> +void arch_evtchn_bind_pirq(struct domain *, int pirq);
> +#endif
> +
>  #endif /* __XEN_IRQ_H__ */




_______________________________________________
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®.