Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 split out
drm_gem_shmem_init() from drm_gem_shmem_create() to allow for doing this.

Signed-off-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
Link: https://lore.kernel.org/r/20250911230147.650077-2-lyude@redhat.com

+62 -36
+61 -36
drivers/gpu/drm/drm_gem_shmem_helper.c
··· 48 48 .vm_ops = &drm_gem_shmem_vm_ops, 49 49 }; 50 50 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) 53 + { 54 + struct drm_gem_object *obj = &shmem->base; 55 + int ret = 0; 56 + 57 + if (!obj->funcs) 58 + obj->funcs = &drm_gem_shmem_funcs; 59 + 60 + if (private) { 61 + drm_gem_private_object_init(dev, obj, size); 62 + shmem->map_wc = false; /* dma-buf mappings use always writecombine */ 63 + } else { 64 + ret = drm_gem_object_init_with_mnt(dev, obj, size, gemfs); 65 + } 66 + if (ret) { 67 + drm_gem_private_object_fini(obj); 68 + return ret; 69 + } 70 + 71 + ret = drm_gem_create_mmap_offset(obj); 72 + if (ret) 73 + goto err_release; 74 + 75 + INIT_LIST_HEAD(&shmem->madv_list); 76 + 77 + if (!private) { 78 + /* 79 + * Our buffers are kept pinned, so allocating them 80 + * from the MOVABLE zone is a really bad idea, and 81 + * conflicts with CMA. See comments above new_inode() 82 + * why this is required _and_ expected if you're 83 + * going to pin these pages. 84 + */ 85 + mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER | 86 + __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 87 + } 88 + 89 + return 0; 90 + err_release: 91 + drm_gem_object_release(obj); 92 + return ret; 93 + } 94 + 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 + 51 109 static struct drm_gem_shmem_object * 52 110 __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private, 53 111 struct vfsmount *gemfs) ··· 128 70 obj = &shmem->base; 129 71 } 130 72 131 - if (!obj->funcs) 132 - obj->funcs = &drm_gem_shmem_funcs; 133 - 134 - if (private) { 135 - drm_gem_private_object_init(dev, obj, size); 136 - shmem->map_wc = false; /* dma-buf mappings use always writecombine */ 137 - } else { 138 - ret = drm_gem_object_init_with_mnt(dev, obj, size, gemfs); 139 - } 73 + ret = __drm_gem_shmem_init(dev, shmem, size, private, gemfs); 140 74 if (ret) { 141 - drm_gem_private_object_fini(obj); 142 - goto err_free; 143 - } 144 - 145 - ret = drm_gem_create_mmap_offset(obj); 146 - if (ret) 147 - goto err_release; 148 - 149 - INIT_LIST_HEAD(&shmem->madv_list); 150 - 151 - if (!private) { 152 - /* 153 - * Our buffers are kept pinned, so allocating them 154 - * from the MOVABLE zone is a really bad idea, and 155 - * conflicts with CMA. See comments above new_inode() 156 - * why this is required _and_ expected if you're 157 - * going to pin these pages. 158 - */ 159 - mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER | 160 - __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 75 + kfree(obj); 76 + return ERR_PTR(ret); 161 77 } 162 78 163 79 return shmem; 164 - 165 - err_release: 166 - drm_gem_object_release(obj); 167 - err_free: 168 - kfree(obj); 169 - 170 - return ERR_PTR(ret); 171 80 } 172 81 /** 173 82 * drm_gem_shmem_create - Allocate an object with the given size
+1
include/drm/drm_gem_shmem_helper.h
··· 107 107 #define to_drm_gem_shmem_obj(obj) \ 108 108 container_of(obj, struct drm_gem_shmem_object, base) 109 109 110 + int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, size_t size); 110 111 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size); 111 112 struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_device *dev, 112 113 size_t size,