Skip to content

Commit

Permalink
xen: do not map the same GSI twice in PVHVM guests.
Browse files Browse the repository at this point in the history
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.

CC: stable@kernel.org
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  • Loading branch information
Stefano Stabellini authored and Konrad Rzeszutek Wilk committed May 21, 2012
1 parent 201a52b commit 68c2c39
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 2 deletions.
4 changes: 4 additions & 0 deletions arch/x86/pci/xen.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ static int xen_register_pirq(u32 gsi, int gsi_override, int triggering,
int shareable = 0;
char *name;

irq = xen_irq_from_gsi(gsi);
if (irq > 0)
return irq;

if (set_pirq)
pirq = gsi;

Expand Down
5 changes: 3 additions & 2 deletions drivers/xen/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions include/xen/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ int xen_irq_from_pirq(unsigned pirq);
/* Return the pirq allocated to the irq. */
int xen_pirq_from_irq(unsigned irq);

/* Return the irq allocated to the gsi */
int xen_irq_from_gsi(unsigned gsi);

/* Determine whether to ignore this IRQ if it is passed to a guest. */
int xen_test_irq_shared(int irq);

Expand Down

0 comments on commit 68c2c39

Please sign in to comment.