hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/panfrost/panfrost_drv.c
....@@ -81,6 +81,7 @@
8181 struct panfrost_gem_object *bo;
8282 struct drm_panfrost_create_bo *args = data;
8383 struct panfrost_gem_mapping *mapping;
84
+ int ret;
8485
8586 if (!args->size || args->pad ||
8687 (args->flags & ~(PANFROST_BO_NOEXEC | PANFROST_BO_HEAP)))
....@@ -91,21 +92,29 @@
9192 !(args->flags & PANFROST_BO_NOEXEC))
9293 return -EINVAL;
9394
94
- bo = panfrost_gem_create_with_handle(file, dev, args->size, args->flags,
95
- &args->handle);
95
+ bo = panfrost_gem_create(dev, args->size, args->flags);
9696 if (IS_ERR(bo))
9797 return PTR_ERR(bo);
9898
99
+ ret = drm_gem_handle_create(file, &bo->base.base, &args->handle);
100
+ if (ret)
101
+ goto out;
102
+
99103 mapping = panfrost_gem_mapping_get(bo, priv);
100
- if (!mapping) {
101
- drm_gem_object_put(&bo->base.base);
102
- return -EINVAL;
104
+ if (mapping) {
105
+ args->offset = mapping->mmnode.start << PAGE_SHIFT;
106
+ panfrost_gem_mapping_put(mapping);
107
+ } else {
108
+ /* This can only happen if the handle from
109
+ * drm_gem_handle_create() has already been guessed and freed
110
+ * by user space
111
+ */
112
+ ret = -EINVAL;
103113 }
104114
105
- args->offset = mapping->mmnode.start << PAGE_SHIFT;
106
- panfrost_gem_mapping_put(mapping);
107
-
108
- return 0;
115
+out:
116
+ drm_gem_object_put(&bo->base.base);
117
+ return ret;
109118 }
110119
111120 /**