Skip to content

Commit

Permalink
Revert "drm/amdkfd: avoid HMM change cause circular lock"
Browse files Browse the repository at this point in the history
This reverts commit 8dd69e6.

This depends on an HMM fix which is not upstream yet.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Alex Deucher committed Mar 28, 2019
1 parent 318c3f4 commit 20d0592
Showing 1 changed file with 15 additions and 17 deletions.
32 changes: 15 additions & 17 deletions drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
Original file line number Diff line number Diff line change
@@ -1162,17 +1162,21 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
int retval;
struct mqd_manager *mqd_mgr;

retval = 0;

dqm_lock(dqm);

if (dqm->total_queue_count >= max_num_of_queues_per_device) {
pr_warn("Can't create new usermode queue because %d queues were already created\n",
dqm->total_queue_count);
retval = -EPERM;
goto out;
goto out_unlock;
}

if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
retval = allocate_sdma_queue(dqm, &q->sdma_id);
if (retval)
goto out;
goto out_unlock;
q->properties.sdma_queue_id =
q->sdma_id / get_num_sdma_engines(dqm);
q->properties.sdma_engine_id =
@@ -1183,17 +1187,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
if (retval)
goto out_deallocate_sdma_queue;

/* Do init_mqd before dqm_lock(dqm) to avoid circular locking order:
* lock(dqm) -> bo::reserve
*/
mqd_mgr = dqm->ops.get_mqd_manager(dqm,
get_mqd_type_from_queue_type(q->properties.type));

if (!mqd_mgr) {
retval = -ENOMEM;
goto out_deallocate_doorbell;
}

/*
* Eviction state logic: we only mark active queues as evicted
* to avoid the overhead of restoring inactive queues later
@@ -1202,16 +1202,16 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
q->properties.is_evicted = (q->properties.queue_size > 0 &&
q->properties.queue_percent > 0 &&
q->properties.queue_address != 0);

dqm->asic_ops.init_sdma_vm(dqm, q, qpd);

q->properties.tba_addr = qpd->tba_addr;
q->properties.tma_addr = qpd->tma_addr;
retval = mqd_mgr->init_mqd(mqd_mgr, &q->mqd, &q->mqd_mem_obj,
&q->gart_mqd_addr, &q->properties);
if (retval)
goto out_deallocate_doorbell;

dqm_lock(dqm);

list_add(&q->list, &qpd->queues_list);
qpd->queue_count++;
if (q->properties.is_active) {
@@ -1239,7 +1239,9 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
out_deallocate_sdma_queue:
if (q->properties.type == KFD_QUEUE_TYPE_SDMA)
deallocate_sdma_queue(dqm, q->sdma_id);
out:
out_unlock:
dqm_unlock(dqm);

return retval;
}

@@ -1402,6 +1404,8 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,
qpd->reset_wavefronts = true;
}

mqd_mgr->uninit_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);

/*
* Unconditionally decrement this counter, regardless of the queue's
* type
@@ -1412,9 +1416,6 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,

dqm_unlock(dqm);

/* Do uninit_mqd after dqm_unlock(dqm) to avoid circular locking */
mqd_mgr->uninit_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);

return retval;

failed:
@@ -1636,11 +1637,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
qpd->reset_wavefronts = false;
}

dqm_unlock(dqm);

/* Lastly, free mqd resources.
* Do uninit_mqd() after dqm_unlock to avoid circular locking.
*/
/* lastly, free mqd resources */
list_for_each_entry_safe(q, next, &qpd->queues_list, list) {
mqd_mgr = dqm->ops.get_mqd_manager(dqm,
get_mqd_type_from_queue_type(q->properties.type));
@@ -1654,6 +1651,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
}

out:
dqm_unlock(dqm);
return retval;
}

0 comments on commit 20d0592

Please sign in to comment.