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

Commit 80013b87 authored by Tao,Zhang's avatar Tao,Zhang
Browse files

coresight-tmc-etr: Fix deadlock issue while switching mode



In ETR mode switch stress test, there will be a deadlock issue if
fail to enable ETM source. Since switch mode function will hold
mem_lock and call tmc_disable_etr_sink if ETM failed to be enabled.
Meanwhile, tmc_disable_etr_sink also need to hold mem_lock. Release
mem_lock before calling coresight_enable_all_source_link to fix this
deadlock issue.

Change-Id: I0e9040e79e8ef5278f7b279ce2f7265147ef2b74
Signed-off-by: default avatarTao,Zhang <taozha@codeaurora.org>
parent f1a388a8
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2102,23 +2102,25 @@ int tmc_etr_switch_mode(struct tmc_drvdata *drvdata, const char *out_mode)
		return 0;
	}

	mutex_unlock(&drvdata->mem_lock);
	coresight_disable_all_source_link();
	mutex_lock(&drvdata->mem_lock);
	_tmc_disable_etr_sink(drvdata->csdev, true);
	old_mode = drvdata->out_mode;
	drvdata->out_mode = new_mode;
	if (tmc_enable_etr_sink_sysfs(drvdata->csdev)) {
		drvdata->out_mode = old_mode;
		tmc_enable_etr_sink_sysfs(drvdata->csdev);
		mutex_unlock(&drvdata->mem_lock);
		coresight_enable_all_source_link();
		dev_err(&drvdata->csdev->dev,
			"Switch to %s failed. Fall back to %s.\n",
			str_tmc_etr_out_mode[new_mode],
			str_tmc_etr_out_mode[old_mode]);
		mutex_unlock(&drvdata->mem_lock);
		return -EINVAL;
	}
	coresight_enable_all_source_link();
	mutex_unlock(&drvdata->mem_lock);
	coresight_enable_all_source_link();
	return 0;
}