Merge tag 'pm-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
[linux-2.6-block.git] / drivers / vfio / vfio_iommu_spapr_tce.c
index cf3de91fbfe7a522456d00bff9005df9a3662ed4..63112c36ab2de129e41b70e2c9db77e17399a781 100644 (file)
@@ -198,6 +198,11 @@ static long tce_iommu_register_pages(struct tce_container *container,
                return ret;
 
        tcemem = kzalloc(sizeof(*tcemem), GFP_KERNEL);
+       if (!tcemem) {
+               mm_iommu_put(container->mm, mem);
+               return -ENOMEM;
+       }
+
        tcemem->mem = mem;
        list_add(&tcemem->next, &container->prereg_list);
 
@@ -680,7 +685,7 @@ static void tce_iommu_free_table(struct tce_container *container,
        unsigned long pages = tbl->it_allocated_size >> PAGE_SHIFT;
 
        tce_iommu_userspace_view_free(tbl, container->mm);
-       tbl->it_ops->free(tbl);
+       iommu_tce_table_put(tbl);
        decrement_locked_vm(container->mm, pages);
 }
 
@@ -1335,8 +1340,16 @@ static int tce_iommu_attach_group(void *iommu_data,
 
        if (!table_group->ops || !table_group->ops->take_ownership ||
                        !table_group->ops->release_ownership) {
+               if (container->v2) {
+                       ret = -EPERM;
+                       goto unlock_exit;
+               }
                ret = tce_iommu_take_ownership(container, table_group);
        } else {
+               if (!container->v2) {
+                       ret = -EPERM;
+                       goto unlock_exit;
+               }
                ret = tce_iommu_take_ownership_ddw(container, table_group);
                if (!tce_groups_attached(container) && !container->tables[0])
                        container->def_window_pending = true;