Re: [PATCH 1/2] drm/amdgpu/userq: handle runtime pm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ping?

On Fri, Feb 21, 2025 at 9:51 AM Alex Deucher <alexander.deucher@xxxxxxx> wrote:
>
> Take a reference when we create a queue and drop it
> when we destroy the queue.  We need to keep the device
> active while user queues are active.
>
> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> index 9a6a5553bbc3f..3a71d01b54c92 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> @@ -26,6 +26,7 @@
>  #include "mes_userqueue.h"
>  #include "amdgpu_userq_fence.h"
>  #include "v11_structs.h"
> +#include <linux/pm_runtime.h>
>
>  #define AMDGPU_USERQ_PROC_CTX_SZ PAGE_SIZE
>  #define AMDGPU_USERQ_GANG_CTX_SZ PAGE_SIZE
> @@ -287,6 +288,10 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,
>
>         queue->userq_prop = userq_props;
>
> +       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
> +       if (r)
> +               goto free_mqd;
> +
>         r = mqd_hw_default->init_mqd(adev, (void *)queue->mqd.cpu_ptr, userq_props);
>         if (r) {
>                 DRM_ERROR("Failed to initialize MQD for userqueue\n");
> @@ -321,6 +326,8 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,
>
>  free_mqd:
>         amdgpu_userqueue_destroy_object(uq_mgr, &queue->mqd);
> +       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
> +       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
>
>  free_props:
>         kfree(userq_props);
> @@ -330,14 +337,19 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,
>
>  static void
>  mes_userq_mqd_destroy(struct amdgpu_userq_mgr *uq_mgr,
> -                           struct amdgpu_usermode_queue *queue)
> +                     struct amdgpu_usermode_queue *queue)
>  {
> +       struct amdgpu_device *adev = uq_mgr->adev;
> +
>         if (queue->queue_active)
>                 mes_userq_unmap(uq_mgr, queue);
>
>         amdgpu_userqueue_destroy_object(uq_mgr, &queue->fw_obj);
>         kfree(queue->userq_prop);
>         amdgpu_userqueue_destroy_object(uq_mgr, &queue->mqd);
> +
> +       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
> +       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
>  }
>
>  static int mes_userq_suspend(struct amdgpu_userq_mgr *uq_mgr,
> --
> 2.48.1
>




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux