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

Commit 0208cdf6 authored by Xiaogang Cui's avatar Xiaogang Cui
Browse files

coresight: set etmdrvdata just before put_online_cpus



Due to race conditions, ETM initialization can fail if cpu hotplug
occurs while ETM probe is ongoing. Move etmdrvdata initialization
just before put_online_cpus() to prevent this race condition.

Change-Id: Iac943e5498d30554f5cb8bca4a9fe8e32bdf4030
Signed-off-by: default avatarXiaogang Cui <xiaogang@codeaurora.org>
parent f7d25bdf
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -2364,8 +2364,6 @@ static int etm_probe(struct platform_device *pdev)
		goto err0;
		goto err0;
	}
	}


	etmdrvdata[drvdata->cpu] = drvdata;

	if (count++ == 0)
	if (count++ == 0)
		register_hotcpu_notifier(&etm_cpu_notifier);
		register_hotcpu_notifier(&etm_cpu_notifier);


@@ -2403,20 +2401,23 @@ static int etm_probe(struct platform_device *pdev)
		}
		}
	}
	}


	etmdrvdata[drvdata->cpu] = drvdata;

	put_online_cpus();
	put_online_cpus();


	clk_disable_unprepare(drvdata->clk);
	clk_disable_unprepare(drvdata->clk);


	if (drvdata->os_unlock) {
	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);
	if (drvdata->os_unlock && !drvdata->init) {
		ret = etm_late_init(drvdata);
		ret = etm_late_init(drvdata);
		if (ret) {
		if (ret) {
			mutex_unlock(&drvdata->mutex);
			mutex_unlock(&drvdata->mutex);
			goto err1;
			goto err1;
		}
		}
		drvdata->init = true;
		drvdata->init = true;
		mutex_unlock(&drvdata->mutex);
	}
	}
	mutex_unlock(&drvdata->mutex);

	return 0;
	return 0;
err1:
err1:
	if (--count == 0)
	if (--count == 0)
+6 −5
Original line number Original line Diff line number Diff line
@@ -3441,8 +3441,6 @@ static int etm_probe(struct platform_device *pdev)
		goto err0;
		goto err0;
	}
	}


	etmdrvdata[drvdata->cpu] = drvdata;

	if (count++ == 0)
	if (count++ == 0)
		register_hotcpu_notifier(&etm_cpu_notifier);
		register_hotcpu_notifier(&etm_cpu_notifier);


@@ -3474,20 +3472,23 @@ static int etm_probe(struct platform_device *pdev)
		}
		}
	}
	}


	etmdrvdata[drvdata->cpu] = drvdata;

	put_online_cpus();
	put_online_cpus();


	clk_disable_unprepare(drvdata->clk);
	clk_disable_unprepare(drvdata->clk);


	if (drvdata->os_unlock) {
	mutex_lock(&drvdata->mutex);
	mutex_lock(&drvdata->mutex);
	if (drvdata->os_unlock && !drvdata->init) {
		ret = etm_late_init(drvdata);
		ret = etm_late_init(drvdata);
		if (ret) {
		if (ret) {
			mutex_unlock(&drvdata->mutex);
			mutex_unlock(&drvdata->mutex);
			goto err1;
			goto err1;
		}
		}
		drvdata->init = true;
		drvdata->init = true;
		mutex_unlock(&drvdata->mutex);
	}
	}
	mutex_unlock(&drvdata->mutex);

	return 0;
	return 0;
err1:
err1:
	if (--count == 0)
	if (--count == 0)