mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
#include <drm/drm_fourcc.h>
|
#include <drm/drm_fourcc.h>
|
||||||
#include <drm/drm_framebuffer.h>
|
#include <drm/drm_framebuffer.h>
|
||||||
#include <drm/drm_gem.h>
|
#include <drm/drm_gem.h>
|
||||||
|
#include <drm/drm_gem_framebuffer_helper.h>
|
||||||
#include <drm/drm_mode.h>
|
#include <drm/drm_mode.h>
|
||||||
#include <drm/drm_print.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)
|
static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
|
||||||
{
|
{
|
||||||
|
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
drm_gem_vunmap(gem, &buffer->map);
|
||||||
|
|
||||||
ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
|
ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
|
||||||
if (ret)
|
if (ret)
|
||||||
drm_err(buffer->client->dev,
|
drm_err(buffer->client->dev,
|
||||||
"Error removing FB:%u (%d)\n", buffer->fb->base.id, ret);
|
"Error removing FB:%u (%d)\n", buffer->fb->base.id, ret);
|
||||||
|
|
||||||
if (buffer->gem) {
|
drm_gem_object_put(buffer->gem);
|
||||||
drm_gem_vunmap(buffer->gem, &buffer->map);
|
|
||||||
drm_gem_object_put(buffer->gem);
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(buffer);
|
kfree(buffer);
|
||||||
}
|
}
|
||||||
@@ -278,7 +279,7 @@ err_delete:
|
|||||||
int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
|
int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
|
||||||
struct iosys_map *map_copy)
|
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;
|
struct iosys_map *map = &buffer->map;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -307,7 +308,7 @@ EXPORT_SYMBOL(drm_client_buffer_vmap_local);
|
|||||||
*/
|
*/
|
||||||
void drm_client_buffer_vunmap_local(struct drm_client_buffer *buffer)
|
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;
|
struct iosys_map *map = &buffer->map;
|
||||||
|
|
||||||
drm_gem_vunmap_locked(gem, 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,
|
int drm_client_buffer_vmap(struct drm_client_buffer *buffer,
|
||||||
struct iosys_map *map_copy)
|
struct iosys_map *map_copy)
|
||||||
{
|
{
|
||||||
|
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = drm_gem_vmap(buffer->gem, &buffer->map);
|
ret = drm_gem_vmap(gem, &buffer->map);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
*map_copy = buffer->map;
|
*map_copy = buffer->map;
|
||||||
@@ -359,7 +361,9 @@ EXPORT_SYMBOL(drm_client_buffer_vmap);
|
|||||||
*/
|
*/
|
||||||
void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
|
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);
|
EXPORT_SYMBOL(drm_client_buffer_vunmap);
|
||||||
|
|
||||||
|
|||||||
@@ -176,12 +176,9 @@ struct drm_client_buffer {
|
|||||||
/**
|
/**
|
||||||
* @gem: GEM object backing this buffer
|
* @gem: GEM object backing this buffer
|
||||||
*
|
*
|
||||||
* FIXME: The dependency on GEM here isn't required, we could
|
* FIXME: The DRM framebuffer holds a reference on its GEM
|
||||||
* convert the driver handle to a dma-buf instead and use the
|
* buffer objects. Do not use this field in new code and
|
||||||
* backend-agnostic dma-buf vmap support instead. This would
|
* update existing users.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
struct drm_gem_object *gem;
|
struct drm_gem_object *gem;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user