Re: [PATCH v2 1/2] drm/amdgpu/mes: refactor the amdgpu_mes_alloc/free_proc|gang()
"Chen, Michael" <[email protected]> Mon, 3 Aug 2026 20:19:31 +0000
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <DM6PR12MB3611478BA8E7766040313BBB94D52@DM6PR12MB3611.namprd12.prod.outlook.com> |
--_000_DM6PR12MB3611478BA8E7766040313BBB94D52DM6PR12MB3611namp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable AMD General ________________________________ From: Liang, Prike <[email protected]> Sent: Wednesday, July 29, 2026 10:09 PM To: [email protected] <[email protected]> Cc: Deucher, Alexander <[email protected]>; Koenig, Christian <Chri= [email protected]>; Chen, Michael <[email protected]>; Liu, Shaoyun <= [email protected]>; Liang, Prike <[email protected]> Subject: [PATCH v2 1/2] drm/amdgpu/mes: refactor the amdgpu_mes_alloc/free_= proc|gang() - Unify amdgpu_mes_alloc/free_proc|gang_ctx_index to provide centralized RS64mem bitmap management for both KGD and KFD. - Retrieve the bitmap bit for userq contex index based on a per process granularity. Signed-off-by: Prike Liang <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 28 +++++++++++----------- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 8 +++---- drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 6 +++++ drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h | 3 ++- drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 20 ++++++++++------ 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/= amdgpu/amdgpu_mes.c index 9af7c97af5be..e3862095ff99 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -1040,13 +1040,13 @@ int amdgpu_mes_rs64mem_setup_bitmaps(struct amdgpu_= mes *mes) * amdgpu_mes_alloc_proc_ctx_index - allocate a process context slot * * @mes: MES instance - * @queue: Usermode queue receiving the allocated process context index + * @index: the allocated process context index * * Returns 0 on success, -ENOSPC if all slots are used, or * -EOPNOTSUPP if RS64 local memory is unavailable. */ int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue) + uint32_t *index) { unsigned long bit; @@ -1061,7 +1061,7 @@ int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_mes= *mes, return -ENOSPC; } set_bit(bit, mes->proc_ctx_bitmap); - queue->proc_ctx_array_index =3D (uint32_t)bit; + *index =3D (uint32_t)bit; amdgpu_mes_unlock(mes); return 0; @@ -1071,18 +1071,18 @@ int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_m= es *mes, * amdgpu_mes_free_proc_ctx_index - free a process context slot * * @mes: MES instance - * @queue: Usermode queue whose process context index is released + * @index: process context index is released */ void amdgpu_mes_free_proc_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue) + uint32_t index) { if (!mes->use_rs64mem || !mes->proc_ctx_bitmap) return; - if (queue->proc_ctx_array_index >=3D mes->proc_ctx_array_size) + if (index >=3D mes->proc_ctx_array_size) return; amdgpu_mes_lock(mes); - clear_bit(queue->proc_ctx_array_index, mes->proc_ctx_bitmap); + clear_bit(index, mes->proc_ctx_bitmap); amdgpu_mes_unlock(mes); } @@ -1090,13 +1090,13 @@ void amdgpu_mes_free_proc_ctx_index(struct amdgpu_m= es *mes, * amdgpu_mes_alloc_gang_ctx_index - allocate a gang context slot * * @mes: MES instance - * @queue: Usermode queue receiving the allocated gang context index + * @queue: the allocated gang context index The parameter is "index", not "queue". * * Returns 0 on success, -ENOSPC if all slots are used, or * -EOPNOTSUPP if RS64 local memory is unavailable. */ int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue) + uint32_t *index) { unsigned long bit; @@ -1111,7 +1111,7 @@ int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_mes= *mes, return -ENOSPC; } set_bit(bit, mes->gang_ctx_bitmap); - queue->gang_ctx_array_index =3D bit; + *index =3D bit; amdgpu_mes_unlock(mes); return 0; @@ -1121,18 +1121,18 @@ int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_m= es *mes, * amdgpu_mes_free_gang_ctx_index - free a gang context slot * * @mes: MES instance - * @queue: Usermode queue whose gang context index is released + * @queue: gang context index is released The parameter is "index", not "queue". */ void amdgpu_mes_free_gang_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue) + uint32_t index) { if (!mes->use_rs64mem || !mes->gang_ctx_bitmap) return; - if (queue->gang_ctx_array_index >=3D mes->gang_ctx_array_size) + if (index >=3D mes->gang_ctx_array_size) return; amdgpu_mes_lock(mes); - clear_bit(queue->gang_ctx_array_index, mes->gang_ctx_bitmap); + clear_bit(index, mes->gang_ctx_bitmap); amdgpu_mes_unlock(mes); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h b/drivers/gpu/drm/amd/= amdgpu/amdgpu_mes.h index c67db2d6e122..977c057dcce8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h @@ -636,11 +636,11 @@ int amdgpu_mes_rs64mem_init(struct amdgpu_mes *mes); void amdgpu_mes_rs64mem_fini(struct amdgpu_mes *mes); int amdgpu_mes_rs64mem_setup_bitmaps(struct amdgpu_mes *mes); int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue); + uint32_t *index); void amdgpu_mes_free_proc_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue); + uint32_t index); int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue); + uint32_t *index); void amdgpu_mes_free_gang_ctx_index(struct amdgpu_mes *mes, - struct amdgpu_usermode_queue *queue); + uint32_t index); #endif /* __AMDGPU_MES_H__ */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/am= d/amdgpu/amdgpu_userq.c index a1f19888dc55..0e9657f2dbe7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -1249,6 +1249,7 @@ int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *us= erq_mgr, struct drm_file *f xa_init_flags(&userq_mgr->userq_xa, XA_FLAGS_ALLOC); userq_mgr->adev =3D adev; userq_mgr->file =3D file_priv; + userq_mgr->proc_ctx_allocated =3D false; mutex_init(&userq_mgr->proc_ctx_lock); INIT_DELAYED_WORK(&userq_mgr->resume_work, amdgpu_userq_restore_wo= rker); @@ -1277,6 +1278,7 @@ void amdgpu_userq_mgr_cancel_resume(struct amdgpu_use= rq_mgr *userq_mgr) void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr) { + struct amdgpu_mes *mes =3D &userq_mgr->adev->mes; struct amdgpu_usermode_queue *queue; unsigned long queue_id =3D 0; @@ -1303,6 +1305,10 @@ void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *= userq_mgr) */ cancel_work_sync(&userq_mgr->reset_work); + if (userq_mgr->proc_ctx_allocated) { + amdgpu_mes_free_proc_ctx_index(mes, userq_mgr->proc_ctx_arr= ay_index); + userq_mgr->proc_ctx_allocated =3D false; + } amdgpu_bo_free_kernel(&userq_mgr->proc_ctx_obj.obj, &userq_mgr->proc_ctx_obj.gpu_addr, &userq_mgr->proc_ctx_obj.cpu_ptr); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h b/drivers/gpu/drm/am= d/amdgpu/amdgpu_userq.h index 8333bab537d4..6412a7f7b6ef 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h @@ -101,7 +101,6 @@ struct amdgpu_usermode_queue { u64 va_array[6]; } userq_vas; - uint32_t proc_ctx_array_index; uint32_t gang_ctx_array_index; }; @@ -133,6 +132,8 @@ struct amdgpu_userq_mgr { struct mutex proc_ctx_lock; struct amdgpu_userq_obj proc_ctx_obj; + bool proc_ctx_allocated; + uint32_t proc_ctx_array_index; /** * @reset_work: * diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c b/drivers/gpu/drm/a= md/amdgpu/mes_userqueue.c index a914198a4d62..1fd72f18e9a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c @@ -143,10 +143,18 @@ static int mes_userq_map(struct amdgpu_usermode_queue= *queue) queue_input.doorbell_offset =3D userq_props->doorbell_index; queue_input.page_table_base_addr =3D amdgpu_gmc_pd_addr(queue->vm-= >root.bo); queue_input.wptr_mc_addr =3D queue->wptr_obj.gpu_addr; + if (mes->use_rs64mem) { - amdgpu_mes_alloc_proc_ctx_index(mes, queue); - queue_input.process_context_array_index =3D queue->proc_ctx= _array_index; - amdgpu_mes_alloc_gang_ctx_index(mes, queue); + if (!uq_mgr->proc_ctx_allocated) { + r =3D amdgpu_mes_alloc_proc_ctx_index(mes, &uq_mgr-= >proc_ctx_array_index); + if (r) { + DRM_ERROR("Failed to allocate userq process= index err:%d\n", r); + return r; + } + uq_mgr->proc_ctx_allocated =3D true; + } + amdgpu_mes_alloc_gang_ctx_index(mes, &queue->gang_ctx_array= _index); Need to check the return code, and handle error (e.g. running out of gang c= tx index). + queue_input.process_context_array_index =3D uq_mgr->proc_ct= x_array_index; queue_input.gang_context_array_index =3D queue->gang_ctx_a= rray_index; } amdgpu_mes_lock(&adev->mes); @@ -179,10 +187,8 @@ static int mes_userq_unmap(struct amdgpu_usermode_queu= e *queue) amdgpu_mes_lock(&adev->mes); r =3D adev->mes.funcs->remove_hw_queue(&adev->mes, &queue_input); amdgpu_mes_unlock(&adev->mes); - if (mes->use_rs64mem) { - amdgpu_mes_free_proc_ctx_index(mes, queue); - amdgpu_mes_free_gang_ctx_index(mes, queue); - } + if (mes->use_rs64mem) + amdgpu_mes_free_gang_ctx_index(mes, queue->gang_ctx_array_i= ndex); if (r) DRM_ERROR("Failed to unmap queue in HW, err (%d)\n", r); return r; -- 2.34.1 --_000_DM6PR12MB3611478BA8E7766040313BBB94D52DM6PR12MB3611namp_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <html> <head> <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-= 1"> <style type=3D"text/css" style=3D"display:none;"> P {margin-top:0;margin-bo= ttom:0;} </style> </head> <body dir=3D"ltr"> <div style=3D"font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, = Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);"> <div> <div style=3D"font-family: Calibri; text-align: left; color: rgb(0, 0, 255)= ; margin-left: 5pt; font-size: 10pt;"> AMD General</div> <br> </div> <br> </div> <div style=3D"font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, = Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <hr style=3D"display: inline-block; width: 98%;"> <div id=3D"divRplyFwdMsg"> <div style=3D"direction: ltr; font-family: Calibri, sans-serif; font-size: = 11pt; color: rgb(0, 0, 0);"> <b>From:</b> Liang, Prike <[email protected]><br> <b>Sent:</b> Wednesday, July 29, 2026 10:09 PM<br> <b>To:</b> [email protected] <[email protected]&= gt;<br> <b>Cc:</b> Deucher, Alexander <[email protected]>; Koenig, Ch= ristian <[email protected]>; Chen, Michael <Michael.Chen@am= d.com>; Liu, Shaoyun <[email protected]>; Liang, Prike <Prike= [email protected]><br> <b>Subject:</b> [PATCH v2 1/2] drm/amdgpu/mes: refactor the amdgpu_mes_allo= c/free_proc|gang()</div> <div style=3D"direction: ltr;"> </div> </div> <div style=3D"font-size: 11pt;">- Unify amdgpu_mes_alloc/free_proc|gang_ctx= _index to provide<br> centralized RS64mem bitmap management for both KGD and KFD.<br> - Retrieve the bitmap bit for userq contex index based on a<br> per process granularity.<br> <br> Signed-off-by: Prike Liang <[email protected]><br> ---<br> drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 28 ++++++= +++++-----------<br> drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 8 += ++----<br> drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 6 +++++<br> drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h | 3 ++-<br> drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 20 ++++++++++------<br> 5 files changed, 39 insertions(+), 26 deletions(-)<br> <br> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/= amdgpu/amdgpu_mes.c<br> index 9af7c97af5be..e3862095ff99 100644<br> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c<br> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c<br> @@ -1040,13 +1040,13 @@ int amdgpu_mes_rs64mem_setup_bitmaps(struct amdgpu_= mes *mes)<br> * amdgpu_mes_alloc_proc_ctx_index - allocate a process context slot<= br> *<br> * @mes: MES instance<br> - * @queue: Usermode queue receiving the allocated process context index<br= > + * @index: the allocated process context index<br> *<br> * Returns 0 on success, -ENOSPC if all slots are used, or<br> * -EOPNOTSUPP if RS64 local memory is unavailable.<br> */<br> int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue)<br> + &n= bsp;  = ; uint32_t *index)<br= > {<br> unsigned long bit;<br> <br> @@ -1061,7 +1061,7 @@ int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_mes= *mes,<br> &nb= sp; return -ENOSPC;<br> }<br> set_bit(bit, mes->proc_= ctx_bitmap);<br> - queue->proc_ctx_array_index =3D (u= int32_t)bit;<br> + *index =3D (uint32_t)bit;<br> amdgpu_mes_unlock(mes);<br= > <br> return 0;<br> @@ -1071,18 +1071,18 @@ int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_m= es *mes,<br> * amdgpu_mes_free_proc_ctx_index - free a process context slot= <br> *<br> * @mes: MES instance<br> - * @queue: Usermode queue whose process context index is released<br= > + * @index: process context index is released<br> */<br> void amdgpu_mes_free_proc_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue)<br> + &n= bsp;  = ; uint32_t index)<br> {<br> if (!mes->use_rs64mem |= | !mes->proc_ctx_bitmap)<br> &nb= sp; return;<br> - if (queue->proc_ctx_array_index &g= t;=3D mes->proc_ctx_array_size)<br> + if (index >=3D mes->proc_ctx_ar= ray_size)<br> &nb= sp; return;<br> <br> amdgpu_mes_lock(mes);<br> - clear_bit(queue->proc_ctx_array_in= dex, mes->proc_ctx_bitmap);<br> + clear_bit(index, mes->proc_ctx_bit= map);<br> amdgpu_mes_unlock(mes);<br= > }<br> <br> @@ -1090,13 +1090,13 @@ void amdgpu_mes_free_proc_ctx_index(struct amdgpu_m= es *mes,<br> * amdgpu_mes_alloc_gang_ctx_index - allocate a gang context sl= ot<br> *<br> * @mes: MES instance<br> - * @queue: Usermode queue receiving the allocated gang context index= <br> + * @queue: the allocated gang context index</div> <div style=3D"font-size: 11pt;"><br> </div> <div class=3D"elementToProof" style=3D"font-size: 11pt;">The parameter is &= quot;index", not "queue".</div> <div class=3D"elementToProof" style=3D"font-size: 11pt;"><br> *<br> * Returns 0 on success, -ENOSPC if all slots are used, or<br> * -EOPNOTSUPP if RS64 local memory is unavailable.<br> */<br> int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue)<br> + &n= bsp;  = ; uint32_t *index)<br= > {<br> unsigned long bit;<br> <br> @@ -1111,7 +1111,7 @@ int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_mes= *mes,<br> &nb= sp; return -ENOSPC;<br> }<br> set_bit(bit, mes->gang_= ctx_bitmap);<br> - queue->gang_ctx_array_index =3D bi= t;<br> + *index =3D bit;<br> amdgpu_mes_unlock(mes);<br= > <br> return 0;<br> @@ -1121,18 +1121,18 @@ int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_m= es *mes,<br> * amdgpu_mes_free_gang_ctx_index - free a gang context slot<br= > *<br> * @mes: MES instance<br> - * @queue: Usermode queue whose gang context index is released<br> + * @queue: gang context index is released</div> <div class=3D"elementToProof" style=3D"font-size: 11pt;"><br> </div> <div class=3D"elementToProof" style=3D"font-size: 11pt; color: rgb(0, 0, 0)= ;">The parameter is "index", not "queue".</div> <div class=3D"elementToProof" style=3D"font-size: 11pt;"><br> */<br> void amdgpu_mes_free_gang_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue)<br> + &n= bsp;  = ; uint32_t index)<br> {<br> if (!mes->use_rs64mem |= | !mes->gang_ctx_bitmap)<br> &nb= sp; return;<br> - if (queue->gang_ctx_array_index &g= t;=3D mes->gang_ctx_array_size)<br> + if (index >=3D mes->gang_ctx_ar= ray_size)<br> &nb= sp; return;<br> <br> amdgpu_mes_lock(mes);<br> - clear_bit(queue->gang_ctx_array_in= dex, mes->gang_ctx_bitmap);<br> + clear_bit(index, mes->gang_ctx_bit= map);<br> amdgpu_mes_unlock(mes);<br= > }<br> <br> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h b/drivers/gpu/drm/amd/= amdgpu/amdgpu_mes.h<br> index c67db2d6e122..977c057dcce8 100644<br> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h<br> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h<br> @@ -636,11 +636,11 @@ int amdgpu_mes_rs64mem_init(struct amdgpu_mes *mes);<= br> void amdgpu_mes_rs64mem_fini(struct amdgpu_mes *mes);<br> int amdgpu_mes_rs64mem_setup_bitmaps(struct amdgpu_mes *mes);<br> int amdgpu_mes_alloc_proc_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue);<br> + &n= bsp;  = ; uint32_t *index);<b= r> void amdgpu_mes_free_proc_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue);<br> + &n= bsp;  = ; uint32_t index);<br= > int amdgpu_mes_alloc_gang_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue);<br> + &n= bsp;  = ; uint32_t *index);<b= r> void amdgpu_mes_free_gang_ctx_index(struct amdgpu_mes *mes,<br> - &n= bsp;  = ; struct amdgpu_userm= ode_queue *queue);<br> + &n= bsp;  = ; uint32_t index);<br= > #endif /* __AMDGPU_MES_H__ */<br> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/am= d/amdgpu/amdgpu_userq.c<br> index a1f19888dc55..0e9657f2dbe7 100644<br> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c<br> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c<br> @@ -1249,6 +1249,7 @@ int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *us= erq_mgr, struct drm_file *f<br> xa_init_flags(&userq_m= gr->userq_xa, XA_FLAGS_ALLOC);<br> userq_mgr->adev =3D ade= v;<br> userq_mgr->file =3D fil= e_priv;<br> + userq_mgr->proc_ctx_allocated =3D = false;<br> mutex_init(&userq_mgr-= >proc_ctx_lock);<br> <br> INIT_DELAYED_WORK(&use= rq_mgr->resume_work, amdgpu_userq_restore_worker);<br> @@ -1277,6 +1278,7 @@ void amdgpu_userq_mgr_cancel_resume(struct amdgpu_use= rq_mgr *userq_mgr)<br> <br> void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr)<br> {<br> + struct amdgpu_mes *mes =3D &userq= _mgr->adev->mes;<br> struct amdgpu_usermode_que= ue *queue;<br> unsigned long queue_id =3D= 0;<br> <br> @@ -1303,6 +1305,10 @@ void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *= userq_mgr)<br> */<br> cancel_work_sync(&user= q_mgr->reset_work);<br> <br> + if (userq_mgr->proc_ctx_allocated)= {<br> + &n= bsp; amdgpu_mes_free_proc_ctx_index(mes, userq_mgr->proc_ctx_array= _index);<br> + &n= bsp; userq_mgr->proc_ctx_allocated =3D false;<br> + }<br> amdgpu_bo_free_kernel(&= ;userq_mgr->proc_ctx_obj.obj,<br> &nb= sp; = &userq_mgr->proc_ctx_obj.gpu_addr,<br= > &nb= sp; = &userq_mgr->proc_ctx_obj.cpu_ptr);<br= > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h b/drivers/gpu/drm/am= d/amdgpu/amdgpu_userq.h<br> index 8333bab537d4..6412a7f7b6ef 100644<br> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h<br> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h<br> @@ -101,7 +101,6 @@ struct amdgpu_usermode_queue {<br> &nb= sp; u64 va_array[6];<br> } userq_vas;<br> <br> - uint32_t  = ; proc_ctx_array_index;<br> uint32_t = gang_ctx_array_index;<br> };<br> <br> @@ -133,6 +132,8 @@ struct amdgpu_userq_mgr {<br> struct mutex &n= bsp;  = ; proc_ctx_lock;<br> struct amdgpu_userq_obj&nb= sp; proc_ctx_obj;<br> <br> + bool &nb= sp; = proc_ctx_allocated;<= br> + uint32_t  = ; &n= bsp; proc_ctx_array_index;<br> /**<br> * @reset_work:<br> *<br> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c b/drivers/gpu/drm/a= md/amdgpu/mes_userqueue.c<br> index a914198a4d62..1fd72f18e9a8 100644<br> --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c<br> +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c<br> @@ -143,10 +143,18 @@ static int mes_userq_map(struct amdgpu_usermode_queue= *queue)<br> queue_input.doorbell_offse= t =3D userq_props->doorbell_index;<br> queue_input.page_table_bas= e_addr =3D amdgpu_gmc_pd_addr(queue->vm->root.bo);<br> queue_input.wptr_mc_addr = =3D queue->wptr_obj.gpu_addr;<br> +<br> if (mes->use_rs64mem) {= <br> - &n= bsp; amdgpu_mes_alloc_proc_ctx_index(mes, queue);<br> - &n= bsp; queue_input.process_context_array_index =3D queue->proc_ctx_a= rray_index;<br> - &n= bsp; amdgpu_mes_alloc_gang_ctx_index(mes, queue);<br> + &n= bsp; if (!uq_mgr->proc_ctx_allocated) {<br> + &n= bsp; r =3D amdgpu_mes= _alloc_proc_ctx_index(mes, &uq_mgr->proc_ctx_array_index);<br> + &n= bsp; if (r) {<br> + &n= bsp;  = ; DRM_ERROR("Failed to allocate userq pr= ocess index err:%d\n", r);<br> + &n= bsp;  = ; return r;<br> + &n= bsp; }<br> + &n= bsp; uq_mgr->proc_= ctx_allocated =3D true;<br> + &n= bsp; }<br> + &n= bsp; amdgpu_mes_alloc_gang_ctx_index(mes, &queue->gang_ctx_arr= ay_index);</div> <div style=3D"font-size: 11pt;"><br> </div> <div class=3D"elementToProof" style=3D"font-size: 11pt;">Need to check the = return code, and handle error (e.g. running out of gang ctx index).</div> <div class=3D"elementToProof" style=3D"font-size: 11pt;"><br> + &n= bsp; queue_input.process_context_array_index =3D uq_mgr->proc_ctx_= array_index;<br> &nb= sp; queue_input.gang_context_array_index =3D queue->ga= ng_ctx_array_index;<br> }<br> amdgpu_mes_lock(&adev-= >mes);<br> @@ -179,10 +187,8 @@ static int mes_userq_unmap(struct amdgpu_usermode_queu= e *queue)<br> amdgpu_mes_lock(&adev-= >mes);<br> r =3D adev->mes.funcs-&= gt;remove_hw_queue(&adev->mes, &queue_input);<br> amdgpu_mes_unlock(&ade= v->mes);<br> - if (mes->use_rs64mem) {<br> - &n= bsp; amdgpu_mes_free_proc_ctx_index(mes, queue);<br> - &n= bsp; amdgpu_mes_free_gang_ctx_index(mes, queue);<br> - }<br> + if (mes->use_rs64mem)<br> + &n= bsp; amdgpu_mes_free_gang_ctx_index(mes, queue->gang_ctx_array_ind= ex);<br> if (r)<br> &nb= sp; DRM_ERROR("Failed to unmap queue in HW, err (%d)= \n", r);<br> return r;<br> --<br> 2.34.1<br> <br> </div> </body> </html> --_000_DM6PR12MB3611478BA8E7766040313BBB94D52DM6PR12MB3611namp_--