[PATCH 1/3] Revert "drm/prime: Unexport helpers for fd/handle conversion"
Felix Kuehling
felix.kuehling at amd.com
Mon Nov 20 15:06:34 UTC 2023
On 2023-11-20 6:54, Thomas Zimmermann wrote:
> Hi
>
> Am 17.11.23 um 22:44 schrieb Felix Kuehling:
>> This reverts commit 71a7974ac7019afeec105a54447ae1dc7216cbb3.
>>
>> These helper functions are needed for KFD to export and import DMABufs
>> the right way without duplicating the tracking of DMABufs associated
>> with
>> GEM objects while ensuring that move notifier callbacks are working as
>> intended.
>
> I'm unhappy to see these functions making a comeback. They are the
> boiler-plate logic that all drivers should use. Historically, drivers
> did a lot one things in their GEM code that was only semi-correct.
> Unifying most of that made the memory management more readable. Not
> giving back drivers to option of tinkering with this might be
> preferable. The rsp hooks in struct drm_driver, prime_fd_to_handle and
> prime_handle_to_fd, are only there for vmwgfx.
>
> If you want to hook into prime import and export, there are
> drm_driver.gem_prime_import and drm_gem_object_funcs.export. Isn't it
> possible to move the additional code behind these pointers?
I'm not trying to hook into these functions, I'm just trying to call
them. I'm not bringing back the .prime_handle_to_fd and
.prime_fd_to_handle hooks in struct drm_driver. I need a clean way to
export and import DMAbuffers from a kernel mode context. I had incorrect
or semi-correct ways of doing that by calling some driver-internal
functions, but then my DMABufs aren't correctly linked with GEM handles
in DRM and move notifiers in amdgpu aren't working correctly.
Regards,
Felix
>
> Best regards
> Thomas
>
>>
>> CC: Christian König <christian.koenig at amd.com>
>> CC: Thomas Zimmermann <tzimmermann at suse.de>
>> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
>> ---
>> drivers/gpu/drm/drm_prime.c | 33 ++++++++++++++++++---------------
>> include/drm/drm_prime.h | 7 +++++++
>> 2 files changed, 25 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
>> index 63b709a67471..834a5e28abbe 100644
>> --- a/drivers/gpu/drm/drm_prime.c
>> +++ b/drivers/gpu/drm/drm_prime.c
>> @@ -278,7 +278,7 @@ void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
>> }
>> EXPORT_SYMBOL(drm_gem_dmabuf_release);
>> -/*
>> +/**
>> * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers
>> * @dev: drm_device to import into
>> * @file_priv: drm file-private structure
>> @@ -292,9 +292,9 @@ EXPORT_SYMBOL(drm_gem_dmabuf_release);
>> *
>> * Returns 0 on success or a negative error code on failure.
>> */
>> -static int drm_gem_prime_fd_to_handle(struct drm_device *dev,
>> - struct drm_file *file_priv, int prime_fd,
>> - uint32_t *handle)
>> +int drm_gem_prime_fd_to_handle(struct drm_device *dev,
>> + struct drm_file *file_priv, int prime_fd,
>> + uint32_t *handle)
>> {
>> struct dma_buf *dma_buf;
>> struct drm_gem_object *obj;
>> @@ -360,6 +360,7 @@ static int drm_gem_prime_fd_to_handle(struct
>> drm_device *dev,
>> dma_buf_put(dma_buf);
>> return ret;
>> }
>> +EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
>> int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
>> struct drm_file *file_priv)
>> @@ -408,7 +409,7 @@ static struct dma_buf
>> *export_and_register_object(struct drm_device *dev,
>> return dmabuf;
>> }
>> -/*
>> +/**
>> * drm_gem_prime_handle_to_fd - PRIME export function for GEM drivers
>> * @dev: dev to export the buffer from
>> * @file_priv: drm file-private structure
>> @@ -421,10 +422,10 @@ static struct dma_buf
>> *export_and_register_object(struct drm_device *dev,
>> * The actual exporting from GEM object to a dma-buf is done
>> through the
>> * &drm_gem_object_funcs.export callback.
>> */
>> -static int drm_gem_prime_handle_to_fd(struct drm_device *dev,
>> - struct drm_file *file_priv, uint32_t handle,
>> - uint32_t flags,
>> - int *prime_fd)
>> +int drm_gem_prime_handle_to_fd(struct drm_device *dev,
>> + struct drm_file *file_priv, uint32_t handle,
>> + uint32_t flags,
>> + int *prime_fd)
>> {
>> struct drm_gem_object *obj;
>> int ret = 0;
>> @@ -506,6 +507,7 @@ static int drm_gem_prime_handle_to_fd(struct
>> drm_device *dev,
>> return ret;
>> }
>> +EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
>> int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
>> struct drm_file *file_priv)
>> @@ -864,9 +866,9 @@ EXPORT_SYMBOL(drm_prime_get_contiguous_size);
>> * @obj: GEM object to export
>> * @flags: flags like DRM_CLOEXEC and DRM_RDWR
>> *
>> - * This is the implementation of the &drm_gem_object_funcs.export
>> functions
>> - * for GEM drivers using the PRIME helpers. It is used as the
>> default for
>> - * drivers that do not set their own.
>> + * This is the implementation of the &drm_gem_object_funcs.export
>> functions for GEM drivers
>> + * using the PRIME helpers. It is used as the default in
>> + * drm_gem_prime_handle_to_fd().
>> */
>> struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj,
>> int flags)
>> @@ -962,9 +964,10 @@ EXPORT_SYMBOL(drm_gem_prime_import_dev);
>> * @dev: drm_device to import into
>> * @dma_buf: dma-buf object to import
>> *
>> - * This is the implementation of the gem_prime_import functions for GEM
>> - * drivers using the PRIME helpers. It is the default for drivers
>> that do
>> - * not set their own &drm_driver.gem_prime_import.
>> + * This is the implementation of the gem_prime_import functions for
>> GEM drivers
>> + * using the PRIME helpers. Drivers can use this as their
>> + * &drm_driver.gem_prime_import implementation. It is used as the
>> default
>> + * implementation in drm_gem_prime_fd_to_handle().
>> *
>> * Drivers must arrange to call drm_prime_gem_destroy() from their
>> * &drm_gem_object_funcs.free hook when using this function.
>> diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h
>> index a7abf9f3e697..2a1d01e5b56b 100644
>> --- a/include/drm/drm_prime.h
>> +++ b/include/drm/drm_prime.h
>> @@ -60,12 +60,19 @@ enum dma_data_direction;
>> struct drm_device;
>> struct drm_gem_object;
>> +struct drm_file;
>> /* core prime functions */
>> struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
>> struct dma_buf_export_info *exp_info);
>> void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
>> +int drm_gem_prime_fd_to_handle(struct drm_device *dev,
>> + struct drm_file *file_priv, int prime_fd,
>> uint32_t *handle);
>> +int drm_gem_prime_handle_to_fd(struct drm_device *dev,
>> + struct drm_file *file_priv, uint32_t handle,
>> uint32_t flags,
>> + int *prime_fd);
>> +
>> /* helper functions for exporting */
>> int drm_gem_map_attach(struct dma_buf *dma_buf,
>> struct dma_buf_attachment *attach);
>
More information about the dri-devel
mailing list