Re: [PATCH v1 5/8] iommu/amd: Use iommu_attach/detach_device()

From: Lu Baolu
Date: Thu Jan 06 2022 - 19:23:55 EST


Hi Jason,

On 1/6/22 10:33 PM, Jason Gunthorpe wrote:
On Thu, Jan 06, 2022 at 10:20:50AM +0800, Lu Baolu wrote:
The individual device driver should use iommu_attach/detach_device()
for domain attachment/detachment.

Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
drivers/iommu/amd/iommu_v2.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/iommu/amd/iommu_v2.c b/drivers/iommu/amd/iommu_v2.c
index 58da08cc3d01..7d9d0fe89064 100644
+++ b/drivers/iommu/amd/iommu_v2.c
@@ -133,7 +133,7 @@ static void free_device_state(struct device_state *dev_state)
if (WARN_ON(!group))
return;
- iommu_detach_group(dev_state->domain, group);
+ iommu_detach_device(dev_state->domain, &dev_state->pdev->dev);
iommu_group_put(group);

This is the only user of the group in the function all the
group_get/put should be deleted too.

Joerg said in commit 55c99a4dc50f ("iommu/amd: Use
iommu_attach_group()") that the device API doesn't work here because
there are multi-device groups?

But I'm not sure how this can work with multi-device groups - this
seems to assigns a domain setup for direct map, so perhaps this only
works if all devices are setup for direct map?

It's also difficult for me to understand how this can work with multi-
device group. The iommu_attach_group() returns -EBUSY if _init_device()
is called for the second device in the group. That's the reason why I
didn't set no_kernel_dma.


@@ -791,7 +791,7 @@ int amd_iommu_init_device(struct pci_dev *pdev, int pasids)
goto out_free_domain;
}
- ret = iommu_attach_group(dev_state->domain, group);
+ ret = iommu_attach_device(dev_state->domain, &pdev->dev);
if (ret != 0)
goto out_drop_group;

Same comment here

Yes.


Jason


Best regards,
baolu