summaryrefslogtreecommitdiff
path: root/drivers/xen
diff options
context:
space:
mode:
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>2012-05-21 16:54:10 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-06-01 15:18:25 +0800
commit474d1f4678a679a98eaf53801e7f95c61ae9daa7 (patch)
tree55949e1184861437b1d4c6a3cb5cd8ab89f29034 /drivers/xen
parent284e7be895509cdaf9f58e2f789c00b5e9da2244 (diff)
downloadlinux-3.10-474d1f4678a679a98eaf53801e7f95c61ae9daa7.tar.gz
linux-3.10-474d1f4678a679a98eaf53801e7f95c61ae9daa7.tar.bz2
linux-3.10-474d1f4678a679a98eaf53801e7f95c61ae9daa7.zip
xen: do not map the same GSI twice in PVHVM guests.
commit 68c2c39a76b094e9b2773e5846424ea674bf2c46 upstream. PV on HVM guests map GSIs into event channels. At restore time the event channels are resumed by restore_pirqs. Device drivers might try to register the same GSI again through ACPI at restore time, but the GSI has already been mapped and bound by restore_pirqs. This patch detects these situations and avoids mapping the same GSI multiple times. Without this patch we get: (XEN) irq.c:2235: dom4: pirq 23 or emuirq 28 already mapped and waste a pirq. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/events.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 0a8a17cd80b..6908e4ce2a0 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -611,7 +611,7 @@ static void disable_pirq(struct irq_data *data)
disable_dynirq(data);
}
-static int find_irq_by_gsi(unsigned gsi)
+int xen_irq_from_gsi(unsigned gsi)
{
struct irq_info *info;
@@ -625,6 +625,7 @@ static int find_irq_by_gsi(unsigned gsi)
return -1;
}
+EXPORT_SYMBOL_GPL(xen_irq_from_gsi);
/*
* Do not make any assumptions regarding the relationship between the
@@ -644,7 +645,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi,
mutex_lock(&irq_mapping_update_lock);
- irq = find_irq_by_gsi(gsi);
+ irq = xen_irq_from_gsi(gsi);
if (irq != -1) {
printk(KERN_INFO "xen_map_pirq_gsi: returning irq %d for gsi %u\n",
irq, gsi);