hwpt->domain);
                        if (rc)
                                goto out_detach;
+                       list_add_tail(&hwpt->hwpt_item, &hwpt->ioas->hwpt_list);
                }
        }
 
        rc = iommufd_device_do_attach(idev, hwpt);
        if (rc)
                goto out_abort;
-       list_add_tail(&hwpt->hwpt_item, &ioas->hwpt_list);
 
        mutex_unlock(&ioas->mutex);
        iommufd_object_finalize(idev->ictx, &hwpt->obj);
        if (rc)
                goto out_hwpt;
 
+       mutex_lock(&ioas->mutex);
+       list_add_tail(&hwpt->hwpt_item, &hwpt->ioas->hwpt_list);
+       mutex_unlock(&ioas->mutex);
+
        refcount_inc(&hwpt->obj.users);
        iommufd_object_finalize(ictx, &hwpt->obj);
        return hwpt;
 void iommufd_device_selftest_detach(struct iommufd_ctx *ictx,
                                    struct iommufd_hw_pagetable *hwpt)
 {
+       mutex_lock(&hwpt->ioas->mutex);
        iopt_table_remove_domain(&hwpt->ioas->iopt, hwpt->domain);
+       list_del(&hwpt->hwpt_item);
+       mutex_unlock(&hwpt->ioas->mutex);
        refcount_dec(&hwpt->obj.users);
 }
 #endif