|
[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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |