From 80013b87d940d550598486a6074f60e56dda5597 Mon Sep 17 00:00:00 2001 From: "Tao,Zhang" Date: Wed, 3 Mar 2021 11:08:38 +0800 Subject: [PATCH] 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: Tao,Zhang --- drivers/hwtracing/coresight/coresight-tmc-etr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index 16ad22fec060..378c7167cfcb 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -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; }