[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 |