Re: [PATCH 3/6] drm/amdkfd: Refactor create_queue_nocpsch
Patches 1-3 are Reviewed-by: Felix Kuehling On 2019-06-05 12:06 p.m., Zeng, Oak wrote: > This is prepare work to fix a circular lock dependency. > No logic change > > Change-Id: I4e0ee918260e7780de972dd71f4ce787b4f6dde9 > Signed-off-by: Oak Zeng > --- > .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 171 > +++-- > 1 file changed, 57 insertions(+), 114 deletions(-) > > 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 dab6ef4..3c042eb 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c > @@ -42,10 +42,6 @@ > static int set_pasid_vmid_mapping(struct device_queue_manager *dqm, > unsigned int pasid, unsigned int vmid); > > -static int create_compute_queue_nocpsch(struct device_queue_manager *dqm, > - struct queue *q, > - struct qcm_process_device *qpd); > - > static int execute_queues_cpsch(struct device_queue_manager *dqm, > enum kfd_unmap_queues_filter filter, > uint32_t filter_param); > @@ -55,13 +51,14 @@ static int unmap_queues_cpsch(struct device_queue_manager > *dqm, > > static int map_queues_cpsch(struct device_queue_manager *dqm); > > -static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, > - struct queue *q, > - struct qcm_process_device *qpd); > - > static void deallocate_sdma_queue(struct device_queue_manager *dqm, > struct queue *q); > > +static inline void deallocate_hqd(struct device_queue_manager *dqm, > + struct queue *q); > +static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q); > +static int allocate_sdma_queue(struct device_queue_manager *dqm, > + struct queue *q); > static void kfd_process_hw_exception(struct work_struct *work); > > static inline > @@ -223,6 +220,9 @@ static int allocate_vmid(struct device_queue_manager *dqm, > /* invalidate the VM context after pasid and vmid mapping is set up */ > kfd_flush_tlb(qpd_to_pdd(qpd)); > > + dqm->dev->kfd2kgd->set_scratch_backing_va( > + dqm->dev->kgd, qpd->sh_hidden_private_base, qpd->vmid); > + > return 0; > } > > @@ -269,6 +269,7 @@ static int create_queue_nocpsch(struct > device_queue_manager *dqm, > struct queue *q, > struct qcm_process_device *qpd) > { > + struct mqd_manager *mqd_mgr; > int retval; > > print_queue(q); > @@ -298,18 +299,41 @@ static int create_queue_nocpsch(struct > device_queue_manager *dqm, > q->properties.tba_addr = qpd->tba_addr; > q->properties.tma_addr = qpd->tma_addr; > > - if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) > - retval = create_compute_queue_nocpsch(dqm, q, qpd); > - else if (q->properties.type == KFD_QUEUE_TYPE_SDMA || > - q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) > - retval = create_sdma_queue_nocpsch(dqm, q, qpd); > - else > - retval = -EINVAL; > + mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( > + q->properties.type)]; > + if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) { > + retval = allocate_hqd(dqm, q); > + if (retval) > + goto deallocate_vmid; > + pr_debug("Loading mqd to hqd on pipe %d, queue %d\n", > + q->pipe, q->queue); > + } else if (q->properties.type == KFD_QUEUE_TYPE_SDMA || > + q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) { > + retval = allocate_sdma_queue(dqm, q); > + if (retval) > + goto deallocate_vmid; > + dqm->asic_ops.init_sdma_vm(dqm, q, qpd); > + } > > - if (retval) { > - if (list_empty(>queues_list)) > - deallocate_vmid(dqm, qpd, q); > - goto out_unlock; > + retval = allocate_doorbell(qpd, q); > + if (retval) > + goto out_deallocate_hqd; > + > + retval = mqd_mgr->init_mqd(mqd_mgr, >mqd, >mqd_mem_obj, > + >gart_mqd_addr, >properties); > + if (retval) > + goto out_deallocate_doorbell; > + > + if (q->properties.is_active) { > + > + if (WARN(q->process->mm != current->mm, > + "should only run in user thread")) > + retval = -EFAULT; > + else > + retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd, q->pipe, > + q->queue, >properties, current->mm); > +
[PATCH 3/6] drm/amdkfd: Refactor create_queue_nocpsch
This is prepare work to fix a circular lock dependency. No logic change Change-Id: I4e0ee918260e7780de972dd71f4ce787b4f6dde9 Signed-off-by: Oak Zeng --- .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 171 +++-- 1 file changed, 57 insertions(+), 114 deletions(-) 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 dab6ef4..3c042eb 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -42,10 +42,6 @@ static int set_pasid_vmid_mapping(struct device_queue_manager *dqm, unsigned int pasid, unsigned int vmid); -static int create_compute_queue_nocpsch(struct device_queue_manager *dqm, - struct queue *q, - struct qcm_process_device *qpd); - static int execute_queues_cpsch(struct device_queue_manager *dqm, enum kfd_unmap_queues_filter filter, uint32_t filter_param); @@ -55,13 +51,14 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm, static int map_queues_cpsch(struct device_queue_manager *dqm); -static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, - struct queue *q, - struct qcm_process_device *qpd); - static void deallocate_sdma_queue(struct device_queue_manager *dqm, struct queue *q); +static inline void deallocate_hqd(struct device_queue_manager *dqm, + struct queue *q); +static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q); +static int allocate_sdma_queue(struct device_queue_manager *dqm, + struct queue *q); static void kfd_process_hw_exception(struct work_struct *work); static inline @@ -223,6 +220,9 @@ static int allocate_vmid(struct device_queue_manager *dqm, /* invalidate the VM context after pasid and vmid mapping is set up */ kfd_flush_tlb(qpd_to_pdd(qpd)); + dqm->dev->kfd2kgd->set_scratch_backing_va( + dqm->dev->kgd, qpd->sh_hidden_private_base, qpd->vmid); + return 0; } @@ -269,6 +269,7 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, struct queue *q, struct qcm_process_device *qpd) { + struct mqd_manager *mqd_mgr; int retval; print_queue(q); @@ -298,18 +299,41 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, q->properties.tba_addr = qpd->tba_addr; q->properties.tma_addr = qpd->tma_addr; - if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) - retval = create_compute_queue_nocpsch(dqm, q, qpd); - else if (q->properties.type == KFD_QUEUE_TYPE_SDMA || - q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) - retval = create_sdma_queue_nocpsch(dqm, q, qpd); - else - retval = -EINVAL; + mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( + q->properties.type)]; + if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) { + retval = allocate_hqd(dqm, q); + if (retval) + goto deallocate_vmid; + pr_debug("Loading mqd to hqd on pipe %d, queue %d\n", + q->pipe, q->queue); + } else if (q->properties.type == KFD_QUEUE_TYPE_SDMA || + q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) { + retval = allocate_sdma_queue(dqm, q); + if (retval) + goto deallocate_vmid; + dqm->asic_ops.init_sdma_vm(dqm, q, qpd); + } - if (retval) { - if (list_empty(>queues_list)) - deallocate_vmid(dqm, qpd, q); - goto out_unlock; + retval = allocate_doorbell(qpd, q); + if (retval) + goto out_deallocate_hqd; + + retval = mqd_mgr->init_mqd(mqd_mgr, >mqd, >mqd_mem_obj, + >gart_mqd_addr, >properties); + if (retval) + goto out_deallocate_doorbell; + + if (q->properties.is_active) { + + if (WARN(q->process->mm != current->mm, + "should only run in user thread")) + retval = -EFAULT; + else + retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd, q->pipe, + q->queue, >properties, current->mm); + if (retval) + goto out_uninit_mqd; } list_add(>list, >queues_list); @@ -329,7 +353,21 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm,
[PATCH 3/6] drm/amdkfd: Refactor create_queue_nocpsch
This is prepare work to fix a circular lock dependency. No logic change Change-Id: I4e0ee918260e7780de972dd71f4ce787b4f6dde9 Signed-off-by: Oak Zeng --- .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 171 +++-- 1 file changed, 57 insertions(+), 114 deletions(-) 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 dc1a70b..dc34e0e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -42,10 +42,6 @@ static int set_pasid_vmid_mapping(struct device_queue_manager *dqm, unsigned int pasid, unsigned int vmid); -static int create_compute_queue_nocpsch(struct device_queue_manager *dqm, - struct queue *q, - struct qcm_process_device *qpd); - static int execute_queues_cpsch(struct device_queue_manager *dqm, enum kfd_unmap_queues_filter filter, uint32_t filter_param); @@ -55,13 +51,14 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm, static int map_queues_cpsch(struct device_queue_manager *dqm); -static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, - struct queue *q, - struct qcm_process_device *qpd); - static void deallocate_sdma_queue(struct device_queue_manager *dqm, struct queue *q); +static inline void deallocate_hqd(struct device_queue_manager *dqm, + struct queue *q); +static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q); +static int allocate_sdma_queue(struct device_queue_manager *dqm, + struct queue *q); static void kfd_process_hw_exception(struct work_struct *work); static inline @@ -223,6 +220,9 @@ static int allocate_vmid(struct device_queue_manager *dqm, /* invalidate the VM context after pasid and vmid mapping is set up */ kfd_flush_tlb(qpd_to_pdd(qpd)); + dqm->dev->kfd2kgd->set_scratch_backing_va( + dqm->dev->kgd, qpd->sh_hidden_private_base, qpd->vmid); + return 0; } @@ -269,6 +269,7 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, struct queue *q, struct qcm_process_device *qpd) { + struct mqd_manager *mqd_mgr; int retval; print_queue(q); @@ -300,18 +301,41 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, q->properties.tba_addr = qpd->tba_addr; q->properties.tma_addr = qpd->tma_addr; - if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) - retval = create_compute_queue_nocpsch(dqm, q, qpd); - else if (q->properties.type == KFD_QUEUE_TYPE_SDMA || - q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) - retval = create_sdma_queue_nocpsch(dqm, q, qpd); - else - retval = -EINVAL; + mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( + q->properties.type)]; + if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) { + retval = allocate_hqd(dqm, q); + if (retval) + goto deallocate_vmid; + pr_debug("Loading mqd to hqd on pipe %d, queue %d\n", + q->pipe, q->queue); + } else if (q->properties.type == KFD_QUEUE_TYPE_SDMA || + q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) { + retval = allocate_sdma_queue(dqm, q); + if (retval) + goto deallocate_vmid; + dqm->asic_ops.init_sdma_vm(dqm, q, qpd); + } - if (retval) { - if (list_empty(>queues_list)) - deallocate_vmid(dqm, qpd, q); - goto out_unlock; + retval = allocate_doorbell(qpd, q); + if (retval) + goto out_deallocate_hqd; + + retval = mqd_mgr->init_mqd(mqd_mgr, >mqd, >mqd_mem_obj, + >gart_mqd_addr, >properties); + if (retval) + goto out_deallocate_doorbell; + + if (q->properties.is_active) { + + if (WARN(q->process->mm != current->mm, + "should only run in user thread")) + retval = -EFAULT; + else + retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd, q->pipe, + q->queue, >properties, current->mm); + if (retval) + goto out_uninit_mqd; } list_add(>list, >queues_list); @@ -331,7 +355,21 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm,