Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 297ef033 authored by George Shen's avatar George Shen
Browse files

msm: cvp: Fix a CVP SSR deadlock



When CVP SSR is triggred by debug node, CVP is still working,
such as sending HFI MSG back to kernel driver. While kernel
driver handles HFI MSG, there is dealock in acquiring CVP
core mutex and device mutex. They are also acquired by SSR handler.

Change-Id: I28060312f8f239dfa3ac36c5bb8c7a5b720abdc2
Signed-off-by: default avatarGeorge Shen <sqiao@codeaurora.org>
parent af2d4f76
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -2138,16 +2138,19 @@ static int iris_hfi_core_trigger_ssr(void *device,
	}

	dev = device;
	mutex_lock(&dev->lock);

	if (mutex_trylock(&dev->lock)) {
		rc = call_hfi_pkt_op(dev, ssr_cmd, type, &pkt);
		if (rc) {
		dprintk(CVP_ERR, "%s: failed to create packet\n", __func__);
			dprintk(CVP_ERR, "%s: failed to create packet\n",
					__func__);
			goto err_create_pkt;
		}

		if (__iface_cmdq_write(dev, &pkt))
			rc = -ENOTEMPTY;
	} else {
		return -EAGAIN;
	}

err_create_pkt:
	mutex_unlock(&dev->lock);
+8 −0
Original line number Diff line number Diff line
@@ -1397,6 +1397,7 @@ void msm_cvp_ssr_handler(struct work_struct *work)
		return;
	}

send_again:
	mutex_lock(&core->lock);
	if (core->state == CVP_CORE_INIT_DONE) {
		dprintk(CVP_WARN, "%s: ssr type %d\n", __func__,
@@ -1411,6 +1412,13 @@ void msm_cvp_ssr_handler(struct work_struct *work)
		rc = call_hfi_op(hdev, core_trigger_ssr,
				hdev->hfi_device_data, core->ssr_type);
		if (rc) {
			if (rc == -EAGAIN) {
				core->trigger_ssr = false;
				mutex_unlock(&core->lock);
				usleep_range(500, 1000);
				dprintk(CVP_WARN, "Retry ssr\n");
				goto send_again;
			}
			dprintk(CVP_ERR, "%s: trigger_ssr failed\n",
				__func__);
			core->trigger_ssr = false;