Thread (38 messages) 38 messages, 6 authors, 2016-05-25

Re: [PATCH 2/5] iommu: Set PCI_BUS_FLAGS_MSI_REMAP if IOMMU have capability of IRQ remapping

From: Yongji Xie <hidden>
Date: 2016-05-25 05:54:34
Also in: kvm, linux-iommu

On 2016/5/25 5:11, Bjorn Helgaas wrote:
On Wed, Apr 27, 2016 at 08:43:27PM +0800, Yongji Xie wrote:
quoted
The capability of IRQ remapping is abstracted on IOMMU side on
some archs. There is a existing flag IOMMU_CAP_INTR_REMAP for this.

To have a universal flag to test this capability for different
archs on PCI side, we set PCI_BUS_FLAGS_MSI_REMAP for PCI buses
when IOMMU_CAP_INTR_REMAP is set.

Signed-off-by: Yongji Xie <redacted>
---
  drivers/iommu/iommu.c |   15 +++++++++++++++
  1 file changed, 15 insertions(+)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 0e3b009..5d2b6f6 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -813,6 +813,16 @@ struct iommu_group *pci_device_group(struct device *dev)
  	return group;
  }
  
+static void pci_check_msi_remapping(struct pci_dev *pdev,
+					const struct iommu_ops *ops)
+{
+	struct pci_bus *bus = pdev->bus;
+
+	if (ops->capable(IOMMU_CAP_INTR_REMAP) &&
+		!(bus->bus_flags & PCI_BUS_FLAGS_MSI_REMAP))
+		bus->bus_flags |= PCI_BUS_FLAGS_MSI_REMAP;
+}
This looks an awful lot like the pci_bus_check_msi_remapping() you add
elsewhere.  Why do we need both?
I will modify this function as you suggested.  And we add this function
here because some iommu drivers would be initialed after PCI probing.
quoted
  /**
   * iommu_group_get_for_dev - Find or create the IOMMU group for a device
   * @dev: target device
@@ -871,6 +881,9 @@ static int add_iommu_group(struct device *dev, void *data)
  	const struct iommu_ops *ops = cb->ops;
  	int ret;
  
+	if (dev_is_pci(dev) && ops->capable)
+		pci_check_msi_remapping(to_pci_dev(dev), ops);
+
  	if (!ops->add_device)
  		return 0;
  
@@ -913,6 +926,8 @@ static int iommu_bus_notifier(struct notifier_block *nb,
  	 * result in ADD/DEL notifiers to group->notifier
  	 */
  	if (action == BUS_NOTIFY_ADD_DEVICE) {
+		if (dev_is_pci(dev) && ops->capable)
+			pci_check_msi_remapping(to_pci_dev(dev), ops);
These calls don't smell right either.  Why do we need dev_is_pci()
checks here?
Some platform devices may also call this.
Can't this be done in the PCI probe path somehow, e.g.,
in pci_set_bus_msi_domain() or something?
Yes, this can be done in pci_create_root_bus(). But it could only
handle the case that iommu drivers are initialed before PCI probing.

Regards,
Yongji
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help