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 >