[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.4] x86/IO-APIC: don't create pIRQ mapping from masked RTE
commit 9a00f96bb09ff8642bef2a3edde855a924093614 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Sep 10 15:51:56 2015 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Sep 10 15:51:56 2015 +0200 x86/IO-APIC: don't create pIRQ mapping from masked RTE While moving our XenoLinux patches to 4.2-rc I noticed bogus "already mapped" messages resulting from Linux (legitimately) writing RTEs with only the mask bit set. Clearly we shouldn't even attempt to create a pIRQ <-> IRQ mapping from such RTEs. In the course of this I also found that the respective message isn't really useful without also printing the pre-existing mapping. And I noticed that map_domain_pirq() allowed IRQ0 to get through, despite us never allowing a domain to control that interrupt. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> master commit: 669d4b85c433674ab3b52ef707af0d3a551c941f master date: 2015-08-25 16:18:31 +0200 --- xen/arch/x86/io_apic.c | 25 ++++++++++++++++--------- xen/arch/x86/irq.c | 7 ++++--- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index 8f41a06..3ab29b0 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -2370,9 +2370,14 @@ int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val) * pirq and irq mapping. Where the GSI is greater than 256, we assume * that dom0 pirq == irq. */ - pirq = (irq >= 256) ? irq : rte.vector; - if ( (pirq < 0) || (pirq >= dom0->nr_pirqs) ) - return -EINVAL; + if ( !rte.mask ) + { + pirq = (irq >= 256) ? irq : rte.vector; + if ( pirq >= dom0->nr_pirqs ) + return -EINVAL; + } + else + pirq = -1; if ( desc->action ) { @@ -2407,12 +2412,14 @@ int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val) printk(XENLOG_INFO "allocated vector %02x for irq %d\n", ret, irq); } - spin_lock(&dom0->event_lock); - ret = map_domain_pirq(dom0, pirq, irq, - MAP_PIRQ_TYPE_GSI, NULL); - spin_unlock(&dom0->event_lock); - if ( ret < 0 ) - return ret; + if ( pirq >= 0 ) + { + spin_lock(&dom0->event_lock); + ret = map_domain_pirq(dom0, pirq, irq, MAP_PIRQ_TYPE_GSI, NULL); + spin_unlock(&dom0->event_lock); + if ( ret < 0 ) + return ret; + } spin_lock_irqsave(&ioapic_lock, flags); /* Set the correct irq-handling type. */ diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 194d508..77aded7 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -1897,7 +1897,7 @@ int map_domain_pirq( if ( !irq_access_permitted(current->domain, irq)) return -EPERM; - if ( pirq < 0 || pirq >= d->nr_pirqs || irq < 0 || irq >= nr_irqs ) + if ( pirq < 0 || pirq >= d->nr_pirqs || irq <= 0 || irq >= nr_irqs ) { dprintk(XENLOG_G_ERR, "dom%d: invalid pirq %d or irq %d\n", d->domain_id, pirq, irq); @@ -1910,8 +1910,9 @@ int map_domain_pirq( if ( (old_irq > 0 && (old_irq != irq) ) || (old_pirq && (old_pirq != pirq)) ) { - dprintk(XENLOG_G_WARNING, "dom%d: pirq %d or irq %d already mapped\n", - d->domain_id, pirq, irq); + dprintk(XENLOG_G_WARNING, + "dom%d: pirq %d or irq %d already mapped (%d,%d)\n", + d->domain_id, pirq, irq, old_pirq, old_irq); return 0; } -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.4 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |