[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |