dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] drm/client: Simply client-buffer interface and implementation
@ 2025-10-20 15:04 Thomas Zimmermann
  2025-10-20 15:04 ` [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer Thomas Zimmermann
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Streamline the client-buffer code and remove the drm_client_framebuffer_
functions. Makes the code easier to work with.

Also prepares for importing non-dumb-buffer objects. Most of the in-
kernel clients will use dumb-buffer allocation. In the case of the
per-driver fbdev_probe code, the client buffer can also wrap an object
that comes from a different memory region; for example gma500's stolen
memory area. This functionality is required to move forward with the
various per-driver implementations of fbdev_probe within the overall
DRM-client framework.

Tested with efidrm and virtio-gpu on Virt I/O hardware.

Thomas Zimmermann (7):
  drm/client: Remove pitch from struct drm_client_buffer
  drm/client: Move dumb-buffer handling to
    drm_client_framebuffer_create()
  drm/client: Inline drm_client_buffer_addfb() and _rmfb()
  drm/client: Deprecate struct drm_client_buffer.gem
  drm/client: Remove drm_client_framebuffer_delete()
  drm/client: Create client buffers with drm_client_buffer_create_dumb()
  drm/client: Flush client buffers with drm_client_buffer_sync()

 drivers/gpu/drm/clients/drm_log.c |  10 +-
 drivers/gpu/drm/drm_client.c      | 192 ++++++++++++++----------------
 drivers/gpu/drm/drm_fbdev_dma.c   |   8 +-
 drivers/gpu/drm/drm_fbdev_shmem.c |   6 +-
 drivers/gpu/drm/drm_fbdev_ttm.c   |  10 +-
 include/drm/drm_client.h          |  20 +---
 6 files changed, 113 insertions(+), 133 deletions(-)

-- 
2.51.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  2025-10-21 12:44   ` Jocelyn Falempe
  2025-10-20 15:04 ` [PATCH 2/7] drm/client: Move dumb-buffer handling to drm_client_framebuffer_create() Thomas Zimmermann
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Only the client-buffer setup uses the pitch field from struct
drm_client_buffer. Remove the field and pass the value among setup
helpers.

Clients that need the pitch should rather look at the framebuffer's
pitches[0] directly.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_client.c | 14 +++++++-------
 include/drm/drm_client.h     |  5 -----
 2 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 3fa38d4ac70b..5fa8a1628563 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -184,7 +184,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 
 static struct drm_client_buffer *
 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
-			 u32 format, u32 *handle)
+			 u32 format, u32 *handle, u32 *pitch)
 {
 	const struct drm_format_info *info = drm_format_info(format);
 	struct drm_mode_create_dumb dumb_args = { };
@@ -212,9 +212,9 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
 		goto err_delete;
 	}
 
-	buffer->pitch = dumb_args.pitch;
 	buffer->gem = obj;
 	*handle = dumb_args.handle;
+	*pitch = dumb_args.pitch;
 
 	return buffer;
 
@@ -349,7 +349,7 @@ static void drm_client_buffer_rmfb(struct drm_client_buffer *buffer)
 
 static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
 				   u32 width, u32 height, u32 format,
-				   u32 handle)
+				   u32 handle, u32 pitch)
 {
 	struct drm_client_dev *client = buffer->client;
 	struct drm_mode_fb_cmd2 fb_req = { };
@@ -359,7 +359,7 @@ static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
 	fb_req.height = height;
 	fb_req.pixel_format = format;
 	fb_req.handles[0] = handle;
-	fb_req.pitches[0] = buffer->pitch;
+	fb_req.pitches[0] = pitch;
 
 	ret = drm_mode_addfb2(client->dev, &fb_req, client->file);
 	if (ret)
@@ -395,15 +395,15 @@ struct drm_client_buffer *
 drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
 {
 	struct drm_client_buffer *buffer;
-	u32 handle;
+	u32 handle, pitch;
 	int ret;
 
 	buffer = drm_client_buffer_create(client, width, height, format,
-					  &handle);
+					  &handle, &pitch);
 	if (IS_ERR(buffer))
 		return buffer;
 
-	ret = drm_client_buffer_addfb(buffer, width, height, format, handle);
+	ret = drm_client_buffer_addfb(buffer, width, height, format, handle, pitch);
 
 	/*
 	 * The handle is only needed for creating the framebuffer, destroy it
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index 3556928d3938..db0665263a10 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -163,11 +163,6 @@ struct drm_client_buffer {
 	 */
 	struct drm_client_dev *client;
 
-	/**
-	 * @pitch: Buffer pitch
-	 */
-	u32 pitch;
-
 	/**
 	 * @gem: GEM object backing this buffer
 	 *
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 2/7] drm/client: Move dumb-buffer handling to drm_client_framebuffer_create()
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
  2025-10-20 15:04 ` [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  2025-10-21 12:47   ` Jocelyn Falempe
  2025-10-20 15:04 ` [PATCH 3/7] drm/client: Inline drm_client_buffer_addfb() and _rmfb() Thomas Zimmermann
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Dumb-buffer creation within the client code is asymetrically balanced
across drm_client_buffer_create() and drm_client_framebuffer_create().
Put all dumb-buffer code into drm_client_framebuffer_create() and leave
client-buffer initialization to drm_client_buffer_create(). Clarifies
responsibility between these functions.

Apart form the architectural improvements, drm_client_buffer_create()
can now be exported if needed by clients. The client will be able to
initialize buffers that have been created from other interfaces than
dumb buffers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_client.c | 56 +++++++++++++++++++-----------------
 1 file changed, 29 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 5fa8a1628563..9bf2edfb7b64 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -184,11 +184,8 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 
 static struct drm_client_buffer *
 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
-			 u32 format, u32 *handle, u32 *pitch)
+			 u32 format, u32 handle, u32 pitch)
 {
-	const struct drm_format_info *info = drm_format_info(format);
-	struct drm_mode_create_dumb dumb_args = { };
-	struct drm_device *dev = client->dev;
 	struct drm_client_buffer *buffer;
 	struct drm_gem_object *obj;
 	int ret;
@@ -199,28 +196,18 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
 
 	buffer->client = client;
 
-	dumb_args.width = width;
-	dumb_args.height = height;
-	dumb_args.bpp = drm_format_info_bpp(info, 0);
-	ret = drm_mode_create_dumb(dev, &dumb_args, client->file);
-	if (ret)
-		goto err_delete;
-
-	obj = drm_gem_object_lookup(client->file, dumb_args.handle);
+	obj = drm_gem_object_lookup(client->file, handle);
 	if (!obj)  {
 		ret = -ENOENT;
 		goto err_delete;
 	}
 
 	buffer->gem = obj;
-	*handle = dumb_args.handle;
-	*pitch = dumb_args.pitch;
 
 	return buffer;
 
 err_delete:
-	drm_client_buffer_delete(buffer);
-
+	kfree(buffer);
 	return ERR_PTR(ret);
 }
 
@@ -394,16 +381,30 @@ static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
 struct drm_client_buffer *
 drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
 {
+	const struct drm_format_info *info = drm_format_info(format);
+	struct drm_device *dev = client->dev;
+	struct drm_mode_create_dumb dumb_args = { };
 	struct drm_client_buffer *buffer;
-	u32 handle, pitch;
 	int ret;
 
+	dumb_args.width = width;
+	dumb_args.height = height;
+	dumb_args.bpp = drm_format_info_bpp(info, 0);
+	ret = drm_mode_create_dumb(dev, &dumb_args, client->file);
+	if (ret)
+		return ERR_PTR(ret);
+
 	buffer = drm_client_buffer_create(client, width, height, format,
-					  &handle, &pitch);
-	if (IS_ERR(buffer))
-		return buffer;
+					  dumb_args.handle, dumb_args.pitch);
+	if (IS_ERR(buffer)) {
+		ret = PTR_ERR(buffer);
+		goto err_drm_mode_destroy_dumb;
+	}
 
-	ret = drm_client_buffer_addfb(buffer, width, height, format, handle, pitch);
+	ret = drm_client_buffer_addfb(buffer, width, height, format,
+				      dumb_args.handle, dumb_args.pitch);
+	if (ret)
+		goto err_drm_client_buffer_delete;
 
 	/*
 	 * The handle is only needed for creating the framebuffer, destroy it
@@ -411,14 +412,15 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
 	 * object as DMA-buf. The framebuffer and our buffer structure are still
 	 * holding references to the GEM object to prevent its destruction.
 	 */
-	drm_mode_destroy_dumb(client->dev, handle, client->file);
-
-	if (ret) {
-		drm_client_buffer_delete(buffer);
-		return ERR_PTR(ret);
-	}
+	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
 
 	return buffer;
+
+err_drm_client_buffer_delete:
+	drm_client_buffer_delete(buffer);
+err_drm_mode_destroy_dumb:
+	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
+	return ERR_PTR(ret);
 }
 EXPORT_SYMBOL(drm_client_framebuffer_create);
 
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 3/7] drm/client: Inline drm_client_buffer_addfb() and _rmfb()
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
  2025-10-20 15:04 ` [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer Thomas Zimmermann
  2025-10-20 15:04 ` [PATCH 2/7] drm/client: Move dumb-buffer handling to drm_client_framebuffer_create() Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  2025-10-21 12:49   ` Jocelyn Falempe
  2025-10-20 15:04 ` [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem Thomas Zimmermann
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Creating and deleting a client buffer always creates and deletes
the underlying DRM framebuffer. Inline the helper functions into
their callers.

With the _addfb code being inlined into drm_client_buffer_create(),
clean up the function's error rollback to release the framebuffer's
handle and GEM buffer object as needed.

Move the _rmfb code into drm_client_buffer_delete() rather than its
current location in drm_client_framebuffer_delete(). The former is
now the inverse of drm_client_buffer_create(). Makes no difference
for cleaning up. Also prepares for the removal of
drm_client_framebuffer_delete().

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_client.c | 93 ++++++++++++++++--------------------
 1 file changed, 40 insertions(+), 53 deletions(-)

diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 9bf2edfb7b64..73ae63f856a0 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -174,6 +174,13 @@ EXPORT_SYMBOL(drm_client_release);
 
 static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 {
+	int ret;
+
+	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);
@@ -186,8 +193,21 @@ static struct drm_client_buffer *
 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
 			 u32 format, u32 handle, u32 pitch)
 {
+	struct drm_mode_fb_cmd2 fb_req = {
+		.width = width,
+		.height = height,
+		.pixel_format = format,
+		.handles = {
+			handle,
+		},
+		.pitches = {
+			pitch,
+		},
+	};
+	struct drm_device *dev = client->dev;
 	struct drm_client_buffer *buffer;
 	struct drm_gem_object *obj;
+	struct drm_framebuffer *fb;
 	int ret;
 
 	buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
@@ -202,10 +222,30 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
 		goto err_delete;
 	}
 
+	ret = drm_mode_addfb2(dev, &fb_req, client->file);
+	if (ret)
+		goto err_drm_gem_object_put;
+
+	fb = drm_framebuffer_lookup(dev, client->file, fb_req.fb_id);
+	if (drm_WARN_ON(dev, !fb)) {
+		ret = -ENOENT;
+		goto err_drm_mode_rmfb;
+	}
+
+	/* drop the reference we picked up in framebuffer lookup */
+	drm_framebuffer_put(fb);
+
+	strscpy(fb->comm, client->name, TASK_COMM_LEN);
+
 	buffer->gem = obj;
+	buffer->fb = fb;
 
 	return buffer;
 
+err_drm_mode_rmfb:
+	drm_mode_rmfb(dev, fb_req.fb_id, client->file);
+err_drm_gem_object_put:
+	drm_gem_object_put(obj);
 err_delete:
 	kfree(buffer);
 	return ERR_PTR(ret);
@@ -319,51 +359,6 @@ void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
 }
 EXPORT_SYMBOL(drm_client_buffer_vunmap);
 
-static void drm_client_buffer_rmfb(struct drm_client_buffer *buffer)
-{
-	int ret;
-
-	if (!buffer->fb)
-		return;
-
-	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);
-
-	buffer->fb = NULL;
-}
-
-static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
-				   u32 width, u32 height, u32 format,
-				   u32 handle, u32 pitch)
-{
-	struct drm_client_dev *client = buffer->client;
-	struct drm_mode_fb_cmd2 fb_req = { };
-	int ret;
-
-	fb_req.width = width;
-	fb_req.height = height;
-	fb_req.pixel_format = format;
-	fb_req.handles[0] = handle;
-	fb_req.pitches[0] = pitch;
-
-	ret = drm_mode_addfb2(client->dev, &fb_req, client->file);
-	if (ret)
-		return ret;
-
-	buffer->fb = drm_framebuffer_lookup(client->dev, buffer->client->file, fb_req.fb_id);
-	if (WARN_ON(!buffer->fb))
-		return -ENOENT;
-
-	/* drop the reference we picked up in framebuffer lookup */
-	drm_framebuffer_put(buffer->fb);
-
-	strscpy(buffer->fb->comm, client->name, TASK_COMM_LEN);
-
-	return 0;
-}
-
 /**
  * drm_client_framebuffer_create - Create a client framebuffer
  * @client: DRM client
@@ -401,11 +396,6 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
 		goto err_drm_mode_destroy_dumb;
 	}
 
-	ret = drm_client_buffer_addfb(buffer, width, height, format,
-				      dumb_args.handle, dumb_args.pitch);
-	if (ret)
-		goto err_drm_client_buffer_delete;
-
 	/*
 	 * The handle is only needed for creating the framebuffer, destroy it
 	 * again to solve a circular dependency should anybody export the GEM
@@ -416,8 +406,6 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
 
 	return buffer;
 
-err_drm_client_buffer_delete:
-	drm_client_buffer_delete(buffer);
 err_drm_mode_destroy_dumb:
 	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
 	return ERR_PTR(ret);
@@ -433,7 +421,6 @@ void drm_client_framebuffer_delete(struct drm_client_buffer *buffer)
 	if (!buffer)
 		return;
 
-	drm_client_buffer_rmfb(buffer);
 	drm_client_buffer_delete(buffer);
 }
 EXPORT_SYMBOL(drm_client_framebuffer_delete);
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
                   ` (2 preceding siblings ...)
  2025-10-20 15:04 ` [PATCH 3/7] drm/client: Inline drm_client_buffer_addfb() and _rmfb() Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  2025-10-21 12:49   ` Jocelyn Falempe
  2025-10-26  9:12   ` kernel test robot
  2025-10-20 15:04 ` [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete() Thomas Zimmermann
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_client.c | 20 ++++++++++++--------
 include/drm/drm_client.h     |  9 +++------
 2 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 73ae63f856a0..29ed5f55b5f9 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -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>
 
@@ -174,17 +175,17 @@ EXPORT_SYMBOL(drm_client_release);
 
 static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 {
+	struct drm_gem_object *gem = drm_gem_fb_get_obj(buffer->fb, 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);
-	}
+	drm_gem_object_put(buffer->gem);
 
 	kfree(buffer);
 }
@@ -274,7 +275,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 = drm_gem_fb_get_obj(buffer->fb, 0);
 	struct iosys_map *map = &buffer->map;
 	int ret;
 
@@ -303,7 +304,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 = drm_gem_fb_get_obj(buffer->fb, 0);
 	struct iosys_map *map = &buffer->map;
 
 	drm_gem_vunmap_locked(gem, map);
@@ -334,9 +335,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 = drm_gem_fb_get_obj(buffer->fb, 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;
@@ -355,7 +357,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 = drm_gem_fb_get_obj(buffer->fb, 0);
+
+	drm_gem_vunmap(gem, &buffer->map);
 }
 EXPORT_SYMBOL(drm_client_buffer_vunmap);
 
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index db0665263a10..5909664d4d43 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -166,12 +166,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;
 
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete()
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
                   ` (3 preceding siblings ...)
  2025-10-20 15:04 ` [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  2025-10-21 12:50   ` Jocelyn Falempe
  2025-10-22  7:00   ` Dan Carpenter
  2025-10-20 15:04 ` [PATCH 6/7] drm/client: Create client buffers with drm_client_buffer_create_dumb() Thomas Zimmermann
  2025-10-20 15:04 ` [PATCH 7/7] drm/client: Flush client buffers with drm_client_buffer_sync() Thomas Zimmermann
  6 siblings, 2 replies; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Release client buffers with drm_client_buffer_delete() instead of
drm_client_framebuffer_delete(). The latter is just a tiny wrapper
around the former.

Move the test for !buffer into drm_client_buffer_delete(), although
all callers appear to always have a valid pointer.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/clients/drm_log.c |  4 ++--
 drivers/gpu/drm/drm_client.c      | 25 ++++++++++---------------
 drivers/gpu/drm/drm_fbdev_dma.c   |  6 +++---
 drivers/gpu/drm/drm_fbdev_shmem.c |  4 ++--
 drivers/gpu/drm/drm_fbdev_ttm.c   |  8 ++++----
 include/drm/drm_client.h          |  2 +-
 6 files changed, 22 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
index fd8556dd58ed..2d748ab318fe 100644
--- a/drivers/gpu/drm/clients/drm_log.c
+++ b/drivers/gpu/drm/clients/drm_log.c
@@ -272,7 +272,7 @@ static void drm_log_init_client(struct drm_log *dlog)
 
 err_failed_commit:
 	for (i = 0; i < n_modeset; i++)
-		drm_client_framebuffer_delete(dlog->scanout[i].buffer);
+		drm_client_buffer_delete(dlog->scanout[i].buffer);
 
 err_nomodeset:
 	kfree(dlog->scanout);
@@ -286,7 +286,7 @@ static void drm_log_free_scanout(struct drm_client_dev *client)
 
 	if (dlog->n_scanout) {
 		for (i = 0; i < dlog->n_scanout; i++)
-			drm_client_framebuffer_delete(dlog->scanout[i].buffer);
+			drm_client_buffer_delete(dlog->scanout[i].buffer);
 		dlog->n_scanout = 0;
 		kfree(dlog->scanout);
 		dlog->scanout = NULL;
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 29ed5f55b5f9..d4c424ff44a9 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -173,11 +173,18 @@ void drm_client_release(struct drm_client_dev *client)
 }
 EXPORT_SYMBOL(drm_client_release);
 
-static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
+/**
+ * drm_client_buffer_delete - Delete a client buffer
+ * @buffer: DRM client buffer
+ */
+void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 {
 	struct drm_gem_object *gem = drm_gem_fb_get_obj(buffer->fb, 0);
 	int ret;
 
+	if (!buffer)
+		return;
+
 	drm_gem_vunmap(gem, &buffer->map);
 
 	ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
@@ -189,6 +196,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 
 	kfree(buffer);
 }
+EXPORT_SYMBOL(drm_client_buffer_delete);
 
 static struct drm_client_buffer *
 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
@@ -372,7 +380,7 @@ EXPORT_SYMBOL(drm_client_buffer_vunmap);
  *
  * This function creates a &drm_client_buffer which consists of a
  * &drm_framebuffer backed by a dumb buffer.
- * Call drm_client_framebuffer_delete() to free the buffer.
+ * Call drm_client_buffer_delete() to free the buffer.
  *
  * Returns:
  * Pointer to a client buffer or an error pointer on failure.
@@ -416,19 +424,6 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
 }
 EXPORT_SYMBOL(drm_client_framebuffer_create);
 
-/**
- * drm_client_framebuffer_delete - Delete a client framebuffer
- * @buffer: DRM client buffer (can be NULL)
- */
-void drm_client_framebuffer_delete(struct drm_client_buffer *buffer)
-{
-	if (!buffer)
-		return;
-
-	drm_client_buffer_delete(buffer);
-}
-EXPORT_SYMBOL(drm_client_framebuffer_delete);
-
 /**
  * drm_client_framebuffer_flush - Manually flush client framebuffer
  * @buffer: DRM client buffer (can be NULL)
diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 8bd626ef16c7..17fef288e86b 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -55,7 +55,7 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
 	drm_fb_helper_fini(fb_helper);
 
 	drm_client_buffer_vunmap(fb_helper->buffer);
-	drm_client_framebuffer_delete(fb_helper->buffer);
+	drm_client_buffer_delete(fb_helper->buffer);
 	drm_client_release(&fb_helper->client);
 	drm_fb_helper_unprepare(fb_helper);
 	kfree(fb_helper);
@@ -90,7 +90,7 @@ static void drm_fbdev_dma_shadowed_fb_destroy(struct fb_info *info)
 	vfree(shadow);
 
 	drm_client_buffer_vunmap(fb_helper->buffer);
-	drm_client_framebuffer_delete(fb_helper->buffer);
+	drm_client_buffer_delete(fb_helper->buffer);
 	drm_client_release(&fb_helper->client);
 	drm_fb_helper_unprepare(fb_helper);
 	kfree(fb_helper);
@@ -328,7 +328,7 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	fb_helper->buffer = NULL;
 	drm_client_buffer_vunmap(buffer);
 err_drm_client_buffer_delete:
-	drm_client_framebuffer_delete(buffer);
+	drm_client_buffer_delete(buffer);
 	return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
index 1e827bf8b815..f7966b8c51cd 100644
--- a/drivers/gpu/drm/drm_fbdev_shmem.c
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -63,7 +63,7 @@ static void drm_fbdev_shmem_fb_destroy(struct fb_info *info)
 	drm_fb_helper_fini(fb_helper);
 
 	drm_client_buffer_vunmap(fb_helper->buffer);
-	drm_client_framebuffer_delete(fb_helper->buffer);
+	drm_client_buffer_delete(fb_helper->buffer);
 	drm_client_release(&fb_helper->client);
 	drm_fb_helper_unprepare(fb_helper);
 	kfree(fb_helper);
@@ -206,7 +206,7 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	fb_helper->buffer = NULL;
 	drm_client_buffer_vunmap(buffer);
 err_drm_client_buffer_delete:
-	drm_client_framebuffer_delete(buffer);
+	drm_client_buffer_delete(buffer);
 	return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
index 85feb55bba11..54f9a46b96c2 100644
--- a/drivers/gpu/drm/drm_fbdev_ttm.c
+++ b/drivers/gpu/drm/drm_fbdev_ttm.c
@@ -50,7 +50,7 @@ static void drm_fbdev_ttm_fb_destroy(struct fb_info *info)
 	fb_deferred_io_cleanup(info);
 	drm_fb_helper_fini(fb_helper);
 	vfree(shadow);
-	drm_client_framebuffer_delete(fb_helper->buffer);
+	drm_client_buffer_delete(fb_helper->buffer);
 
 	drm_client_release(&fb_helper->client);
 	drm_fb_helper_unprepare(fb_helper);
@@ -202,7 +202,7 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	screen_buffer = vzalloc(screen_size);
 	if (!screen_buffer) {
 		ret = -ENOMEM;
-		goto err_drm_client_framebuffer_delete;
+		goto err_drm_client_buffer_delete;
 	}
 
 	info = drm_fb_helper_alloc_info(fb_helper);
@@ -235,10 +235,10 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	drm_fb_helper_release_info(fb_helper);
 err_vfree:
 	vfree(screen_buffer);
-err_drm_client_framebuffer_delete:
+err_drm_client_buffer_delete:
 	fb_helper->fb = NULL;
 	fb_helper->buffer = NULL;
-	drm_client_framebuffer_delete(buffer);
+	drm_client_buffer_delete(buffer);
 	return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_ttm_driver_fbdev_probe);
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index 5909664d4d43..6019f2712448 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -185,7 +185,7 @@ struct drm_client_buffer {
 
 struct drm_client_buffer *
 drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
-void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);
+void drm_client_buffer_delete(struct drm_client_buffer *buffer);
 int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect);
 int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
 				 struct iosys_map *map_copy);
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 6/7] drm/client: Create client buffers with drm_client_buffer_create_dumb()
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
                   ` (4 preceding siblings ...)
  2025-10-20 15:04 ` [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete() Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  2025-10-21 12:54   ` Jocelyn Falempe
  2025-10-20 15:04 ` [PATCH 7/7] drm/client: Flush client buffers with drm_client_buffer_sync() Thomas Zimmermann
  6 siblings, 1 reply; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Rename drm_client_framebuffer_create() to drm_client_buffer_create_dump()
and adapt callers. The new name reflects the function's purpose. Using
dumb buffers is the easiest way for creating a GEM buffer in a drivers-
independent way.

There's also drm_client_buffer_create(), which creates the client buffer
from a preexisting buffer object. This helper can be exported for drivers
that create their own GEM buffer object.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/clients/drm_log.c | 2 +-
 drivers/gpu/drm/drm_client.c      | 6 +++---
 drivers/gpu/drm/drm_fbdev_dma.c   | 2 +-
 drivers/gpu/drm/drm_fbdev_shmem.c | 2 +-
 drivers/gpu/drm/drm_fbdev_ttm.c   | 2 +-
 include/drm/drm_client.h          | 2 +-
 6 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
index 2d748ab318fe..b8fb9ee9fcf0 100644
--- a/drivers/gpu/drm/clients/drm_log.c
+++ b/drivers/gpu/drm/clients/drm_log.c
@@ -204,7 +204,7 @@ static int drm_log_setup_modeset(struct drm_client_dev *client,
 	if (format == DRM_FORMAT_INVALID)
 		return -EINVAL;
 
-	scanout->buffer = drm_client_framebuffer_create(client, width, height, format);
+	scanout->buffer = drm_client_buffer_create_dumb(client, width, height, format);
 	if (IS_ERR(scanout->buffer)) {
 		drm_warn(client->dev, "drm_log can't create framebuffer %d %d %p4cc\n",
 			 width, height, &format);
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index d4c424ff44a9..9105a0b5f468 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -372,7 +372,7 @@ void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
 EXPORT_SYMBOL(drm_client_buffer_vunmap);
 
 /**
- * drm_client_framebuffer_create - Create a client framebuffer
+ * drm_client_buffer_create_dumb - Create a client buffer backed by a dumb buffer
  * @client: DRM client
  * @width: Framebuffer width
  * @height: Framebuffer height
@@ -386,7 +386,7 @@ EXPORT_SYMBOL(drm_client_buffer_vunmap);
  * Pointer to a client buffer or an error pointer on failure.
  */
 struct drm_client_buffer *
-drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
+drm_client_buffer_create_dumb(struct drm_client_dev *client, u32 width, u32 height, u32 format)
 {
 	const struct drm_format_info *info = drm_format_info(format);
 	struct drm_device *dev = client->dev;
@@ -422,7 +422,7 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
 	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
 	return ERR_PTR(ret);
 }
-EXPORT_SYMBOL(drm_client_framebuffer_create);
+EXPORT_SYMBOL(drm_client_buffer_create_dumb);
 
 /**
  * drm_client_framebuffer_flush - Manually flush client framebuffer
diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 17fef288e86b..7d4e557d6a5d 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -285,7 +285,7 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 
 	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
 					     sizes->surface_depth);
-	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
+	buffer = drm_client_buffer_create_dumb(client, sizes->surface_width,
 					       sizes->surface_height, format);
 	if (IS_ERR(buffer))
 		return PTR_ERR(buffer);
diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
index f7966b8c51cd..b9e48a0bd39f 100644
--- a/drivers/gpu/drm/drm_fbdev_shmem.c
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -149,7 +149,7 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 		    sizes->surface_bpp);
 
 	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp, sizes->surface_depth);
-	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
+	buffer = drm_client_buffer_create_dumb(client, sizes->surface_width,
 					       sizes->surface_height, format);
 	if (IS_ERR(buffer))
 		return PTR_ERR(buffer);
diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
index 54f9a46b96c2..b1188692399a 100644
--- a/drivers/gpu/drm/drm_fbdev_ttm.c
+++ b/drivers/gpu/drm/drm_fbdev_ttm.c
@@ -189,7 +189,7 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 
 	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
 					     sizes->surface_depth);
-	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
+	buffer = drm_client_buffer_create_dumb(client, sizes->surface_width,
 					       sizes->surface_height, format);
 	if (IS_ERR(buffer))
 		return PTR_ERR(buffer);
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index 6019f2712448..e4df404a9645 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -184,7 +184,7 @@ struct drm_client_buffer {
 };
 
 struct drm_client_buffer *
-drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
+drm_client_buffer_create_dumb(struct drm_client_dev *client, u32 width, u32 height, u32 format);
 void drm_client_buffer_delete(struct drm_client_buffer *buffer);
 int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect);
 int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 7/7] drm/client: Flush client buffers with drm_client_buffer_sync()
  2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
                   ` (5 preceding siblings ...)
  2025-10-20 15:04 ` [PATCH 6/7] drm/client: Create client buffers with drm_client_buffer_create_dumb() Thomas Zimmermann
@ 2025-10-20 15:04 ` Thomas Zimmermann
  6 siblings, 0 replies; 16+ messages in thread
From: Thomas Zimmermann @ 2025-10-20 15:04 UTC (permalink / raw)
  To: jfalempe, javierm, rrameshbabu, maarten.lankhorst, mripard,
	airlied, simona
  Cc: dri-devel, Thomas Zimmermann

Rename drm_client_framebuffer_flush() to drm_cient_buffer_flush() and
adapt its callers. The old name was left over from previous naming
conventions.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/clients/drm_log.c | 4 ++--
 drivers/gpu/drm/drm_client.c      | 8 ++++----
 include/drm/drm_client.h          | 2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
index b8fb9ee9fcf0..3d4174c0d344 100644
--- a/drivers/gpu/drm/clients/drm_log.c
+++ b/drivers/gpu/drm/clients/drm_log.c
@@ -100,7 +100,7 @@ static void drm_log_clear_line(struct drm_log_scanout *scanout, u32 line)
 		return;
 	iosys_map_memset(&map, r.y1 * fb->pitches[0], 0, height * fb->pitches[0]);
 	drm_client_buffer_vunmap_local(scanout->buffer);
-	drm_client_framebuffer_flush(scanout->buffer, &r);
+	drm_client_buffer_flush(scanout->buffer, &r);
 }
 
 static void drm_log_draw_line(struct drm_log_scanout *scanout, const char *s,
@@ -133,7 +133,7 @@ static void drm_log_draw_line(struct drm_log_scanout *scanout, const char *s,
 	if (scanout->line >= scanout->rows)
 		scanout->line = 0;
 	drm_client_buffer_vunmap_local(scanout->buffer);
-	drm_client_framebuffer_flush(scanout->buffer, &r);
+	drm_client_buffer_flush(scanout->buffer, &r);
 }
 
 static void drm_log_draw_new_line(struct drm_log_scanout *scanout,
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 9105a0b5f468..1f1e73d3b026 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -425,8 +425,8 @@ drm_client_buffer_create_dumb(struct drm_client_dev *client, u32 width, u32 heig
 EXPORT_SYMBOL(drm_client_buffer_create_dumb);
 
 /**
- * drm_client_framebuffer_flush - Manually flush client framebuffer
- * @buffer: DRM client buffer (can be NULL)
+ * drm_client_buffer_flush - Manually flush client buffer
+ * @buffer: DRM client buffer
  * @rect: Damage rectangle (if NULL flushes all)
  *
  * This calls &drm_framebuffer_funcs->dirty (if present) to flush buffer changes
@@ -435,7 +435,7 @@ EXPORT_SYMBOL(drm_client_buffer_create_dumb);
  * Returns:
  * Zero on success or negative error code on failure.
  */
-int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect)
+int drm_client_buffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect)
 {
 	if (!buffer || !buffer->fb || !buffer->fb->funcs->dirty)
 		return 0;
@@ -455,4 +455,4 @@ int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_re
 	return buffer->fb->funcs->dirty(buffer->fb, buffer->client->file,
 					0, 0, NULL, 0);
 }
-EXPORT_SYMBOL(drm_client_framebuffer_flush);
+EXPORT_SYMBOL(drm_client_buffer_flush);
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index e4df404a9645..eab4a51f8e79 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -186,7 +186,7 @@ struct drm_client_buffer {
 struct drm_client_buffer *
 drm_client_buffer_create_dumb(struct drm_client_dev *client, u32 width, u32 height, u32 format);
 void drm_client_buffer_delete(struct drm_client_buffer *buffer);
-int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect);
+int drm_client_buffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect);
 int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
 				 struct iosys_map *map_copy);
 void drm_client_buffer_vunmap_local(struct drm_client_buffer *buffer);
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer
  2025-10-20 15:04 ` [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer Thomas Zimmermann
@ 2025-10-21 12:44   ` Jocelyn Falempe
  0 siblings, 0 replies; 16+ messages in thread
From: Jocelyn Falempe @ 2025-10-21 12:44 UTC (permalink / raw)
  To: Thomas Zimmermann, javierm, rrameshbabu, maarten.lankhorst,
	mripard, airlied, simona
  Cc: dri-devel

On 20/10/2025 17:04, Thomas Zimmermann wrote:
> Only the client-buffer setup uses the pitch field from struct
> drm_client_buffer. Remove the field and pass the value among setup
> helpers.
> 
> Clients that need the pitch should rather look at the framebuffer's
> pitches[0] directly.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/drm_client.c | 14 +++++++-------
>   include/drm/drm_client.h     |  5 -----
>   2 files changed, 7 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index 3fa38d4ac70b..5fa8a1628563 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -184,7 +184,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
>   
>   static struct drm_client_buffer *
>   drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
> -			 u32 format, u32 *handle)
> +			 u32 format, u32 *handle, u32 *pitch)
>   {
>   	const struct drm_format_info *info = drm_format_info(format);
>   	struct drm_mode_create_dumb dumb_args = { };
> @@ -212,9 +212,9 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
>   		goto err_delete;
>   	}
>   
> -	buffer->pitch = dumb_args.pitch;
>   	buffer->gem = obj;
>   	*handle = dumb_args.handle;
> +	*pitch = dumb_args.pitch;
>   
>   	return buffer;
>   
> @@ -349,7 +349,7 @@ static void drm_client_buffer_rmfb(struct drm_client_buffer *buffer)
>   
>   static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
>   				   u32 width, u32 height, u32 format,
> -				   u32 handle)
> +				   u32 handle, u32 pitch)
>   {
>   	struct drm_client_dev *client = buffer->client;
>   	struct drm_mode_fb_cmd2 fb_req = { };
> @@ -359,7 +359,7 @@ static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
>   	fb_req.height = height;
>   	fb_req.pixel_format = format;
>   	fb_req.handles[0] = handle;
> -	fb_req.pitches[0] = buffer->pitch;
> +	fb_req.pitches[0] = pitch;
>   
>   	ret = drm_mode_addfb2(client->dev, &fb_req, client->file);
>   	if (ret)
> @@ -395,15 +395,15 @@ struct drm_client_buffer *
>   drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
>   {
>   	struct drm_client_buffer *buffer;
> -	u32 handle;
> +	u32 handle, pitch;
>   	int ret;
>   
>   	buffer = drm_client_buffer_create(client, width, height, format,
> -					  &handle);
> +					  &handle, &pitch);
>   	if (IS_ERR(buffer))
>   		return buffer;
>   
> -	ret = drm_client_buffer_addfb(buffer, width, height, format, handle);
> +	ret = drm_client_buffer_addfb(buffer, width, height, format, handle, pitch);
>   
>   	/*
>   	 * The handle is only needed for creating the framebuffer, destroy it
> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
> index 3556928d3938..db0665263a10 100644
> --- a/include/drm/drm_client.h
> +++ b/include/drm/drm_client.h
> @@ -163,11 +163,6 @@ struct drm_client_buffer {
>   	 */
>   	struct drm_client_dev *client;
>   
> -	/**
> -	 * @pitch: Buffer pitch
> -	 */
> -	u32 pitch;
> -
>   	/**
>   	 * @gem: GEM object backing this buffer
>   	 *


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/7] drm/client: Move dumb-buffer handling to drm_client_framebuffer_create()
  2025-10-20 15:04 ` [PATCH 2/7] drm/client: Move dumb-buffer handling to drm_client_framebuffer_create() Thomas Zimmermann
@ 2025-10-21 12:47   ` Jocelyn Falempe
  0 siblings, 0 replies; 16+ messages in thread
From: Jocelyn Falempe @ 2025-10-21 12:47 UTC (permalink / raw)
  To: Thomas Zimmermann, javierm, rrameshbabu, maarten.lankhorst,
	mripard, airlied, simona
  Cc: dri-devel

On 20/10/2025 17:04, Thomas Zimmermann wrote:
> Dumb-buffer creation within the client code is asymetrically balanced
> across drm_client_buffer_create() and drm_client_framebuffer_create().
> Put all dumb-buffer code into drm_client_framebuffer_create() and leave
> client-buffer initialization to drm_client_buffer_create(). Clarifies
> responsibility between these functions.
> 
> Apart form the architectural improvements, drm_client_buffer_create()
> can now be exported if needed by clients. The client will be able to
> initialize buffers that have been created from other interfaces than
> dumb buffers.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/drm_client.c | 56 +++++++++++++++++++-----------------
>   1 file changed, 29 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index 5fa8a1628563..9bf2edfb7b64 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -184,11 +184,8 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
>   
>   static struct drm_client_buffer *
>   drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
> -			 u32 format, u32 *handle, u32 *pitch)
> +			 u32 format, u32 handle, u32 pitch)
>   {
> -	const struct drm_format_info *info = drm_format_info(format);
> -	struct drm_mode_create_dumb dumb_args = { };
> -	struct drm_device *dev = client->dev;
>   	struct drm_client_buffer *buffer;
>   	struct drm_gem_object *obj;
>   	int ret;
> @@ -199,28 +196,18 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
>   
>   	buffer->client = client;
>   
> -	dumb_args.width = width;
> -	dumb_args.height = height;
> -	dumb_args.bpp = drm_format_info_bpp(info, 0);
> -	ret = drm_mode_create_dumb(dev, &dumb_args, client->file);
> -	if (ret)
> -		goto err_delete;
> -
> -	obj = drm_gem_object_lookup(client->file, dumb_args.handle);
> +	obj = drm_gem_object_lookup(client->file, handle);
>   	if (!obj)  {
>   		ret = -ENOENT;
>   		goto err_delete;
>   	}
>   
>   	buffer->gem = obj;
> -	*handle = dumb_args.handle;
> -	*pitch = dumb_args.pitch;
>   
>   	return buffer;
>   
>   err_delete:
> -	drm_client_buffer_delete(buffer);
> -
> +	kfree(buffer);
>   	return ERR_PTR(ret);
>   }
>   
> @@ -394,16 +381,30 @@ static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
>   struct drm_client_buffer *
>   drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
>   {
> +	const struct drm_format_info *info = drm_format_info(format);
> +	struct drm_device *dev = client->dev;
> +	struct drm_mode_create_dumb dumb_args = { };
>   	struct drm_client_buffer *buffer;
> -	u32 handle, pitch;
>   	int ret;
>   
> +	dumb_args.width = width;
> +	dumb_args.height = height;
> +	dumb_args.bpp = drm_format_info_bpp(info, 0);
> +	ret = drm_mode_create_dumb(dev, &dumb_args, client->file);
> +	if (ret)
> +		return ERR_PTR(ret);
> +
>   	buffer = drm_client_buffer_create(client, width, height, format,
> -					  &handle, &pitch);
> -	if (IS_ERR(buffer))
> -		return buffer;
> +					  dumb_args.handle, dumb_args.pitch);
> +	if (IS_ERR(buffer)) {
> +		ret = PTR_ERR(buffer);
> +		goto err_drm_mode_destroy_dumb;
> +	}
>   
> -	ret = drm_client_buffer_addfb(buffer, width, height, format, handle, pitch);
> +	ret = drm_client_buffer_addfb(buffer, width, height, format,
> +				      dumb_args.handle, dumb_args.pitch);
> +	if (ret)
> +		goto err_drm_client_buffer_delete;
>   
>   	/*
>   	 * The handle is only needed for creating the framebuffer, destroy it
> @@ -411,14 +412,15 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
>   	 * object as DMA-buf. The framebuffer and our buffer structure are still
>   	 * holding references to the GEM object to prevent its destruction.
>   	 */
> -	drm_mode_destroy_dumb(client->dev, handle, client->file);
> -
> -	if (ret) {
> -		drm_client_buffer_delete(buffer);
> -		return ERR_PTR(ret);
> -	}
> +	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
>   
>   	return buffer;
> +
> +err_drm_client_buffer_delete:
> +	drm_client_buffer_delete(buffer);
> +err_drm_mode_destroy_dumb:
> +	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
> +	return ERR_PTR(ret);
>   }
>   EXPORT_SYMBOL(drm_client_framebuffer_create);
>   


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/7] drm/client: Inline drm_client_buffer_addfb() and _rmfb()
  2025-10-20 15:04 ` [PATCH 3/7] drm/client: Inline drm_client_buffer_addfb() and _rmfb() Thomas Zimmermann
@ 2025-10-21 12:49   ` Jocelyn Falempe
  0 siblings, 0 replies; 16+ messages in thread
From: Jocelyn Falempe @ 2025-10-21 12:49 UTC (permalink / raw)
  To: Thomas Zimmermann, javierm, rrameshbabu, maarten.lankhorst,
	mripard, airlied, simona
  Cc: dri-devel

On 20/10/2025 17:04, Thomas Zimmermann wrote:
> Creating and deleting a client buffer always creates and deletes
> the underlying DRM framebuffer. Inline the helper functions into
> their callers.
> 
> With the _addfb code being inlined into drm_client_buffer_create(),
> clean up the function's error rollback to release the framebuffer's
> handle and GEM buffer object as needed.
> 
> Move the _rmfb code into drm_client_buffer_delete() rather than its
> current location in drm_client_framebuffer_delete(). The former is
> now the inverse of drm_client_buffer_create(). Makes no difference
> for cleaning up. Also prepares for the removal of
> drm_client_framebuffer_delete().

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>


> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/drm_client.c | 93 ++++++++++++++++--------------------
>   1 file changed, 40 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index 9bf2edfb7b64..73ae63f856a0 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -174,6 +174,13 @@ EXPORT_SYMBOL(drm_client_release);
>   
>   static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
>   {
> +	int ret;
> +
> +	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);
> @@ -186,8 +193,21 @@ static struct drm_client_buffer *
>   drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
>   			 u32 format, u32 handle, u32 pitch)
>   {
> +	struct drm_mode_fb_cmd2 fb_req = {
> +		.width = width,
> +		.height = height,
> +		.pixel_format = format,
> +		.handles = {
> +			handle,
> +		},
> +		.pitches = {
> +			pitch,
> +		},
> +	};
> +	struct drm_device *dev = client->dev;
>   	struct drm_client_buffer *buffer;
>   	struct drm_gem_object *obj;
> +	struct drm_framebuffer *fb;
>   	int ret;
>   
>   	buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
> @@ -202,10 +222,30 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
>   		goto err_delete;
>   	}
>   
> +	ret = drm_mode_addfb2(dev, &fb_req, client->file);
> +	if (ret)
> +		goto err_drm_gem_object_put;
> +
> +	fb = drm_framebuffer_lookup(dev, client->file, fb_req.fb_id);
> +	if (drm_WARN_ON(dev, !fb)) {
> +		ret = -ENOENT;
> +		goto err_drm_mode_rmfb;
> +	}
> +
> +	/* drop the reference we picked up in framebuffer lookup */
> +	drm_framebuffer_put(fb);
> +
> +	strscpy(fb->comm, client->name, TASK_COMM_LEN);
> +
>   	buffer->gem = obj;
> +	buffer->fb = fb;
>   
>   	return buffer;
>   
> +err_drm_mode_rmfb:
> +	drm_mode_rmfb(dev, fb_req.fb_id, client->file);
> +err_drm_gem_object_put:
> +	drm_gem_object_put(obj);
>   err_delete:
>   	kfree(buffer);
>   	return ERR_PTR(ret);
> @@ -319,51 +359,6 @@ void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
>   }
>   EXPORT_SYMBOL(drm_client_buffer_vunmap);
>   
> -static void drm_client_buffer_rmfb(struct drm_client_buffer *buffer)
> -{
> -	int ret;
> -
> -	if (!buffer->fb)
> -		return;
> -
> -	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);
> -
> -	buffer->fb = NULL;
> -}
> -
> -static int drm_client_buffer_addfb(struct drm_client_buffer *buffer,
> -				   u32 width, u32 height, u32 format,
> -				   u32 handle, u32 pitch)
> -{
> -	struct drm_client_dev *client = buffer->client;
> -	struct drm_mode_fb_cmd2 fb_req = { };
> -	int ret;
> -
> -	fb_req.width = width;
> -	fb_req.height = height;
> -	fb_req.pixel_format = format;
> -	fb_req.handles[0] = handle;
> -	fb_req.pitches[0] = pitch;
> -
> -	ret = drm_mode_addfb2(client->dev, &fb_req, client->file);
> -	if (ret)
> -		return ret;
> -
> -	buffer->fb = drm_framebuffer_lookup(client->dev, buffer->client->file, fb_req.fb_id);
> -	if (WARN_ON(!buffer->fb))
> -		return -ENOENT;
> -
> -	/* drop the reference we picked up in framebuffer lookup */
> -	drm_framebuffer_put(buffer->fb);
> -
> -	strscpy(buffer->fb->comm, client->name, TASK_COMM_LEN);
> -
> -	return 0;
> -}
> -
>   /**
>    * drm_client_framebuffer_create - Create a client framebuffer
>    * @client: DRM client
> @@ -401,11 +396,6 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
>   		goto err_drm_mode_destroy_dumb;
>   	}
>   
> -	ret = drm_client_buffer_addfb(buffer, width, height, format,
> -				      dumb_args.handle, dumb_args.pitch);
> -	if (ret)
> -		goto err_drm_client_buffer_delete;
> -
>   	/*
>   	 * The handle is only needed for creating the framebuffer, destroy it
>   	 * again to solve a circular dependency should anybody export the GEM
> @@ -416,8 +406,6 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
>   
>   	return buffer;
>   
> -err_drm_client_buffer_delete:
> -	drm_client_buffer_delete(buffer);
>   err_drm_mode_destroy_dumb:
>   	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
>   	return ERR_PTR(ret);
> @@ -433,7 +421,6 @@ void drm_client_framebuffer_delete(struct drm_client_buffer *buffer)
>   	if (!buffer)
>   		return;
>   
> -	drm_client_buffer_rmfb(buffer);
>   	drm_client_buffer_delete(buffer);
>   }
>   EXPORT_SYMBOL(drm_client_framebuffer_delete);


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem
  2025-10-20 15:04 ` [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem Thomas Zimmermann
@ 2025-10-21 12:49   ` Jocelyn Falempe
  2025-10-26  9:12   ` kernel test robot
  1 sibling, 0 replies; 16+ messages in thread
From: Jocelyn Falempe @ 2025-10-21 12:49 UTC (permalink / raw)
  To: Thomas Zimmermann, javierm, rrameshbabu, maarten.lankhorst,
	mripard, airlied, simona
  Cc: dri-devel

On 20/10/2025 17:04, Thomas Zimmermann wrote:
> 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.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>


> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/drm_client.c | 20 ++++++++++++--------
>   include/drm/drm_client.h     |  9 +++------
>   2 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index 73ae63f856a0..29ed5f55b5f9 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -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>
>   
> @@ -174,17 +175,17 @@ EXPORT_SYMBOL(drm_client_release);
>   
>   static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
>   {
> +	struct drm_gem_object *gem = drm_gem_fb_get_obj(buffer->fb, 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);
> -	}
> +	drm_gem_object_put(buffer->gem);
>   
>   	kfree(buffer);
>   }
> @@ -274,7 +275,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 = drm_gem_fb_get_obj(buffer->fb, 0);
>   	struct iosys_map *map = &buffer->map;
>   	int ret;
>   
> @@ -303,7 +304,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 = drm_gem_fb_get_obj(buffer->fb, 0);
>   	struct iosys_map *map = &buffer->map;
>   
>   	drm_gem_vunmap_locked(gem, map);
> @@ -334,9 +335,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 = drm_gem_fb_get_obj(buffer->fb, 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;
> @@ -355,7 +357,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 = drm_gem_fb_get_obj(buffer->fb, 0);
> +
> +	drm_gem_vunmap(gem, &buffer->map);
>   }
>   EXPORT_SYMBOL(drm_client_buffer_vunmap);
>   
> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
> index db0665263a10..5909664d4d43 100644
> --- a/include/drm/drm_client.h
> +++ b/include/drm/drm_client.h
> @@ -166,12 +166,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;
>   


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete()
  2025-10-20 15:04 ` [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete() Thomas Zimmermann
@ 2025-10-21 12:50   ` Jocelyn Falempe
  2025-10-22  7:00   ` Dan Carpenter
  1 sibling, 0 replies; 16+ messages in thread
From: Jocelyn Falempe @ 2025-10-21 12:50 UTC (permalink / raw)
  To: Thomas Zimmermann, javierm, rrameshbabu, maarten.lankhorst,
	mripard, airlied, simona
  Cc: dri-devel

On 20/10/2025 17:04, Thomas Zimmermann wrote:
> Release client buffers with drm_client_buffer_delete() instead of
> drm_client_framebuffer_delete(). The latter is just a tiny wrapper
> around the former.
> 
> Move the test for !buffer into drm_client_buffer_delete(), although
> all callers appear to always have a valid pointer.


A minor issue below, with that fixed:

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>


> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/clients/drm_log.c |  4 ++--
>   drivers/gpu/drm/drm_client.c      | 25 ++++++++++---------------
>   drivers/gpu/drm/drm_fbdev_dma.c   |  6 +++---
>   drivers/gpu/drm/drm_fbdev_shmem.c |  4 ++--
>   drivers/gpu/drm/drm_fbdev_ttm.c   |  8 ++++----
>   include/drm/drm_client.h          |  2 +-
>   6 files changed, 22 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
> index fd8556dd58ed..2d748ab318fe 100644
> --- a/drivers/gpu/drm/clients/drm_log.c
> +++ b/drivers/gpu/drm/clients/drm_log.c
> @@ -272,7 +272,7 @@ static void drm_log_init_client(struct drm_log *dlog)
>   
>   err_failed_commit:
>   	for (i = 0; i < n_modeset; i++)
> -		drm_client_framebuffer_delete(dlog->scanout[i].buffer);
> +		drm_client_buffer_delete(dlog->scanout[i].buffer);
>   
>   err_nomodeset:
>   	kfree(dlog->scanout);
> @@ -286,7 +286,7 @@ static void drm_log_free_scanout(struct drm_client_dev *client)
>   
>   	if (dlog->n_scanout) {
>   		for (i = 0; i < dlog->n_scanout; i++)
> -			drm_client_framebuffer_delete(dlog->scanout[i].buffer);
> +			drm_client_buffer_delete(dlog->scanout[i].buffer);
>   		dlog->n_scanout = 0;
>   		kfree(dlog->scanout);
>   		dlog->scanout = NULL;
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index 29ed5f55b5f9..d4c424ff44a9 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -173,11 +173,18 @@ void drm_client_release(struct drm_client_dev *client)
>   }
>   EXPORT_SYMBOL(drm_client_release);
>   
> -static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
> +/**
> + * drm_client_buffer_delete - Delete a client buffer
> + * @buffer: DRM client buffer
> + */
> +void drm_client_buffer_delete(struct drm_client_buffer *buffer)
>   {
>   	struct drm_gem_object *gem = drm_gem_fb_get_obj(buffer->fb, 0);
>   	int ret;
>   
> +	if (!buffer)
> +		return;
> +

It's too late to check, as you already used buffer->fb in the previous line.

>   	drm_gem_vunmap(gem, &buffer->map);
>   
>   	ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
> @@ -189,6 +196,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
>   
>   	kfree(buffer);
>   }
> +EXPORT_SYMBOL(drm_client_buffer_delete);
>   
>   static struct drm_client_buffer *
>   drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height,
> @@ -372,7 +380,7 @@ EXPORT_SYMBOL(drm_client_buffer_vunmap);
>    *
>    * This function creates a &drm_client_buffer which consists of a
>    * &drm_framebuffer backed by a dumb buffer.
> - * Call drm_client_framebuffer_delete() to free the buffer.
> + * Call drm_client_buffer_delete() to free the buffer.
>    *
>    * Returns:
>    * Pointer to a client buffer or an error pointer on failure.
> @@ -416,19 +424,6 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
>   }
>   EXPORT_SYMBOL(drm_client_framebuffer_create);
>   
> -/**
> - * drm_client_framebuffer_delete - Delete a client framebuffer
> - * @buffer: DRM client buffer (can be NULL)
> - */
> -void drm_client_framebuffer_delete(struct drm_client_buffer *buffer)
> -{
> -	if (!buffer)
> -		return;
> -
> -	drm_client_buffer_delete(buffer);
> -}
> -EXPORT_SYMBOL(drm_client_framebuffer_delete);
> -
>   /**
>    * drm_client_framebuffer_flush - Manually flush client framebuffer
>    * @buffer: DRM client buffer (can be NULL)
> diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
> index 8bd626ef16c7..17fef288e86b 100644
> --- a/drivers/gpu/drm/drm_fbdev_dma.c
> +++ b/drivers/gpu/drm/drm_fbdev_dma.c
> @@ -55,7 +55,7 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
>   	drm_fb_helper_fini(fb_helper);
>   
>   	drm_client_buffer_vunmap(fb_helper->buffer);
> -	drm_client_framebuffer_delete(fb_helper->buffer);
> +	drm_client_buffer_delete(fb_helper->buffer);
>   	drm_client_release(&fb_helper->client);
>   	drm_fb_helper_unprepare(fb_helper);
>   	kfree(fb_helper);
> @@ -90,7 +90,7 @@ static void drm_fbdev_dma_shadowed_fb_destroy(struct fb_info *info)
>   	vfree(shadow);
>   
>   	drm_client_buffer_vunmap(fb_helper->buffer);
> -	drm_client_framebuffer_delete(fb_helper->buffer);
> +	drm_client_buffer_delete(fb_helper->buffer);
>   	drm_client_release(&fb_helper->client);
>   	drm_fb_helper_unprepare(fb_helper);
>   	kfree(fb_helper);
> @@ -328,7 +328,7 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   	fb_helper->buffer = NULL;
>   	drm_client_buffer_vunmap(buffer);
>   err_drm_client_buffer_delete:
> -	drm_client_framebuffer_delete(buffer);
> +	drm_client_buffer_delete(buffer);
>   	return ret;
>   }
>   EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
> diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
> index 1e827bf8b815..f7966b8c51cd 100644
> --- a/drivers/gpu/drm/drm_fbdev_shmem.c
> +++ b/drivers/gpu/drm/drm_fbdev_shmem.c
> @@ -63,7 +63,7 @@ static void drm_fbdev_shmem_fb_destroy(struct fb_info *info)
>   	drm_fb_helper_fini(fb_helper);
>   
>   	drm_client_buffer_vunmap(fb_helper->buffer);
> -	drm_client_framebuffer_delete(fb_helper->buffer);
> +	drm_client_buffer_delete(fb_helper->buffer);
>   	drm_client_release(&fb_helper->client);
>   	drm_fb_helper_unprepare(fb_helper);
>   	kfree(fb_helper);
> @@ -206,7 +206,7 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   	fb_helper->buffer = NULL;
>   	drm_client_buffer_vunmap(buffer);
>   err_drm_client_buffer_delete:
> -	drm_client_framebuffer_delete(buffer);
> +	drm_client_buffer_delete(buffer);
>   	return ret;
>   }
>   EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
> diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
> index 85feb55bba11..54f9a46b96c2 100644
> --- a/drivers/gpu/drm/drm_fbdev_ttm.c
> +++ b/drivers/gpu/drm/drm_fbdev_ttm.c
> @@ -50,7 +50,7 @@ static void drm_fbdev_ttm_fb_destroy(struct fb_info *info)
>   	fb_deferred_io_cleanup(info);
>   	drm_fb_helper_fini(fb_helper);
>   	vfree(shadow);
> -	drm_client_framebuffer_delete(fb_helper->buffer);
> +	drm_client_buffer_delete(fb_helper->buffer);
>   
>   	drm_client_release(&fb_helper->client);
>   	drm_fb_helper_unprepare(fb_helper);
> @@ -202,7 +202,7 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   	screen_buffer = vzalloc(screen_size);
>   	if (!screen_buffer) {
>   		ret = -ENOMEM;
> -		goto err_drm_client_framebuffer_delete;
> +		goto err_drm_client_buffer_delete;
>   	}
>   
>   	info = drm_fb_helper_alloc_info(fb_helper);
> @@ -235,10 +235,10 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   	drm_fb_helper_release_info(fb_helper);
>   err_vfree:
>   	vfree(screen_buffer);
> -err_drm_client_framebuffer_delete:
> +err_drm_client_buffer_delete:
>   	fb_helper->fb = NULL;
>   	fb_helper->buffer = NULL;
> -	drm_client_framebuffer_delete(buffer);
> +	drm_client_buffer_delete(buffer);
>   	return ret;
>   }
>   EXPORT_SYMBOL(drm_fbdev_ttm_driver_fbdev_probe);
> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
> index 5909664d4d43..6019f2712448 100644
> --- a/include/drm/drm_client.h
> +++ b/include/drm/drm_client.h
> @@ -185,7 +185,7 @@ struct drm_client_buffer {
>   
>   struct drm_client_buffer *
>   drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
> -void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);
> +void drm_client_buffer_delete(struct drm_client_buffer *buffer);
>   int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect);
>   int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
>   				 struct iosys_map *map_copy);


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 6/7] drm/client: Create client buffers with drm_client_buffer_create_dumb()
  2025-10-20 15:04 ` [PATCH 6/7] drm/client: Create client buffers with drm_client_buffer_create_dumb() Thomas Zimmermann
@ 2025-10-21 12:54   ` Jocelyn Falempe
  0 siblings, 0 replies; 16+ messages in thread
From: Jocelyn Falempe @ 2025-10-21 12:54 UTC (permalink / raw)
  To: Thomas Zimmermann, javierm, rrameshbabu, maarten.lankhorst,
	mripard, airlied, simona
  Cc: dri-devel

On 20/10/2025 17:04, Thomas Zimmermann wrote:
> Rename drm_client_framebuffer_create() to drm_client_buffer_create_dump()
> and adapt callers. The new name reflects the function's purpose. Using
> dumb buffers is the easiest way for creating a GEM buffer in a drivers-
> independent way.
> 
> There's also drm_client_buffer_create(), which creates the client buffer
> from a preexisting buffer object. This helper can be exported for drivers
> that create their own GEM buffer object.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>


> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/clients/drm_log.c | 2 +-
>   drivers/gpu/drm/drm_client.c      | 6 +++---
>   drivers/gpu/drm/drm_fbdev_dma.c   | 2 +-
>   drivers/gpu/drm/drm_fbdev_shmem.c | 2 +-
>   drivers/gpu/drm/drm_fbdev_ttm.c   | 2 +-
>   include/drm/drm_client.h          | 2 +-
>   6 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
> index 2d748ab318fe..b8fb9ee9fcf0 100644
> --- a/drivers/gpu/drm/clients/drm_log.c
> +++ b/drivers/gpu/drm/clients/drm_log.c
> @@ -204,7 +204,7 @@ static int drm_log_setup_modeset(struct drm_client_dev *client,
>   	if (format == DRM_FORMAT_INVALID)
>   		return -EINVAL;
>   
> -	scanout->buffer = drm_client_framebuffer_create(client, width, height, format);
> +	scanout->buffer = drm_client_buffer_create_dumb(client, width, height, format);
>   	if (IS_ERR(scanout->buffer)) {
>   		drm_warn(client->dev, "drm_log can't create framebuffer %d %d %p4cc\n",
>   			 width, height, &format);
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index d4c424ff44a9..9105a0b5f468 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -372,7 +372,7 @@ void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
>   EXPORT_SYMBOL(drm_client_buffer_vunmap);
>   
>   /**
> - * drm_client_framebuffer_create - Create a client framebuffer
> + * drm_client_buffer_create_dumb - Create a client buffer backed by a dumb buffer
>    * @client: DRM client
>    * @width: Framebuffer width
>    * @height: Framebuffer height
> @@ -386,7 +386,7 @@ EXPORT_SYMBOL(drm_client_buffer_vunmap);
>    * Pointer to a client buffer or an error pointer on failure.
>    */
>   struct drm_client_buffer *
> -drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
> +drm_client_buffer_create_dumb(struct drm_client_dev *client, u32 width, u32 height, u32 format)
>   {
>   	const struct drm_format_info *info = drm_format_info(format);
>   	struct drm_device *dev = client->dev;
> @@ -422,7 +422,7 @@ drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 heig
>   	drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file);
>   	return ERR_PTR(ret);
>   }
> -EXPORT_SYMBOL(drm_client_framebuffer_create);
> +EXPORT_SYMBOL(drm_client_buffer_create_dumb);
>   
>   /**
>    * drm_client_framebuffer_flush - Manually flush client framebuffer
> diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
> index 17fef288e86b..7d4e557d6a5d 100644
> --- a/drivers/gpu/drm/drm_fbdev_dma.c
> +++ b/drivers/gpu/drm/drm_fbdev_dma.c
> @@ -285,7 +285,7 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   
>   	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
>   					     sizes->surface_depth);
> -	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
> +	buffer = drm_client_buffer_create_dumb(client, sizes->surface_width,
>   					       sizes->surface_height, format);
>   	if (IS_ERR(buffer))
>   		return PTR_ERR(buffer);
> diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
> index f7966b8c51cd..b9e48a0bd39f 100644
> --- a/drivers/gpu/drm/drm_fbdev_shmem.c
> +++ b/drivers/gpu/drm/drm_fbdev_shmem.c
> @@ -149,7 +149,7 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   		    sizes->surface_bpp);
>   
>   	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp, sizes->surface_depth);
> -	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
> +	buffer = drm_client_buffer_create_dumb(client, sizes->surface_width,
>   					       sizes->surface_height, format);
>   	if (IS_ERR(buffer))
>   		return PTR_ERR(buffer);
> diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
> index 54f9a46b96c2..b1188692399a 100644
> --- a/drivers/gpu/drm/drm_fbdev_ttm.c
> +++ b/drivers/gpu/drm/drm_fbdev_ttm.c
> @@ -189,7 +189,7 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
>   
>   	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
>   					     sizes->surface_depth);
> -	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
> +	buffer = drm_client_buffer_create_dumb(client, sizes->surface_width,
>   					       sizes->surface_height, format);
>   	if (IS_ERR(buffer))
>   		return PTR_ERR(buffer);
> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
> index 6019f2712448..e4df404a9645 100644
> --- a/include/drm/drm_client.h
> +++ b/include/drm/drm_client.h
> @@ -184,7 +184,7 @@ struct drm_client_buffer {
>   };
>   
>   struct drm_client_buffer *
> -drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
> +drm_client_buffer_create_dumb(struct drm_client_dev *client, u32 width, u32 height, u32 format);
>   void drm_client_buffer_delete(struct drm_client_buffer *buffer);
>   int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect);
>   int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete()
  2025-10-20 15:04 ` [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete() Thomas Zimmermann
  2025-10-21 12:50   ` Jocelyn Falempe
@ 2025-10-22  7:00   ` Dan Carpenter
  1 sibling, 0 replies; 16+ messages in thread
From: Dan Carpenter @ 2025-10-22  7:00 UTC (permalink / raw)
  To: oe-kbuild, Thomas Zimmermann, jfalempe, javierm, rrameshbabu,
	maarten.lankhorst, mripard, airlied, simona
  Cc: lkp, oe-kbuild-all, dri-devel, Thomas Zimmermann

Hi Thomas,

kernel test robot noticed the following build warnings:

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-client-Remove-pitch-from-struct-drm_client_buffer/20251020-231709
base:   git://anongit.freedesktop.org/drm/drm drm-next
patch link:    https://lore.kernel.org/r/20251020151402.53013-6-tzimmermann%40suse.de
patch subject: [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete()
config: openrisc-randconfig-r072-20251021 (https://download.01.org/0day-ci/archive/20251022/202510220056.J4uIVWxn-lkp@intel.com/config)
compiler: or1k-linux-gcc (GCC) 12.5.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202510220056.J4uIVWxn-lkp@intel.com/

smatch warnings:
drivers/gpu/drm/drm_client.c:185 drm_client_buffer_delete() warn: variable dereferenced before check 'buffer' (see line 182)

vim +/buffer +185 drivers/gpu/drm/drm_client.c

449148a7300b8b Thomas Zimmermann 2025-10-20  180  void drm_client_buffer_delete(struct drm_client_buffer *buffer)
c76f0f7cb546b6 Noralf Trønnes    2018-07-03  181  {
95d6cf3a3cf1a1 Thomas Zimmermann 2025-10-20 @182  	struct drm_gem_object *gem = drm_gem_fb_get_obj(buffer->fb, 0);
                                                                                                        ^^^^^^^^^^
buffer is dereferenced here

82e2a75e5a640c Thomas Zimmermann 2025-10-20  183  	int ret;
82e2a75e5a640c Thomas Zimmermann 2025-10-20  184  
449148a7300b8b Thomas Zimmermann 2025-10-20 @185  	if (!buffer)
                                                            ^^^^^^^
checked too late

449148a7300b8b Thomas Zimmermann 2025-10-20  186  		return;
449148a7300b8b Thomas Zimmermann 2025-10-20  187  
95d6cf3a3cf1a1 Thomas Zimmermann 2025-10-20  188  	drm_gem_vunmap(gem, &buffer->map);
95d6cf3a3cf1a1 Thomas Zimmermann 2025-10-20  189  
82e2a75e5a640c Thomas Zimmermann 2025-10-20  190  	ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
82e2a75e5a640c Thomas Zimmermann 2025-10-20  191  	if (ret)
82e2a75e5a640c Thomas Zimmermann 2025-10-20  192  		drm_err(buffer->client->dev,
82e2a75e5a640c Thomas Zimmermann 2025-10-20  193  			"Error removing FB:%u (%d)\n", buffer->fb->base.id, ret);
82e2a75e5a640c Thomas Zimmermann 2025-10-20  194  
be6ee102341bc4 Emil Velikov      2020-05-15  195  	drm_gem_object_put(buffer->gem);
c76f0f7cb546b6 Noralf Trønnes    2018-07-03  196  
c76f0f7cb546b6 Noralf Trønnes    2018-07-03  197  	kfree(buffer);
c76f0f7cb546b6 Noralf Trønnes    2018-07-03  198  }

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem
  2025-10-20 15:04 ` [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem Thomas Zimmermann
  2025-10-21 12:49   ` Jocelyn Falempe
@ 2025-10-26  9:12   ` kernel test robot
  1 sibling, 0 replies; 16+ messages in thread
From: kernel test robot @ 2025-10-26  9:12 UTC (permalink / raw)
  To: Thomas Zimmermann, jfalempe, javierm, rrameshbabu,
	maarten.lankhorst, mripard, airlied, simona
  Cc: oe-kbuild-all, dri-devel, Thomas Zimmermann

Hi Thomas,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm/drm-next]
[also build test ERROR on drm-exynos/exynos-drm-next drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-misc/drm-misc-next drm-tip/drm-tip linus/master v6.18-rc2 next-20251024]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-client-Remove-pitch-from-struct-drm_client_buffer/20251020-231709
base:   git://anongit.freedesktop.org/drm/drm drm-next
patch link:    https://lore.kernel.org/r/20251020151402.53013-5-tzimmermann%40suse.de
patch subject: [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem
config: arm-multi_v5_defconfig (https://download.01.org/0day-ci/archive/20251026/202510261717.a4f1joxt-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251026/202510261717.a4f1joxt-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510261717.a4f1joxt-lkp@intel.com/

All errors (new ones prefixed by >>):

   arm-linux-gnueabi-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_buffer_vmap_local':
>> drivers/gpu/drm/drm_client.c:278:(.text+0x214): undefined reference to `drm_gem_fb_get_obj'
   arm-linux-gnueabi-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_buffer_vunmap_local':
   drivers/gpu/drm/drm_client.c:307:(.text+0x280): undefined reference to `drm_gem_fb_get_obj'
   arm-linux-gnueabi-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_buffer_vmap':
   drivers/gpu/drm/drm_client.c:338:(.text+0x2b4): undefined reference to `drm_gem_fb_get_obj'
   arm-linux-gnueabi-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_buffer_vunmap':
   drivers/gpu/drm/drm_client.c:360:(.text+0x2ec): undefined reference to `drm_gem_fb_get_obj'
   arm-linux-gnueabi-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_buffer_delete':
   drivers/gpu/drm/drm_client.c:178:(.text+0x6ec): undefined reference to `drm_gem_fb_get_obj'


vim +278 drivers/gpu/drm/drm_client.c

   254	
   255	/**
   256	 * drm_client_buffer_vmap_local - Map DRM client buffer into address space
   257	 * @buffer: DRM client buffer
   258	 * @map_copy: Returns the mapped memory's address
   259	 *
   260	 * This function maps a client buffer into kernel address space. If the
   261	 * buffer is already mapped, it returns the existing mapping's address.
   262	 *
   263	 * Client buffer mappings are not ref'counted. Each call to
   264	 * drm_client_buffer_vmap_local() should be closely followed by a call to
   265	 * drm_client_buffer_vunmap_local(). See drm_client_buffer_vmap() for
   266	 * long-term mappings.
   267	 *
   268	 * The returned address is a copy of the internal value. In contrast to
   269	 * other vmap interfaces, you don't need it for the client's vunmap
   270	 * function. So you can modify it at will during blit and draw operations.
   271	 *
   272	 * Returns:
   273	 *	0 on success, or a negative errno code otherwise.
   274	 */
   275	int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
   276					 struct iosys_map *map_copy)
   277	{
 > 278		struct drm_gem_object *gem = drm_gem_fb_get_obj(buffer->fb, 0);
   279		struct iosys_map *map = &buffer->map;
   280		int ret;
   281	
   282		drm_gem_lock(gem);
   283	
   284		ret = drm_gem_vmap_locked(gem, map);
   285		if (ret)
   286			goto err_drm_gem_vmap_unlocked;
   287		*map_copy = *map;
   288	
   289		return 0;
   290	
   291	err_drm_gem_vmap_unlocked:
   292		drm_gem_unlock(gem);
   293		return ret;
   294	}
   295	EXPORT_SYMBOL(drm_client_buffer_vmap_local);
   296	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2025-10-26  9:12 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-20 15:04 [PATCH 0/7] drm/client: Simply client-buffer interface and implementation Thomas Zimmermann
2025-10-20 15:04 ` [PATCH 1/7] drm/client: Remove pitch from struct drm_client_buffer Thomas Zimmermann
2025-10-21 12:44   ` Jocelyn Falempe
2025-10-20 15:04 ` [PATCH 2/7] drm/client: Move dumb-buffer handling to drm_client_framebuffer_create() Thomas Zimmermann
2025-10-21 12:47   ` Jocelyn Falempe
2025-10-20 15:04 ` [PATCH 3/7] drm/client: Inline drm_client_buffer_addfb() and _rmfb() Thomas Zimmermann
2025-10-21 12:49   ` Jocelyn Falempe
2025-10-20 15:04 ` [PATCH 4/7] drm/client: Deprecate struct drm_client_buffer.gem Thomas Zimmermann
2025-10-21 12:49   ` Jocelyn Falempe
2025-10-26  9:12   ` kernel test robot
2025-10-20 15:04 ` [PATCH 5/7] drm/client: Remove drm_client_framebuffer_delete() Thomas Zimmermann
2025-10-21 12:50   ` Jocelyn Falempe
2025-10-22  7:00   ` Dan Carpenter
2025-10-20 15:04 ` [PATCH 6/7] drm/client: Create client buffers with drm_client_buffer_create_dumb() Thomas Zimmermann
2025-10-21 12:54   ` Jocelyn Falempe
2025-10-20 15:04 ` [PATCH 7/7] drm/client: Flush client buffers with drm_client_buffer_sync() Thomas Zimmermann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox