dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Sasha Levin <sashal@kernel.org>, Amber Lin <Amber.Lin@amd.com>,
	Felix Kuehling <Felix.Kuehling@amd.com>,
	dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org,
	Alex Deucher <alexander.deucher@amd.com>
Subject: [PATCH AUTOSEL 5.10 086/137] drm/amdkfd: Fix circular lock in nocpsch path
Date: Tue,  6 Jul 2021 07:21:12 -0400	[thread overview]
Message-ID: <20210706112203.2062605-86-sashal@kernel.org> (raw)
In-Reply-To: <20210706112203.2062605-1-sashal@kernel.org>

From: Amber Lin <Amber.Lin@amd.com>

[ Upstream commit a7b2451d31cfa2e8aeccf3b35612ce33f02371fc ]

Calling free_mqd inside of destroy_queue_nocpsch_locked can cause a
circular lock. destroy_queue_nocpsch_locked is called under a DQM lock,
which is taken in MMU notifiers, potentially in FS reclaim context.
Taking another lock, which is BO reservation lock from free_mqd, while
causing an FS reclaim inside the DQM lock creates a problematic circular
lock dependency. Therefore move free_mqd out of
destroy_queue_nocpsch_locked and call it after unlocking DQM.

Signed-off-by: Amber Lin <Amber.Lin@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c  | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 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 b971532e69eb..ffb3d37881a8 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -486,9 +486,6 @@ static int destroy_queue_nocpsch_locked(struct device_queue_manager *dqm,
 	if (retval == -ETIME)
 		qpd->reset_wavefronts = true;
 
-
-	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
-
 	list_del(&q->list);
 	if (list_empty(&qpd->queues_list)) {
 		if (qpd->reset_wavefronts) {
@@ -523,6 +520,8 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
 	int retval;
 	uint64_t sdma_val = 0;
 	struct kfd_process_device *pdd = qpd_to_pdd(qpd);
+	struct mqd_manager *mqd_mgr =
+		dqm->mqd_mgrs[get_mqd_type_from_queue_type(q->properties.type)];
 
 	/* Get the SDMA queue stats */
 	if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
@@ -540,6 +539,8 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
 		pdd->sdma_past_activity_counter += sdma_val;
 	dqm_unlock(dqm);
 
+	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
+
 	return retval;
 }
 
@@ -1632,7 +1633,7 @@ static int set_trap_handler(struct device_queue_manager *dqm,
 static int process_termination_nocpsch(struct device_queue_manager *dqm,
 		struct qcm_process_device *qpd)
 {
-	struct queue *q, *next;
+	struct queue *q;
 	struct device_process_node *cur, *next_dpn;
 	int retval = 0;
 	bool found = false;
@@ -1640,12 +1641,19 @@ static int process_termination_nocpsch(struct device_queue_manager *dqm,
 	dqm_lock(dqm);
 
 	/* Clear all user mode queues */
-	list_for_each_entry_safe(q, next, &qpd->queues_list, list) {
+	while (!list_empty(&qpd->queues_list)) {
+		struct mqd_manager *mqd_mgr;
 		int ret;
 
+		q = list_first_entry(&qpd->queues_list, struct queue, list);
+		mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
+				q->properties.type)];
 		ret = destroy_queue_nocpsch_locked(dqm, qpd, q);
 		if (ret)
 			retval = ret;
+		dqm_unlock(dqm);
+		mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
+		dqm_lock(dqm);
 	}
 
 	/* Unregister process */
-- 
2.30.2


  parent reply	other threads:[~2021-07-06 11:23 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-06 11:19 [PATCH AUTOSEL 5.10 001/137] drm/etnaviv: fix NULL check before some freeing functions is not needed Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 002/137] drm/mxsfb: Don't select DRM_KMS_FB_HELPER Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 003/137] drm/zte: " Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 004/137] drm/ast: Fixed CVE for DP501 Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 005/137] drm/amd/display: fix HDCP reset sequence on reinitialize Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 006/137] drm/amd/amdgpu/sriov disable all ip hw status by default Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 007/137] drm/vc4: fix argument ordering in vc4_crtc_get_margins() Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 008/137] drm/bridge: nwl-dsi: Force a full modeset when crtc_state->active is changed to be true Sasha Levin
2021-07-06 11:19 ` [PATCH AUTOSEL 5.10 010/137] drm/amd/display: fix use_max_lb flag for 420 pixel formats Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 017/137] drm/mediatek: Fix PM reference leak in mtk_crtc_ddp_hw_init() Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 019/137] drm/bridge: lt9611: Add missing MODULE_DEVICE_TABLE Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 021/137] drm/virtio: Fixes a potential NULL pointer dereference on probe failure Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 022/137] drm/virtio: Fix double free " Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 027/137] drm/scheduler: Fix hang when sched_entity released Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 028/137] drm/sched: Avoid data corruptions Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 030/137] drm/vc4: Fix clock source for VEC PixelValve on BCM2711 Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 031/137] drm/vc4: hdmi: Fix PM reference leak in vc4_hdmi_encoder_pre_crtc_co() Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 035/137] drm/bridge: cdns: Fix PM reference leak in cdns_dsi_transfer() Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 039/137] drm: rockchip: add missing registers for RK3188 Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 040/137] drm: rockchip: add missing registers for RK3066 Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 045/137] drm: bridge: cdns-mhdp8546: Fix PM reference leak in Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 050/137] drm/amd/display: Avoid HDCP over-read and corruption Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 051/137] drm/amdgpu: remove unsafe optimization to drop preamble ib Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 067/137] drm/amd/display: Fix DCN 3.01 DSCCLK validation Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 068/137] drm/amd/display: Update scaling settings on modeset Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 069/137] drm/amd/display: Release MST resources on switch from MST to SST Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 070/137] drm/amd/display: Set DISPCLK_MAX_ERRDET_CYCLES to 7 Sasha Levin
2021-07-06 11:20 ` [PATCH AUTOSEL 5.10 071/137] drm/amd/display: Fix off-by-one error in DML Sasha Levin
2021-07-06 11:21 ` [PATCH AUTOSEL 5.10 075/137] drm/amdkfd: use allowed domain for vmbo validation Sasha Levin
2021-07-06 11:21 ` [PATCH AUTOSEL 5.10 079/137] drm/amd/display: Verify Gamma & Degamma LUT sizes in amdgpu_dm_atomic_check Sasha Levin
2021-07-06 11:21 ` [PATCH AUTOSEL 5.10 085/137] drm/amdkfd: fix circular locking on get_wave_state Sasha Levin
2021-07-06 11:21 ` Sasha Levin [this message]
2021-07-06 11:21 ` [PATCH AUTOSEL 5.10 095/137] drm/amdgpu: fix bad address translation for sienna_cichlid Sasha Levin
2021-07-06 11:21 ` [PATCH AUTOSEL 5.10 096/137] drm/amdkfd: Walk through list with dqm lock hold Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210706112203.2062605-86-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=Amber.Lin@amd.com \
    --cc=Felix.Kuehling@amd.com \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox