Skip to content

Commit dd6a48f

Browse files
Lyudejannau
authored andcommitted
drm/gem/shmem: Extract drm_gem_shmem_init() from drm_gem_shmem_create()
With gem objects in rust, the most ideal way for us to be able to handle gem shmem object creation is to be able to handle the memory allocation of a gem object ourselves - and then have the DRM gem shmem helpers initialize the object we've allocated afterwards. So, let's spit out drm_gem_shmem_init() from drm_gem_shmem_create() to allow for doing this. Signed-off-by: Lyude Paul <lyude@redhat.com>
1 parent d90b28c commit dd6a48f

2 files changed

Lines changed: 51 additions & 25 deletions

File tree

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,12 @@ static const struct drm_gem_object_funcs drm_gem_shmem_funcs = {
4848
.vm_ops = &drm_gem_shmem_vm_ops,
4949
};
5050

51-
static struct drm_gem_shmem_object *
52-
__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
53-
struct vfsmount *gemfs)
51+
static int __drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem,
52+
size_t size, bool private, struct vfsmount *gemfs)
5453
{
55-
struct drm_gem_shmem_object *shmem;
56-
struct drm_gem_object *obj;
54+
struct drm_gem_object *obj = &shmem->base;
5755
int ret = 0;
5856

59-
size = PAGE_ALIGN(size);
60-
61-
if (dev->driver->gem_create_object) {
62-
obj = dev->driver->gem_create_object(dev, size);
63-
if (IS_ERR(obj))
64-
return ERR_CAST(obj);
65-
shmem = to_drm_gem_shmem_obj(obj);
66-
} else {
67-
shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
68-
if (!shmem)
69-
return ERR_PTR(-ENOMEM);
70-
obj = &shmem->base;
71-
}
72-
7357
if (!obj->funcs)
7458
obj->funcs = &drm_gem_shmem_funcs;
7559

@@ -81,7 +65,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
8165
}
8266
if (ret) {
8367
drm_gem_private_object_fini(obj);
84-
goto err_free;
68+
return ret;
8569
}
8670

8771
ret = drm_gem_create_mmap_offset(obj);
@@ -102,14 +86,55 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
10286
__GFP_RETRY_MAYFAIL | __GFP_NOWARN);
10387
}
10488

105-
return shmem;
106-
89+
return 0;
10790
err_release:
10891
drm_gem_object_release(obj);
109-
err_free:
110-
kfree(obj);
92+
return ret;
93+
}
11194

112-
return ERR_PTR(ret);
95+
/**
96+
* drm_gem_shmem_init - Initialize an allocated object.
97+
* @dev: DRM device
98+
* @obj: The allocated shmem GEM object.
99+
*
100+
* Returns:
101+
* 0 on success, or a negative error code on failure.
102+
*/
103+
int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, size_t size)
104+
{
105+
return __drm_gem_shmem_init(dev, shmem, size, false, NULL);
106+
}
107+
EXPORT_SYMBOL_GPL(drm_gem_shmem_init);
108+
109+
static struct drm_gem_shmem_object *
110+
__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
111+
struct vfsmount *gemfs)
112+
{
113+
struct drm_gem_shmem_object *shmem;
114+
struct drm_gem_object *obj;
115+
int ret = 0;
116+
117+
size = PAGE_ALIGN(size);
118+
119+
if (dev->driver->gem_create_object) {
120+
obj = dev->driver->gem_create_object(dev, size);
121+
if (IS_ERR(obj))
122+
return ERR_CAST(obj);
123+
shmem = to_drm_gem_shmem_obj(obj);
124+
} else {
125+
shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
126+
if (!shmem)
127+
return ERR_PTR(-ENOMEM);
128+
obj = &shmem->base;
129+
}
130+
131+
ret = __drm_gem_shmem_init(dev, shmem, size, private, gemfs);
132+
if (ret) {
133+
kfree(obj);
134+
return ERR_PTR(ret);
135+
}
136+
137+
return shmem;
113138
}
114139
/**
115140
* drm_gem_shmem_create - Allocate an object with the given size

include/drm/drm_gem_shmem_helper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct drm_gem_shmem_object {
107107
#define to_drm_gem_shmem_obj(obj) \
108108
container_of(obj, struct drm_gem_shmem_object, base)
109109

110+
int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, size_t size);
110111
struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size);
111112
struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_device *dev,
112113
size_t size,

0 commit comments

Comments
 (0)