| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Suzuki K Poulose <suzuki.poulose@arm.com> |
| Date: Mon, 5 Jun 2017 14:15:03 -0600 |
| Subject: coresight: Fix reference count for software sources |
| |
| From: Suzuki K Poulose <suzuki.poulose@arm.com> |
| |
| |
| [ Upstream commit 022aa1a81b778789ee7cf3124595854276a0330d ] |
| |
| For software sources (i.e STM), there could be multiple agents |
| generating the trace data, unlike the ETMs. So we need to |
| properly do the accounting for the active number of users |
| to disable the device when the last user goes away. Right |
| now, the reference counting is broken for sources as we skip |
| the actions when we detect that the source is enabled. |
| |
| This patch fixes the problem by adding the refcounting for |
| software sources, even when they are enabled. |
| |
| Cc: Mathieu Poirier <mathieu.poirier@linaro.org> |
| Reported-by: Robert Walker <robert.walker@arm.com> |
| Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> |
| Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/hwtracing/coresight/coresight.c | 15 +++++++++++++-- |
| 1 file changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/hwtracing/coresight/coresight.c |
| +++ b/drivers/hwtracing/coresight/coresight.c |
| @@ -498,6 +498,9 @@ int coresight_enable(struct coresight_de |
| { |
| int cpu, ret = 0; |
| struct list_head *path; |
| + enum coresight_dev_subtype_source subtype; |
| + |
| + subtype = csdev->subtype.source_subtype; |
| |
| mutex_lock(&coresight_mutex); |
| |
| @@ -505,8 +508,16 @@ int coresight_enable(struct coresight_de |
| if (ret) |
| goto out; |
| |
| - if (csdev->enable) |
| + if (csdev->enable) { |
| + /* |
| + * There could be multiple applications driving the software |
| + * source. So keep the refcount for each such user when the |
| + * source is already enabled. |
| + */ |
| + if (subtype == CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE) |
| + atomic_inc(csdev->refcnt); |
| goto out; |
| + } |
| |
| path = coresight_build_path(csdev); |
| if (IS_ERR(path)) { |
| @@ -523,7 +534,7 @@ int coresight_enable(struct coresight_de |
| if (ret) |
| goto err_source; |
| |
| - switch (csdev->subtype.source_subtype) { |
| + switch (subtype) { |
| case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC: |
| /* |
| * When working from sysFS it is important to keep track |