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/client: Deprecate struct drm_client_buffer.gem

The client buffer's framebuffer holds a reference and pointer on
each of its GEM buffer objects. Thus the field gem in the client-
buffer struct is not necessary. Deprecated the field and convert
the client-buffer helpers to use the framebuffer's objects.

In drm_client_buffer_delete(), do a possible vunmap before releasing
the framebuffer. Otherwise we'd eventually release the framebuffer
before unmaping its buffer objects.

v2:
- avoid dependency on CONFIG_DRM_KMS_HELPER

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Tested-by: Francesco Valla <francesco@valla.it>
Link: https://patch.msgid.link/20251027121042.143588-5-tzimmermann@suse.de

+15 -14
+12 -8
drivers/gpu/drm/drm_client.c
··· 17 17 #include <drm/drm_fourcc.h> 18 18 #include <drm/drm_framebuffer.h> 19 19 #include <drm/drm_gem.h> 20 + #include <drm/drm_gem_framebuffer_helper.h> 20 21 #include <drm/drm_mode.h> 21 22 #include <drm/drm_print.h> 22 23 ··· 179 178 180 179 static void drm_client_buffer_delete(struct drm_client_buffer *buffer) 181 180 { 181 + struct drm_gem_object *gem = buffer->fb->obj[0]; 182 182 int ret; 183 + 184 + drm_gem_vunmap(gem, &buffer->map); 183 185 184 186 ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file); 185 187 if (ret) 186 188 drm_err(buffer->client->dev, 187 189 "Error removing FB:%u (%d)\n", buffer->fb->base.id, ret); 188 190 189 - if (buffer->gem) { 190 - drm_gem_vunmap(buffer->gem, &buffer->map); 191 - drm_gem_object_put(buffer->gem); 192 - } 191 + drm_gem_object_put(buffer->gem); 193 192 194 193 kfree(buffer); 195 194 } ··· 279 278 int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer, 280 279 struct iosys_map *map_copy) 281 280 { 282 - struct drm_gem_object *gem = buffer->gem; 281 + struct drm_gem_object *gem = buffer->fb->obj[0]; 283 282 struct iosys_map *map = &buffer->map; 284 283 int ret; 285 284 ··· 308 307 */ 309 308 void drm_client_buffer_vunmap_local(struct drm_client_buffer *buffer) 310 309 { 311 - struct drm_gem_object *gem = buffer->gem; 310 + struct drm_gem_object *gem = buffer->fb->obj[0]; 312 311 struct iosys_map *map = &buffer->map; 313 312 314 313 drm_gem_vunmap_locked(gem, map); ··· 339 338 int drm_client_buffer_vmap(struct drm_client_buffer *buffer, 340 339 struct iosys_map *map_copy) 341 340 { 341 + struct drm_gem_object *gem = buffer->fb->obj[0]; 342 342 int ret; 343 343 344 - ret = drm_gem_vmap(buffer->gem, &buffer->map); 344 + ret = drm_gem_vmap(gem, &buffer->map); 345 345 if (ret) 346 346 return ret; 347 347 *map_copy = buffer->map; ··· 361 359 */ 362 360 void drm_client_buffer_vunmap(struct drm_client_buffer *buffer) 363 361 { 364 - drm_gem_vunmap(buffer->gem, &buffer->map); 362 + struct drm_gem_object *gem = buffer->fb->obj[0]; 363 + 364 + drm_gem_vunmap(gem, &buffer->map); 365 365 } 366 366 EXPORT_SYMBOL(drm_client_buffer_vunmap); 367 367
+3 -6
include/drm/drm_client.h
··· 176 176 /** 177 177 * @gem: GEM object backing this buffer 178 178 * 179 - * FIXME: The dependency on GEM here isn't required, we could 180 - * convert the driver handle to a dma-buf instead and use the 181 - * backend-agnostic dma-buf vmap support instead. This would 182 - * require that the handle2fd prime ioctl is reworked to pull the 183 - * fd_install step out of the driver backend hooks, to make that 184 - * final step optional for internal users. 179 + * FIXME: The DRM framebuffer holds a reference on its GEM 180 + * buffer objects. Do not use this field in new code and 181 + * update existing users. 185 182 */ 186 183 struct drm_gem_object *gem; 187 184