On Thu, Nov 21, 2013 at 04:21:56PM +0800, Yijing Wang wrote: > @@ -3641,21 +3681,42 @@ static int device_notifier(struct notifier_block *nb, > struct device *dev = data; > struct pci_dev *pdev = to_pci_dev(dev); > struct dmar_domain *domain; > + struct dmar_device *dmar_dev; > + struct dmar_drhd_unit *drhd; > > - if (iommu_no_mapping(dev)) > - return 0; > - > - domain = find_domain(pdev); > - if (!domain) > - return 0; > + switch (action) { > + case BUS_NOTIFY_ADD_DEVICE: > + for_each_drhd_unit(drhd) > + list_for_each_entry(dmar_dev, &drhd->devices, list) > + if (dmar_dev->segment == pci_domain_nr(pdev->bus) > + && dmar_dev->bus == pdev->bus->number > + && dmar_dev->devfn == pdev->devfn) > + dmar_dev->pdev = pci_dev_get(pdev); > + break; > + case BUS_NOTIFY_DEL_DEVICE: > + for_each_drhd_unit(drhd) > + list_for_each_entry(dmar_dev, &drhd->devices, list) > + if (dmar_dev->pdev == pdev) { > + pci_dev_put(pdev); > + dmar_dev->pdev = NULL; > + } How is that synchronized with other users of this dmar_dev structure. Could it happen that you drop the device reference while other parts of the driver still use it? Joerg -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html