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

drm/gem: Inline drm_gem_pin() into PRIME helpers



Inline drm_gem_pin() into its only caller drm_gem_map_attach()
and update the documentation in the callback's purpose. Do the
equivalent for drm_gem_unpin(). Also add stricter error checking
on the involved locking.

The pin operation in the GEM object functions is a helper for
PRIME-exported buffer objects. Having drm_gem_pin() gives the
impression of a general-purpose interface, which is not the case.
Removing it makes the pin callback a bit harder to misuse.

v2:
- clarify comment on pin callback (Dmitry)

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
Link: https://lore.kernel.org/r/20250526132634.531789-5-tzimmermann@suse.de
parent 3c89f2d8
Loading
Loading
Loading
Loading
+0 −32
Original line number Diff line number Diff line
@@ -1184,38 +1184,6 @@ void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
		obj->funcs->print_info(p, indent, obj);
}

int drm_gem_pin_locked(struct drm_gem_object *obj)
{
	if (obj->funcs->pin)
		return obj->funcs->pin(obj);

	return 0;
}

void drm_gem_unpin_locked(struct drm_gem_object *obj)
{
	if (obj->funcs->unpin)
		obj->funcs->unpin(obj);
}

int drm_gem_pin(struct drm_gem_object *obj)
{
	int ret;

	dma_resv_lock(obj->resv, NULL);
	ret = drm_gem_pin_locked(obj);
	dma_resv_unlock(obj->resv);

	return ret;
}

void drm_gem_unpin(struct drm_gem_object *obj)
{
	dma_resv_lock(obj->resv, NULL);
	drm_gem_unpin_locked(obj);
	dma_resv_unlock(obj->resv);
}

int drm_gem_vmap_locked(struct drm_gem_object *obj, struct iosys_map *map)
{
	int ret;
+0 −4
Original line number Diff line number Diff line
@@ -175,10 +175,6 @@ void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
			const struct drm_gem_object *obj);

int drm_gem_pin_locked(struct drm_gem_object *obj);
void drm_gem_unpin_locked(struct drm_gem_object *obj);
int drm_gem_pin(struct drm_gem_object *obj);
void drm_gem_unpin(struct drm_gem_object *obj);
int drm_gem_vmap_locked(struct drm_gem_object *obj, struct iosys_map *map);
void drm_gem_vunmap_locked(struct drm_gem_object *obj, struct iosys_map *map);

+20 −2
Original line number Diff line number Diff line
@@ -599,6 +599,7 @@ int drm_gem_map_attach(struct dma_buf *dma_buf,
		       struct dma_buf_attachment *attach)
{
	struct drm_gem_object *obj = dma_buf->priv;
	int ret;

	/*
	 * drm_gem_map_dma_buf() requires obj->get_sg_table(), but drivers
@@ -608,7 +609,16 @@ int drm_gem_map_attach(struct dma_buf *dma_buf,
	    !obj->funcs->get_sg_table)
		return -ENOSYS;

	return drm_gem_pin(obj);
	if (!obj->funcs->pin)
		return 0;

	ret = dma_resv_lock(obj->resv, NULL);
	if (ret)
		return ret;
	ret = obj->funcs->pin(obj);
	dma_resv_unlock(obj->resv);

	return ret;
}
EXPORT_SYMBOL(drm_gem_map_attach);

@@ -625,8 +635,16 @@ void drm_gem_map_detach(struct dma_buf *dma_buf,
			struct dma_buf_attachment *attach)
{
	struct drm_gem_object *obj = dma_buf->priv;
	int ret;

	drm_gem_unpin(obj);
	if (!obj->funcs->unpin)
		return;

	ret = dma_resv_lock(obj->resv, NULL);
	if (drm_WARN_ON(obj->dev, ret))
		return;
	obj->funcs->unpin(obj);
	dma_resv_unlock(obj->resv);
}
EXPORT_SYMBOL(drm_gem_map_detach);

+2 −1
Original line number Diff line number Diff line
@@ -126,7 +126,8 @@ struct drm_gem_object_funcs {
	/**
	 * @pin:
	 *
	 * Pin backing buffer in memory. Used by the drm_gem_map_attach() helper.
	 * Pin backing buffer in memory, such that dma-buf importers can
	 * access it. Used by the drm_gem_map_attach() helper.
	 *
	 * This callback is optional.
	 */