Messages in this thread Patch in this message | | | Date | Tue, 6 Oct 2009 11:23:46 -0700 | From | Fenghua Yu <> | Subject | [PATCH] PCIe hot plug for Intel iommu |
| |
To support PCIe hot plug in IOMMU, we register a notifier to respond to device change action.
When the notifier gets BUS_NOTIFY_UNBOUND_DRIVER, it removes the device from its DMAR domain.
A hot added device will be added into an IOMMU domain when it first does IOMMU op. So there is no need to add more code for hot add.
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
intel-iommu.c | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+)
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 855dd7c..d8b8cfc 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -3193,6 +3193,33 @@ static int __init init_iommu_sysfs(void) } #endif /* CONFIG_PM */ +/* + * Here we only respond to action of unbound device from driver. + * + * Added device is not attached to its DMAR domain here yet. That will happen + * when mapping the device to iova. + */ +static int device_notifier(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct device *dev = data; + struct pci_dev *pdev = to_pci_dev(dev); + struct dmar_domain *domain; + + domain = find_domain(pdev); + if (!domain) + return 0; + + if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through) + domain_remove_one_dev_info(domain, pdev); + + return 0; +} + +static struct notifier_block device_nb = { + .notifier_call = device_notifier, +}; + int __init intel_iommu_init(void) { int ret = 0; @@ -3245,6 +3272,8 @@ int __init intel_iommu_init(void) register_iommu(&intel_iommu_ops); + bus_register_notifier(&pci_bus_type, &device_nb); + return 0; }
| |