struct mutex lock;
        bool enabled;
        bool v2;
+       bool def_window_pending;
        unsigned long locked_pages;
        struct iommu_table *tables[IOMMU_TABLE_GROUP_MAX_TABLES];
        struct list_head group_list;
        struct tce_iommu_group *tcegrp;
        struct iommu_table_group *table_group;
 
+       if (!container->def_window_pending)
+               return 0;
+
        if (!tce_groups_attached(container))
                return -ENODEV;
 
                        table_group->tce32_size, 1, &start_addr);
        WARN_ON_ONCE(!ret && start_addr);
 
+       if (!ret)
+               container->def_window_pending = false;
+
        return ret;
 }
 
                                VFIO_DMA_MAP_FLAG_WRITE))
                        return -EINVAL;
 
+               ret = tce_iommu_create_default_window(container);
+               if (ret)
+                       return ret;
+
                num = tce_iommu_find_table(container, param.iova, &tbl);
                if (num < 0)
                        return -ENXIO;
                if (param.flags)
                        return -EINVAL;
 
+               ret = tce_iommu_create_default_window(container);
+               if (ret)
+                       return ret;
+
                num = tce_iommu_find_table(container, param.iova, &tbl);
                if (num < 0)
                        return -ENXIO;
 
                mutex_lock(&container->lock);
 
+               ret = tce_iommu_create_default_window(container);
+               if (ret)
+                       return ret;
+
                ret = tce_iommu_create_window(container, create.page_shift,
                                create.window_size, create.levels,
                                &create.start_addr);
                if (remove.flags)
                        return -EINVAL;
 
+               if (container->def_window_pending && !remove.start_addr) {
+                       container->def_window_pending = false;
+                       return 0;
+               }
+
                mutex_lock(&container->lock);
 
                ret = tce_iommu_remove_window(container, remove.start_addr);
        struct tce_container *container = iommu_data;
        struct iommu_table_group *table_group;
        struct tce_iommu_group *tcegrp = NULL;
-       bool create_default_window = false;
 
        mutex_lock(&container->lock);
 
        } else {
                ret = tce_iommu_take_ownership_ddw(container, table_group);
                if (!tce_groups_attached(container) && !container->tables[0])
-                       create_default_window = true;
+                       container->def_window_pending = true;
        }
 
        if (!ret) {
                tcegrp->grp = iommu_group;
                list_add(&tcegrp->next, &container->group_list);
-               /*
-                * If it the first group attached, check if there is
-                * a default DMA window and create one if none as
-                * the userspace expects it to exist.
-                */
-               if (create_default_window) {
-                       ret = tce_iommu_create_default_window(container);
-                       if (ret) {
-                               list_del(&tcegrp->next);
-                               tce_iommu_release_ownership_ddw(container,
-                                               table_group);
-                       }
-               }
        }
 
 unlock_exit: