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