[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



>>> 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).

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__ */


Attachment: x86-MSI-pv-unmask.patch
Description: Text document

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