aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFenghua Yu <fenghua.yu@intel.com>2009-11-11 10:23:06 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-11-11 21:28:45 -0500
commit99dcadede42f8898d4c963ef69192ef4b9b76ba8 (patch)
tree36db26e700bfa17f56a30ef05b4092372149e147 /drivers
parente8bb910d1bbc65e7081e73aab4b3a3dd8630332c (diff)
intel-iommu: Support PCIe hot-plug
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. Without the patch, after a hot-remove, a hot-added device on the same slot will not work. Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Tested-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pci/intel-iommu.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index 7fe5f7920caf..1840a0578a42 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -3215,6 +3215,33 @@ static int __init init_iommu_sysfs(void)
3215} 3215}
3216#endif /* CONFIG_PM */ 3216#endif /* CONFIG_PM */
3217 3217
3218/*
3219 * Here we only respond to action of unbound device from driver.
3220 *
3221 * Added device is not attached to its DMAR domain here yet. That will happen
3222 * when mapping the device to iova.
3223 */
3224static int device_notifier(struct notifier_block *nb,
3225 unsigned long action, void *data)
3226{
3227 struct device *dev = data;
3228 struct pci_dev *pdev = to_pci_dev(dev);
3229 struct dmar_domain *domain;
3230
3231 domain = find_domain(pdev);
3232 if (!domain)
3233 return 0;
3234
3235 if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through)
3236 domain_remove_one_dev_info(domain, pdev);
3237
3238 return 0;
3239}
3240
3241static struct notifier_block device_nb = {
3242 .notifier_call = device_notifier,
3243};
3244
3218int __init intel_iommu_init(void) 3245int __init intel_iommu_init(void)
3219{ 3246{
3220 int ret = 0; 3247 int ret = 0;
@@ -3267,6 +3294,8 @@ int __init intel_iommu_init(void)
3267 3294
3268 register_iommu(&intel_iommu_ops); 3295 register_iommu(&intel_iommu_ops);
3269 3296
3297 bus_register_notifier(&pci_bus_type, &device_nb);
3298
3270 return 0; 3299 return 0;
3271} 3300}
3272 3301