diff mbox series

coresight: Fix run time warnings while reusing ETR buffer

Message ID 20230823042948.12879-1-lcherian@marvell.com (mailing list archive)
State New, archived
Headers show
Series coresight: Fix run time warnings while reusing ETR buffer | expand

Commit Message

Linu Cherian Aug. 23, 2023, 4:29 a.m. UTC
Fix the below warning by avoding calls to tmc_etr_enable_hw,
if we are reusing the ETR buffer for multiple sources in sysfs mode.

echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink
echo 1 > /sys/bus/coresight/devices/ete1/enable_source
echo 1 > /sys/bus/coresight/devices/ete2/enable_source
[  166.918290] ------------[ cut here ]------------
[  166.922905] WARNING: CPU: 4 PID: 2288 at
drivers/hwtracing/coresight/coresight-tmc-etr.c:1037
tmc_etr_enable_hw+0xb0/0xc8
[  166.933862] Modules linked in:
[  166.936911] CPU: 4 PID: 2288 Comm: bash Not tainted 6.5.0-rc7 #132
[  166.943084] Hardware name: Marvell CN106XX board (DT)
[  166.948127] pstate: 834000c9 (Nzcv daIF +PAN -UAO +TCO +DIT -SSBS
BTYPE=--)
[  166.955083] pc : tmc_etr_enable_hw+0xb0/0xc8
[  166.959345] lr : tmc_enable_etr_sink+0x134/0x210
snip..
  167.038545] Call trace:
[  167.040982]  tmc_etr_enable_hw+0xb0/0xc8
[  167.044897]  tmc_enable_etr_sink+0x134/0x210
[  167.049160]  coresight_enable_path+0x160/0x278
[  167.053596]  coresight_enable+0xd4/0x298
[  167.057510]  enable_source_store+0x54/0xa0
[  167.061598]  dev_attr_store+0x20/0x40
[  167.065254]  sysfs_kf_write+0x4c/0x68
[  167.068909]  kernfs_fop_write_iter+0x128/0x200
[  167.073345]  vfs_write+0x1ac/0x2f8
[  167.076739]  ksys_write+0x74/0x110
[  167.080132]  __arm64_sys_write+0x24/0x38
[  167.084045]  invoke_syscall.constprop.0+0x58/0xf8
[  167.088744]  do_el0_svc+0x60/0x160
[  167.092137]  el0_svc+0x40/0x170
[  167.095273]  el0t_64_sync_handler+0x100/0x130
[  167.099621]  el0t_64_sync+0x190/0x198
[  167.103277] ---[ end trace 0000000000000000 ]---
-bash: echo: write error: Device or resource busy

Fixes: 296b01fd106e ("coresight: Refactor out buffer allocation function for ETR")
Signed-off-by: Linu Cherian <lcherian@marvell.com>
---
 .../hwtracing/coresight/coresight-tmc-etr.c   | 24 ++++++++++---------
 1 file changed, 13 insertions(+), 11 deletions(-)

Comments

James Clark Sept. 15, 2023, 1:24 p.m. UTC | #1
On 23/08/2023 05:29, Linu Cherian wrote:
> Fix the below warning by avoding calls to tmc_etr_enable_hw,
> if we are reusing the ETR buffer for multiple sources in sysfs mode.
> 

The change makes sense to me. Seems like I didn't separate out the
allocation and hw_enable parts correctly when I made the change you linked.

It would be good to get some kselftests for this though as it seems like
a pretty simple scenario, and I couldn't find anything coresight related
in the selftests folder. But that's not really related to this commit so:

Reviewed-by: James Clark <james.clark@arm.com>


> echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink
> echo 1 > /sys/bus/coresight/devices/ete1/enable_source
> echo 1 > /sys/bus/coresight/devices/ete2/enable_source
> [  166.918290] ------------[ cut here ]------------
> [  166.922905] WARNING: CPU: 4 PID: 2288 at
> drivers/hwtracing/coresight/coresight-tmc-etr.c:1037
> tmc_etr_enable_hw+0xb0/0xc8
> [  166.933862] Modules linked in:
> [  166.936911] CPU: 4 PID: 2288 Comm: bash Not tainted 6.5.0-rc7 #132
> [  166.943084] Hardware name: Marvell CN106XX board (DT)
> [  166.948127] pstate: 834000c9 (Nzcv daIF +PAN -UAO +TCO +DIT -SSBS
> BTYPE=--)
> [  166.955083] pc : tmc_etr_enable_hw+0xb0/0xc8
> [  166.959345] lr : tmc_enable_etr_sink+0x134/0x210
> snip..
>   167.038545] Call trace:
> [  167.040982]  tmc_etr_enable_hw+0xb0/0xc8
> [  167.044897]  tmc_enable_etr_sink+0x134/0x210
> [  167.049160]  coresight_enable_path+0x160/0x278
> [  167.053596]  coresight_enable+0xd4/0x298
> [  167.057510]  enable_source_store+0x54/0xa0
> [  167.061598]  dev_attr_store+0x20/0x40
> [  167.065254]  sysfs_kf_write+0x4c/0x68
> [  167.068909]  kernfs_fop_write_iter+0x128/0x200
> [  167.073345]  vfs_write+0x1ac/0x2f8
> [  167.076739]  ksys_write+0x74/0x110
> [  167.080132]  __arm64_sys_write+0x24/0x38
> [  167.084045]  invoke_syscall.constprop.0+0x58/0xf8
> [  167.088744]  do_el0_svc+0x60/0x160
> [  167.092137]  el0_svc+0x40/0x170
> [  167.095273]  el0t_64_sync_handler+0x100/0x130
> [  167.099621]  el0t_64_sync+0x190/0x198
> [  167.103277] ---[ end trace 0000000000000000 ]---
> -bash: echo: write error: Device or resource busy
> 
> Fixes: 296b01fd106e ("coresight: Refactor out buffer allocation function for ETR")
> Signed-off-by: Linu Cherian <lcherian@marvell.com>
> ---
>  .../hwtracing/coresight/coresight-tmc-etr.c   | 24 ++++++++++---------
>  1 file changed, 13 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> index 766325de0e29..6a79c4dc09f2 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> @@ -1172,16 +1172,6 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
>  		goto out;
>  	}
>  
> -	/*
> -	 * In sysFS mode we can have multiple writers per sink.  Since this
> -	 * sink is already enabled no memory is needed and the HW need not be
> -	 * touched, even if the buffer size has changed.
> -	 */
> -	if (drvdata->mode == CS_MODE_SYSFS) {
> -		atomic_inc(&csdev->refcnt);
> -		goto out;
> -	}
> -
>  	/*
>  	 * If we don't have a buffer or it doesn't match the requested size,
>  	 * use the buffer allocated above. Otherwise reuse the existing buffer.
> @@ -1203,7 +1193,7 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
>  
>  static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
>  {
> -	int ret;
> +	int ret = 0;
>  	unsigned long flags;
>  	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>  	struct etr_buf *sysfs_buf = tmc_etr_get_sysfs_buffer(csdev);
> @@ -1212,12 +1202,24 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
>  		return PTR_ERR(sysfs_buf);
>  
>  	spin_lock_irqsave(&drvdata->spinlock, flags);
> +
> +	/*
> +	 * In sysFS mode we can have multiple writers per sink.  Since this
> +	 * sink is already enabled no memory is needed and the HW need not be
> +	 * touched, even if the buffer size has changed.
> +	 */
> +	if (drvdata->mode == CS_MODE_SYSFS) {
> +		atomic_inc(&csdev->refcnt);
> +		goto out;
> +	}
> +
>  	ret = tmc_etr_enable_hw(drvdata, sysfs_buf);
>  	if (!ret) {
>  		drvdata->mode = CS_MODE_SYSFS;
>  		atomic_inc(&csdev->refcnt);
>  	}
>  
> +out:
>  	spin_unlock_irqrestore(&drvdata->spinlock, flags);
>  
>  	if (!ret)
Suzuki K Poulose Sept. 18, 2023, 10:34 a.m. UTC | #2
On Wed, 23 Aug 2023 09:59:48 +0530, Linu Cherian wrote:
> Fix the below warning by avoding calls to tmc_etr_enable_hw,
> if we are reusing the ETR buffer for multiple sources in sysfs mode.
> 
> echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink
> echo 1 > /sys/bus/coresight/devices/ete1/enable_source
> echo 1 > /sys/bus/coresight/devices/ete2/enable_source
> [  166.918290] ------------[ cut here ]------------
> [  166.922905] WARNING: CPU: 4 PID: 2288 at
> drivers/hwtracing/coresight/coresight-tmc-etr.c:1037
> tmc_etr_enable_hw+0xb0/0xc8
> [  166.933862] Modules linked in:
> [  166.936911] CPU: 4 PID: 2288 Comm: bash Not tainted 6.5.0-rc7 #132
> [  166.943084] Hardware name: Marvell CN106XX board (DT)
> [  166.948127] pstate: 834000c9 (Nzcv daIF +PAN -UAO +TCO +DIT -SSBS
> BTYPE=--)
> [  166.955083] pc : tmc_etr_enable_hw+0xb0/0xc8
> [  166.959345] lr : tmc_enable_etr_sink+0x134/0x210
> snip..
>   167.038545] Call trace:
> [  167.040982]  tmc_etr_enable_hw+0xb0/0xc8
> [  167.044897]  tmc_enable_etr_sink+0x134/0x210
> [  167.049160]  coresight_enable_path+0x160/0x278
> [  167.053596]  coresight_enable+0xd4/0x298
> [  167.057510]  enable_source_store+0x54/0xa0
> [  167.061598]  dev_attr_store+0x20/0x40
> [  167.065254]  sysfs_kf_write+0x4c/0x68
> [  167.068909]  kernfs_fop_write_iter+0x128/0x200
> [  167.073345]  vfs_write+0x1ac/0x2f8
> [  167.076739]  ksys_write+0x74/0x110
> [  167.080132]  __arm64_sys_write+0x24/0x38
> [  167.084045]  invoke_syscall.constprop.0+0x58/0xf8
> [  167.088744]  do_el0_svc+0x60/0x160
> [  167.092137]  el0_svc+0x40/0x170
> [  167.095273]  el0t_64_sync_handler+0x100/0x130
> [  167.099621]  el0t_64_sync+0x190/0x198
> [  167.103277] ---[ end trace 0000000000000000 ]---
> -bash: echo: write error: Device or resource busy
> 
> [...]

Applied to fixes, thanks!

[1/1] coresight: Fix run time warnings while reusing ETR buffer
      https://git.kernel.org/coresight/c/bd2767ec3df2

Best regards,
diff mbox series

Patch

diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 766325de0e29..6a79c4dc09f2 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1172,16 +1172,6 @@  static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
 		goto out;
 	}
 
-	/*
-	 * In sysFS mode we can have multiple writers per sink.  Since this
-	 * sink is already enabled no memory is needed and the HW need not be
-	 * touched, even if the buffer size has changed.
-	 */
-	if (drvdata->mode == CS_MODE_SYSFS) {
-		atomic_inc(&csdev->refcnt);
-		goto out;
-	}
-
 	/*
 	 * If we don't have a buffer or it doesn't match the requested size,
 	 * use the buffer allocated above. Otherwise reuse the existing buffer.
@@ -1203,7 +1193,7 @@  static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
 
 static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
 {
-	int ret;
+	int ret = 0;
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 	struct etr_buf *sysfs_buf = tmc_etr_get_sysfs_buffer(csdev);
@@ -1212,12 +1202,24 @@  static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
 		return PTR_ERR(sysfs_buf);
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
+
+	/*
+	 * In sysFS mode we can have multiple writers per sink.  Since this
+	 * sink is already enabled no memory is needed and the HW need not be
+	 * touched, even if the buffer size has changed.
+	 */
+	if (drvdata->mode == CS_MODE_SYSFS) {
+		atomic_inc(&csdev->refcnt);
+		goto out;
+	}
+
 	ret = tmc_etr_enable_hw(drvdata, sysfs_buf);
 	if (!ret) {
 		drvdata->mode = CS_MODE_SYSFS;
 		atomic_inc(&csdev->refcnt);
 	}
 
+out:
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (!ret)