This patch unmaps INTx interrupt on hot-remove.
Please apply this patch after applying the following patch.
[Xen-devel] [PATCH] ioemu: msi/msix clean up on hotplug remove
Thanks,
--
Yuji Shimada
Signed-off-by: Yuji Shimada <shimada-yxb@xxxxxxxxxxxxxxx>
diff --git a/hw/pass-through.c b/hw/pass-through.c
index ee52960..4e7f447 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -46,6 +46,8 @@ struct dpci_infos {
} dpci_infos;
+char mapped_machine_irq[PT_NR_IRQS] = {0};
+
/* prototype */
static uint32_t pt_common_reg_init(struct pt_dev *ptdev,
struct pt_reg_info_tbl *reg, uint32_t real_offset);
@@ -3657,6 +3659,7 @@ struct pt_dev * register_real_device(PCIBus *e_bus,
{
machine_irq = pirq;
assigned_device->machine_irq = pirq;
+ mapped_machine_irq[machine_irq]++;
}
}
@@ -3737,6 +3740,19 @@ int unregister_real_device(int php_slot)
if (assigned_device->msix)
pt_msix_disable(assigned_device);
+ if (machine_irq)
+ {
+ mapped_machine_irq[machine_irq]--;
+
+ if (mapped_machine_irq[machine_irq] == 0)
+ {
+ rc = xc_physdev_unmap_pirq(xc_handle, domid, machine_irq);
+
+ if (rc < 0)
+ PT_LOG("Error: Unmaping of interrupt failed! rc=%d\n", rc);
+ }
+ }
+
/* delete all emulated config registers */
pt_config_delete(assigned_device);
diff --git a/hw/pass-through.h b/hw/pass-through.h
index e86d311..6679fc2 100644
--- a/hw/pass-through.h
+++ b/hw/pass-through.h
@@ -40,6 +40,7 @@
#define PT_MACHINE_IRQ_AUTO (0xFFFFFFFF)
#define PT_VIRT_DEVFN_AUTO (-1)
+#define PT_NR_IRQS (256)
/* Misc PCI constants that should be moved to a separate library :) */
#define PCI_CONFIG_SIZE (256)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|