Commit ea39f2e6 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Tested-by: default avatarFrancesco Valla <francesco@valla.it>
Link: https://patch.msgid.link/20251027121042.143588-5-tzimmermann@suse.de
parent 7cc0f617
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <drm/drm_fourcc.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_mode.h>
#include <drm/drm_print.h>

@@ -178,17 +179,17 @@ EXPORT_SYMBOL(drm_client_release);

static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
{
	struct drm_gem_object *gem = buffer->fb->obj[0];
	int ret;

	drm_gem_vunmap(gem, &buffer->map);

	ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
	if (ret)
		drm_err(buffer->client->dev,
			"Error removing FB:%u (%d)\n", buffer->fb->base.id, ret);

	if (buffer->gem) {
		drm_gem_vunmap(buffer->gem, &buffer->map);
	drm_gem_object_put(buffer->gem);
	}

	kfree(buffer);
}
@@ -278,7 +279,7 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
				 struct iosys_map *map_copy)
{
	struct drm_gem_object *gem = buffer->gem;
	struct drm_gem_object *gem = buffer->fb->obj[0];
	struct iosys_map *map = &buffer->map;
	int ret;

@@ -307,7 +308,7 @@ EXPORT_SYMBOL(drm_client_buffer_vmap_local);
 */
void drm_client_buffer_vunmap_local(struct drm_client_buffer *buffer)
{
	struct drm_gem_object *gem = buffer->gem;
	struct drm_gem_object *gem = buffer->fb->obj[0];
	struct iosys_map *map = &buffer->map;

	drm_gem_vunmap_locked(gem, map);
@@ -338,9 +339,10 @@ EXPORT_SYMBOL(drm_client_buffer_vunmap_local);
int drm_client_buffer_vmap(struct drm_client_buffer *buffer,
			   struct iosys_map *map_copy)
{
	struct drm_gem_object *gem = buffer->fb->obj[0];
	int ret;

	ret = drm_gem_vmap(buffer->gem, &buffer->map);
	ret = drm_gem_vmap(gem, &buffer->map);
	if (ret)
		return ret;
	*map_copy = buffer->map;
@@ -359,7 +361,9 @@ EXPORT_SYMBOL(drm_client_buffer_vmap);
 */
void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
{
	drm_gem_vunmap(buffer->gem, &buffer->map);
	struct drm_gem_object *gem = buffer->fb->obj[0];

	drm_gem_vunmap(gem, &buffer->map);
}
EXPORT_SYMBOL(drm_client_buffer_vunmap);

+3 −6
Original line number Diff line number Diff line
@@ -176,12 +176,9 @@ struct drm_client_buffer {
	/**
	 * @gem: GEM object backing this buffer
	 *
	 * FIXME: The dependency on GEM here isn't required, we could
	 * convert the driver handle to a dma-buf instead and use the
	 * backend-agnostic dma-buf vmap support instead. This would
	 * require that the handle2fd prime ioctl is reworked to pull the
	 * fd_install step out of the driver backend hooks, to make that
	 * final step optional for internal users.
	 * FIXME: The DRM framebuffer holds a reference on its GEM
	 * buffer objects. Do not use this field in new code and
	 * update existing users.
	 */
	struct drm_gem_object *gem;