Hi Dave, Today's linux-next merge of the drm tree got conflicts in drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c and drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h between commits b8cbab042cd6 ("drm/amdkfd: Allow user to limit only queues per device") and 9fa843e76d90 ("drm/amdkfd: Fix bug in call to init_pipelines()") from Linus' tree and commits bcea30817574 ("drm/amdkfd: Add SDMA user-mode queues support to QCM") and fe502804205e ("drm/amdkfd: Remove call to deprecated init_memory interface") from the drm tree. I fixed it up (hopefully - see below) and can carry the fix as necessary (no action is required). -- Cheers, Stephen Rothwell sfr@xxxxxxxxxxxxxxxx diff --cc drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index 0d8694f015c1,b189f9791c90..000000000000 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@@ -213,15 -161,8 +168,18 @@@ static int create_queue_nocpsch(struct list_add(&q->list, &qpd->queues_list); dqm->queue_count++; + + /* + * Unconditionally increment this counter, regardless of the queue's + * type or whether the queue is active. + */ + dqm->total_queue_count++; + pr_debug("Total of %d queues are accountable so far\n", + dqm->total_queue_count); + ++ + if (q->properties.type == KFD_QUEUE_TYPE_SDMA) + dqm->sdma_queue_count++; mutex_unlock(&dqm->lock); return 0; } @@@ -588,11 -488,7 +518,7 @@@ static int init_scheduler(struct device pr_debug("kfd: In %s\n", __func__); - retval = init_pipelines(dqm, get_pipes_num(dqm), KFD_DQM_FIRST_PIPE); + retval = init_pipelines(dqm, get_pipes_num(dqm), get_first_pipe(dqm)); - if (retval != 0) - return retval; - - retval = init_memory(dqm); return retval; } @@@ -843,14 -793,12 +845,19 @@@ static int create_queue_cpsch(struct de mutex_lock(&dqm->lock); + if (dqm->total_queue_count >= max_num_of_queues_per_device) { + pr_warn("amdkfd: Can't create new usermode queue because %d queues were already created\n", + dqm->total_queue_count); + retval = -EPERM; + goto out; + } + - mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_CIK_CP); + if (q->properties.type == KFD_QUEUE_TYPE_SDMA) + select_sdma_engine_id(q); + + mqd = dqm->ops.get_mqd_manager(dqm, + get_mqd_type_from_queue_type(q->properties.type)); + if (mqd == NULL) { mutex_unlock(&dqm->lock); return -ENOMEM; @@@ -867,15 -815,9 +874,18 @@@ retval = execute_queues_cpsch(dqm, false); } + /* + * Unconditionally increment this counter, regardless of the queue's + * type or whether the queue is active. + */ + dqm->total_queue_count++; + + pr_debug("Total of %d queues are accountable so far\n", + dqm->total_queue_count); + + if (q->properties.type == KFD_QUEUE_TYPE_SDMA) + dqm->sdma_queue_count++; + out: mutex_unlock(&dqm->lock); return retval; diff --cc drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h index 52035bf0c1cb,e7b17b28330e..000000000000 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h @@@ -130,9 -143,10 +143,11 @@@ struct device_queue_manager struct list_head queues; unsigned int processes_count; unsigned int queue_count; + unsigned int total_queue_count; + unsigned int sdma_queue_count; unsigned int next_pipe_to_allocate; unsigned int *allocated_queues; + unsigned int sdma_bitmap; unsigned int vmid_bitmap; uint64_t pipelines_addr; struct kfd_mem_obj *pipeline_mem;
Attachment:
pgpFUNZ7JKlL3.pgp
Description: OpenPGP digital signature