@@ -223,6 +223,19 @@ static int amdgpu_userqueue_create(struct drm_file *filp, union drm_amdgpu_userq
223223 return r ;
224224}
225225
226+ static int amdgpu_userqueue_release (int queue_id , void * ptr , void * data )
227+ {
228+ struct amdgpu_userq_mgr * uq_mgr = data ;
229+ struct amdgpu_usermode_queue * queue = ptr ;
230+
231+ mutex_lock (& uq_mgr -> userq_mutex );
232+ uq_mgr -> userq_funcs [queue -> queue_type ]-> mqd_destroy (uq_mgr , queue );
233+ amdgpu_userqueue_free_index (uq_mgr , queue -> queue_id );
234+ mutex_unlock (& uq_mgr -> userq_mutex );
235+ kfree (queue );
236+ return 0 ;
237+ }
238+
226239static void amdgpu_userqueue_destroy (struct drm_file * filp , int queue_id )
227240{
228241 struct amdgpu_fpriv * fpriv = filp -> driver_priv ;
@@ -235,11 +248,7 @@ static void amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id)
235248 return ;
236249 }
237250
238- mutex_lock (& uq_mgr -> userq_mutex );
239- uq_mgr -> userq_funcs [queue -> queue_type ]-> mqd_destroy (uq_mgr , queue );
240- amdgpu_userqueue_free_index (uq_mgr , queue -> queue_id );
241- mutex_unlock (& uq_mgr -> userq_mutex );
242- kfree (queue );
251+ amdgpu_userqueue_release (queue_id , queue , uq_mgr );
243252}
244253
245254int amdgpu_userq_ioctl (struct drm_device * dev , void * data ,
@@ -293,6 +302,8 @@ int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *userq_mgr, struct amdgpu_devi
293302
294303void amdgpu_userq_mgr_fini (struct amdgpu_userq_mgr * userq_mgr )
295304{
305+ idr_for_each (& userq_mgr -> userq_idr ,
306+ & amdgpu_userqueue_release , userq_mgr );
296307 idr_destroy (& userq_mgr -> userq_idr );
297308 mutex_destroy (& userq_mgr -> userq_mutex );
298309}
0 commit comments