hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/iommu/iommu.c
....@@ -201,13 +201,23 @@
201201 const struct iommu_ops *ops = dev->bus->iommu_ops;
202202 struct iommu_device *iommu_dev;
203203 struct iommu_group *group;
204
+ static DEFINE_MUTEX(iommu_probe_device_lock);
204205 int ret;
205206
206207 if (!ops)
207208 return -ENODEV;
208
-
209
- if (!dev_iommu_get(dev))
210
- return -ENOMEM;
209
+ /*
210
+ * Serialise to avoid races between IOMMU drivers registering in
211
+ * parallel and/or the "replay" calls from ACPI/OF code via client
212
+ * driver probe. Once the latter have been cleaned up we should
213
+ * probably be able to use device_lock() here to minimise the scope,
214
+ * but for now enforcing a simple global ordering is fine.
215
+ */
216
+ mutex_lock(&iommu_probe_device_lock);
217
+ if (!dev_iommu_get(dev)) {
218
+ ret = -ENOMEM;
219
+ goto err_unlock;
220
+ }
211221
212222 if (!try_module_get(ops->owner)) {
213223 ret = -EINVAL;
....@@ -227,11 +237,14 @@
227237 ret = PTR_ERR(group);
228238 goto out_release;
229239 }
230
- iommu_group_put(group);
231240
241
+ mutex_lock(&group->mutex);
232242 if (group_list && !group->default_domain && list_empty(&group->entry))
233243 list_add_tail(&group->entry, group_list);
244
+ mutex_unlock(&group->mutex);
245
+ iommu_group_put(group);
234246
247
+ mutex_unlock(&iommu_probe_device_lock);
235248 iommu_device_link(iommu_dev, dev);
236249
237250 return 0;
....@@ -244,6 +257,9 @@
244257
245258 err_free:
246259 dev_iommu_free(dev);
260
+
261
+err_unlock:
262
+ mutex_unlock(&iommu_probe_device_lock);
247263
248264 return ret;
249265 }
....@@ -1766,10 +1782,10 @@
17661782 return ret;
17671783
17681784 list_for_each_entry_safe(group, next, &group_list, entry) {
1785
+ mutex_lock(&group->mutex);
1786
+
17691787 /* Remove item from the list */
17701788 list_del_init(&group->entry);
1771
-
1772
- mutex_lock(&group->mutex);
17731789
17741790 /* Try to allocate default domain */
17751791 probe_alloc_default_domain(bus, group);