On 16/07/2021 10:27, Leonardo Bras wrote:
@@ -1099,18 +1105,13 @@ int iommu_take_ownership(struct iommu_table *tbl)
        for (i = 0; i < tbl->nr_pools; i++)
                spin_lock_nest_lock(&tbl->pools[i].lock, &tbl->large_pool.lock);
- iommu_table_release_pages(tbl);
-
-       if (!bitmap_empty(tbl->it_map, tbl->it_size)) {
+       if (iommu_table_in_use(tbl)) {
                pr_err("iommu_tce: it_map is not empty");
                ret = -EBUSY;
-               /* Undo iommu_table_release_pages, i.e. restore bit#0, etc */
-               iommu_table_reserve_pages(tbl, tbl->it_reserved_start,
-                               tbl->it_reserved_end);
-       } else {
-               memset(tbl->it_map, 0xff, sz);
        }
+ memset(tbl->it_map, 0xff, sz);
+


So if the table is not empty, we fail (EBUSY) but we now also completely overwrite the bitmap. It was in an unexpected state, but we're making it worse. Or am I missing something?

  Fred


        for (i = 0; i < tbl->nr_pools; i++)
                spin_unlock(&tbl->pools[i].lock);
        spin_unlock_irqrestore(&tbl->large_pool.lock, flags);

Reply via email to