From: Oak Zeng Date: Sat, 15 Jun 2019 00:27:58 +0000 (-0500) Subject: drm/amdkfd: Fix sdma queue allocate race condition X-Git-Tag: v5.3-rc1~81^2~10^2~488 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=38bb4226ffe51b033ecc6724c00ce0dd210db248;p=linux.git drm/amdkfd: Fix sdma queue allocate race condition SDMA queue allocation requires the dqm lock as it modify the global dqm members. Enclose it in the dqm_lock. Signed-off-by: Oak Zeng Reviewed-by: Philip Yang Signed-off-by: Alex Deucher --- diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index b75ec379425c..3528590ae90b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -1144,7 +1144,9 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, if (q->properties.type == KFD_QUEUE_TYPE_SDMA || q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) { + dqm_lock(dqm); retval = allocate_sdma_queue(dqm, q); + dqm_unlock(dqm); if (retval) goto out; } @@ -1203,8 +1205,11 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, deallocate_doorbell(qpd, q); out_deallocate_sdma_queue: if (q->properties.type == KFD_QUEUE_TYPE_SDMA || - q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) + q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) { + dqm_lock(dqm); deallocate_sdma_queue(dqm, q); + dqm_unlock(dqm); + } out: return retval; }