Re: [PATCH 3/6] drm/amdkfd: Refactor create_queue_nocpsch

2019-06-05 Thread Kuehling, Felix
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

2019-06-05 Thread Zeng, Oak
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

2019-06-03 Thread Zeng, Oak
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,