aboutsummaryrefslogtreecommitdiff
path: root/drivers/hwtracing
diff options
context:
space:
mode:
authorGravatar Tingwei Zhang <tingwei@codeaurora.org> 2020-09-28 10:35:08 -0600
committerGravatar Greg Kroah-Hartman <gregkh@linuxfoundation.org> 2020-09-28 19:47:41 +0200
commitf02b089e7bddd2f66e63f926960a4e384b1f436d (patch)
tree24e4529cc2f248b6e5895ca081fa96ef50c6dbb2 /drivers/hwtracing
parentcoresight: cti: Don't disable ect device if it's not enabled (diff)
downloadlinux-f02b089e7bddd2f66e63f926960a4e384b1f436d.tar.gz
linux-f02b089e7bddd2f66e63f926960a4e384b1f436d.tar.bz2
linux-f02b089e7bddd2f66e63f926960a4e384b1f436d.zip
coresight: cti: Increase reference count when enabling cti
CTI device is enabled when associated coresight device is enabled. Increase the module and device reference count for CTI device when it's enabled. This can prevent CTI device be removed or module be unloaded when CTI device is enabled by an active trace session. Signed-off-by: Mike Leach <mike.leach@linaro.org> Signed-off-by: Tingwei Zhang <tingwei@codeaurora.org> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Link: https://lore.kernel.org/r/20200928163513.70169-21-mathieu.poirier@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hwtracing')
-rw-r--r--drivers/hwtracing/coresight/coresight.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c
index 711beb92166a..546c97045afe 100644
--- a/drivers/hwtracing/coresight/coresight.c
+++ b/drivers/hwtracing/coresight/coresight.c
@@ -241,19 +241,30 @@ coresight_control_assoc_ectdev(struct coresight_device *csdev, bool enable)
{
int ect_ret = 0;
struct coresight_device *ect_csdev = csdev->ect_dev;
+ struct module *mod;
if (!ect_csdev)
return 0;
if ((!ect_ops(ect_csdev)->enable) || (!ect_ops(ect_csdev)->disable))
return 0;
+ mod = ect_csdev->dev.parent->driver->owner;
if (enable) {
- ect_ret = ect_ops(ect_csdev)->enable(ect_csdev);
- if (!ect_ret)
- csdev->ect_enabled = true;
+ if (try_module_get(mod)) {
+ ect_ret = ect_ops(ect_csdev)->enable(ect_csdev);
+ if (ect_ret) {
+ module_put(mod);
+ } else {
+ get_device(ect_csdev->dev.parent);
+ csdev->ect_enabled = true;
+ }
+ } else
+ ect_ret = -ENODEV;
} else {
if (csdev->ect_enabled) {
ect_ret = ect_ops(ect_csdev)->disable(ect_csdev);
+ put_device(ect_csdev->dev.parent);
+ module_put(mod);
csdev->ect_enabled = false;
}
}