]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/vmwgfx: stop using ttm_bo_create v2
authorChristian König <christian.koenig@amd.com>
Mon, 21 Sep 2020 12:14:32 +0000 (14:14 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 13 Apr 2024 10:58:01 +0000 (12:58 +0200)
[ Upstream commit b254557cb244e2c18e59ee1cc2293128c52d2473 ]

Implement in the driver instead since it is the only user of that function.

v2: fix usage of ttm_bo_init_reserved

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Link: https://patchwork.freedesktop.org/patch/391614/?series=81973&rev=1
Stable-dep-of: 517621b70600 ("drm/vmwgfx: Fix possible null pointer derefence with invalid contexts")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c

index 813f1b14809415fa78eae62128677dc2832ca485..c8ca09f0e62743d5689fd2a1140603fff993f301 100644 (file)
@@ -487,6 +487,49 @@ static void vmw_user_bo_destroy(struct ttm_buffer_object *bo)
        ttm_prime_object_kfree(vmw_user_bo, prime);
 }
 
+/**
+ * vmw_bo_create_kernel - Create a pinned BO for internal kernel use.
+ *
+ * @dev_priv: Pointer to the device private struct
+ * @size: size of the BO we need
+ * @placement: where to put it
+ * @p_bo: resulting BO
+ *
+ * Creates and pin a simple BO for in kernel use.
+ */
+int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
+                        struct ttm_placement *placement,
+                        struct ttm_buffer_object **p_bo)
+{
+       unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT;
+       struct ttm_operation_ctx ctx = { false, false };
+       struct ttm_buffer_object *bo;
+       size_t acc_size;
+       int ret;
+
+       bo = kzalloc(sizeof(*bo), GFP_KERNEL);
+       if (unlikely(!bo))
+               return -ENOMEM;
+
+       acc_size = ttm_round_pot(sizeof(*bo));
+       acc_size += ttm_round_pot(npages * sizeof(void *));
+       acc_size += ttm_round_pot(sizeof(struct ttm_tt));
+       ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size,
+                                  ttm_bo_type_device, placement, 0,
+                                  &ctx, acc_size, NULL, NULL, NULL);
+       if (unlikely(ret))
+               goto error_free;
+
+       ttm_bo_pin(bo);
+       ttm_bo_unreserve(bo);
+       *p_bo = bo;
+
+       return 0;
+
+error_free:
+       kfree(bo);
+       return ret;
+}
 
 /**
  * vmw_bo_init - Initialize a vmw buffer object
index 3b41cf63110ad9e5ef8b432a5b9f4f156af770ff..9a9fe10d829b892c8407bbe755a84c9b70210c3b 100644 (file)
@@ -1245,9 +1245,9 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
                    !dev_priv->has_mob)
                        return -ENOMEM;
 
-               ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
-                                   &vmw_mob_ne_placement, 0, false,
-                                   &man->cmd_space);
+               ret = vmw_bo_create_kernel(dev_priv, size,
+                                          &vmw_mob_placement,
+                                          &man->cmd_space);
                if (ret)
                        return ret;
 
index 0a79c57c7db6401f6b45ec4ccc3369a5831ca641..e6af950c4037040008912d749ec616fec80de7c8 100644 (file)
@@ -845,6 +845,10 @@ extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf,
                                 SVGAGuestPtr *ptr);
 extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin);
 extern void vmw_bo_bo_free(struct ttm_buffer_object *bo);
+extern int vmw_bo_create_kernel(struct vmw_private *dev_priv,
+                               unsigned long size,
+                               struct ttm_placement *placement,
+                               struct ttm_buffer_object **p_bo);
 extern int vmw_bo_init(struct vmw_private *dev_priv,
                       struct vmw_buffer_object *vmw_bo,
                       size_t size, struct ttm_placement *placement,
index 73116ec70ba59547a18ed9e4478157c1d8c7fadd..8abeef691ad29109b7aa6c90c7c610c91bb1e34c 100644 (file)
@@ -817,11 +817,9 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
        struct ttm_buffer_object *bo;
        int ret;
 
-       ret = ttm_bo_create(&dev_priv->bdev, bo_size,
-                           ttm_bo_type_device,
-                           &vmw_sys_ne_placement,
-                           0, false, &bo);
-
+       ret = vmw_bo_create_kernel(dev_priv, bo_size,
+                                  &vmw_sys_placement,
+                                  &bo);
        if (unlikely(ret != 0))
                return ret;