Thread (17 messages) 17 messages, 4 authors, 2021-01-22

Re: [PATCH v10 10/10] iommu/arm-smmu-v3: Add stall support for platform devices

From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
Date: 2021-01-22 11:56:00
Also in: linux-acpi, linux-arm-kernel, linux-iommu

On Fri, 22 Jan 2021 09:51:20 +0100
Jean-Philippe Brucker [off-list ref] wrote:
On Thu, Jan 21, 2021 at 07:12:36PM +0000, Jonathan Cameron wrote:
quoted
quoted
@@ -2502,6 +2647,7 @@ static void arm_smmu_release_device(struct device *dev)
 
 	master = dev_iommu_priv_get(dev);
 	WARN_ON(arm_smmu_master_sva_enabled(master));
+	iopf_queue_remove_device(master->smmu->evtq.iopf, dev);
 	arm_smmu_detach_dev(master);
 	arm_smmu_disable_pasid(master);
 	arm_smmu_remove_master(master);  
The lack of symmetry here bothers me a bit, but it's already true, so I guess
this case is fine as well.  
Normally the device driver calls iommu_dev_feat_disable(SVA) which does
iopf_queue_remove_device(). This is just a safety net in case the device
gets removed without the driver properly cleaning up (which will WARN as
well) 
Ah makes sense.  Maybe it's worth a comment in the code for future generations
of tired code readers?
quoted
...  
quoted
 
@@ -2785,6 +2946,7 @@ static int arm_smmu_cmdq_init(struct arm_smmu_device *smmu)
 static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
 {
 	int ret;
+	bool sva = smmu->features & ARM_SMMU_FEAT_STALLS;  
FEAT_SVA?  
Ugh yes, thanks. I left this as a bool instead of moving into the test
below because the PRI patch reuses it, but I think I'll just move it down
when resending.
Makes sense.
Thanks,
Jean
quoted
  
quoted
 
 	/* cmdq */
 	ret = arm_smmu_init_one_queue(smmu, &smmu->cmdq.q, ARM_SMMU_CMDQ_PROD,
@@ -2804,6 +2966,12 @@ static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
 	if (ret)
 		return ret;
 
+	if (sva && smmu->features & ARM_SMMU_FEAT_STALLS) {  
Isn't this checking same thing twice?
  
quoted
+		smmu->evtq.iopf = iopf_queue_alloc(dev_name(smmu->dev));
+		if (!smmu->evtq.iopf)
+			return -ENOMEM;
+	}
+
 	/* priq */
 	if (!(smmu->features & ARM_SMMU_FEAT_PRI))
 		return 0;
@@ -3718,6 +3886,7 @@ static int arm_smmu_device_remove(struct platform_device *pdev)
 	iommu_device_unregister(&smmu->iommu);
 	iommu_device_sysfs_remove(&smmu->iommu);
 	arm_smmu_device_disable(smmu);
+	iopf_queue_free(smmu->evtq.iopf);
 
 	return 0;
 }  
  
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help