linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
@ 2024-12-16 11:49 Yeoreum Yun
  2024-12-16 11:49 ` [PATCH v3 1/9] coresight: change coresight_device lock " Yeoreum Yun
                   ` (9 more replies)
  0 siblings, 10 replies; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:49 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In some coresight drivers, drvdata->spinlock can be held during __schedule()
by perf_event_task_sched_out()/in().

Since drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this,change type drvdata->spinlock in some coresight drivers,
which can be called by perf_event_task_sched_out()/in(),
from spinlock_t to raw_spinlock_t.

Reviewed-by: James Clark <james.clark@linaro.org>

v2 to v3:
    - Fix build error

v1 to v2:
    - seperate patchsets to change locktype and apply gurad API.

Yeoreum Yun (9):
  coresight: change coresight_device lock type to  raw_spinlock_t
  coresight-etm4x: change etmv4_drvdata spinlock type to  raw_spinlock_t
  coresight: change coresight_trace_id_map's lock type to
    raw_spinlock_t
  coresight-cti: change cti_drvdata spinlock's type to raw_spinlock_t
  coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t
  coresight-funnel: change funnel_drvdata spinlock's type to
    raw_spinlock_t
  coresight-replicator: change replicator_drvdata spinlock's type to
    raw_spinlock_t
  coresight-tmc: change tmc_drvdata spinlock's type to raw_spinlock_t
  coresight/ultrasoc: change cti_drvdata spinlock's type to
    raw_spinlock_t

 .../hwtracing/coresight/coresight-config.c    |   8 +-
 .../hwtracing/coresight/coresight-config.h    |   2 +-
 drivers/hwtracing/coresight/coresight-core.c  |   2 +-
 .../hwtracing/coresight/coresight-cti-core.c  |  44 +--
 .../hwtracing/coresight/coresight-cti-sysfs.c |  76 +++---
 drivers/hwtracing/coresight/coresight-cti.h   |   2 +-
 drivers/hwtracing/coresight/coresight-etb10.c |  26 +-
 .../coresight/coresight-etm4x-core.c          |  18 +-
 .../coresight/coresight-etm4x-sysfs.c         | 250 +++++++++---------
 drivers/hwtracing/coresight/coresight-etm4x.h |   2 +-
 .../hwtracing/coresight/coresight-funnel.c    |  12 +-
 .../coresight/coresight-replicator.c          |  12 +-
 .../hwtracing/coresight/coresight-syscfg.c    |  26 +-
 .../hwtracing/coresight/coresight-tmc-core.c  |   6 +-
 .../hwtracing/coresight/coresight-tmc-etf.c   |  48 ++--
 .../hwtracing/coresight/coresight-tmc-etr.c   |  40 +--
 drivers/hwtracing/coresight/coresight-tmc.h   |   2 +-
 .../hwtracing/coresight/coresight-trace-id.c  |  22 +-
 drivers/hwtracing/coresight/ultrasoc-smb.c    |  12 +-
 drivers/hwtracing/coresight/ultrasoc-smb.h    |   2 +-
 include/linux/coresight.h                     |   4 +-
 21 files changed, 308 insertions(+), 308 deletions(-)

--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply	[flat|nested] 29+ messages in thread

* [PATCH v3 1/9] coresight: change coresight_device lock type to  raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
@ 2024-12-16 11:49 ` Yeoreum Yun
  2024-12-19 12:23   ` Mike Leach
  2024-12-16 11:49 ` [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock " Yeoreum Yun
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:49 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

coresight_device->cscfg_csdev_lock can be held during __schedule()
by perf_event_task_sched_out()/in().

Since coresight->cscfg_csdev_lock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type of coresight_device->cscfg_csdev_lock
from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 .../hwtracing/coresight/coresight-syscfg.c    | 26 +++++++++----------
 include/linux/coresight.h                     |  2 +-
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c
index 11138a9762b0..a70c1454b410 100644
--- a/drivers/hwtracing/coresight/coresight-syscfg.c
+++ b/drivers/hwtracing/coresight/coresight-syscfg.c
@@ -89,9 +89,9 @@ static int cscfg_add_csdev_cfg(struct coresight_device *csdev,
 	}
 	/* if matched features, add config to device.*/
 	if (config_csdev) {
-		spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
+		raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
 		list_add(&config_csdev->node, &csdev->config_csdev_list);
-		spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
+		raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
 	}
 
 	return 0;
@@ -194,9 +194,9 @@ static int cscfg_load_feat_csdev(struct coresight_device *csdev,
 
 	/* add to internal csdev feature list & initialise using reset call */
 	cscfg_reset_feat(feat_csdev);
-	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
 	list_add(&feat_csdev->node, &csdev->feature_csdev_list);
-	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
 
 	return 0;
 }
@@ -765,7 +765,7 @@ static int cscfg_list_add_csdev(struct coresight_device *csdev,
 
 	INIT_LIST_HEAD(&csdev->feature_csdev_list);
 	INIT_LIST_HEAD(&csdev->config_csdev_list);
-	spin_lock_init(&csdev->cscfg_csdev_lock);
+	raw_spin_lock_init(&csdev->cscfg_csdev_lock);
 
 	return 0;
 }
@@ -855,7 +855,7 @@ void cscfg_csdev_reset_feats(struct coresight_device *csdev)
 	struct cscfg_feature_csdev *feat_csdev;
 	unsigned long flags;
 
-	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
 	if (list_empty(&csdev->feature_csdev_list))
 		goto unlock_exit;
 
@@ -863,7 +863,7 @@ void cscfg_csdev_reset_feats(struct coresight_device *csdev)
 		cscfg_reset_feat(feat_csdev);
 
 unlock_exit:
-	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
 }
 EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats);
 
@@ -1059,7 +1059,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
 	 * Look for matching configuration - set the active configuration
 	 * context if found.
 	 */
-	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
 	list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) {
 		config_desc = config_csdev_item->config_desc;
 		if ((atomic_read(&config_desc->active_cnt)) &&
@@ -1069,7 +1069,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
 			break;
 		}
 	}
-	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
 
 	/*
 	 * If found, attempt to enable
@@ -1090,12 +1090,12 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
 			 *
 			 * Set enabled if OK, err if not.
 			 */
-			spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
+			raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
 			if (csdev->active_cscfg_ctxt)
 				config_csdev_active->enabled = true;
 			else
 				err = -EBUSY;
-			spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
+			raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
 		}
 	}
 	return err;
@@ -1124,7 +1124,7 @@ void cscfg_csdev_disable_active_config(struct coresight_device *csdev)
 	 * If it was not enabled, we have no work to do, otherwise mark as disabled.
 	 * Clear the active config pointer.
 	 */
-	spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
 	config_csdev = (struct cscfg_config_csdev *)csdev->active_cscfg_ctxt;
 	if (config_csdev) {
 		if (!config_csdev->enabled)
@@ -1133,7 +1133,7 @@ void cscfg_csdev_disable_active_config(struct coresight_device *csdev)
 			config_csdev->enabled = false;
 	}
 	csdev->active_cscfg_ctxt = NULL;
-	spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
+	raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
 
 	/* true if there was an enabled active config */
 	if (config_csdev)
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index c13342594278..924b58c343b3 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -296,7 +296,7 @@ struct coresight_device {
 	/* system configuration and feature lists */
 	struct list_head feature_csdev_list;
 	struct list_head config_csdev_list;
-	spinlock_t cscfg_csdev_lock;
+	raw_spinlock_t cscfg_csdev_lock;
 	void *active_cscfg_ctxt;
 };
 
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
  2024-12-16 11:49 ` [PATCH v3 1/9] coresight: change coresight_device lock " Yeoreum Yun
@ 2024-12-16 11:49 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 3/9] coresight: change coresight_trace_id_map's lock " Yeoreum Yun
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:49 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In coresight-etm4x drivers, etmv4_drvdata->spinlock can be held during
__schedule() by perf_event_task_sched_out()/in().

Since etmv4_drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type etmv4_drvdata->spinlock
in coresight-etm4x drivers, which can be called
by perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 .../hwtracing/coresight/coresight-config.c    |   8 +-
 .../hwtracing/coresight/coresight-config.h    |   2 +-
 .../coresight/coresight-etm4x-core.c          |  18 +-
 .../coresight/coresight-etm4x-sysfs.c         | 250 +++++++++---------
 drivers/hwtracing/coresight/coresight-etm4x.h |   2 +-
 5 files changed, 140 insertions(+), 140 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-config.c b/drivers/hwtracing/coresight/coresight-config.c
index 4723bf7402a2..4f72ae71b696 100644
--- a/drivers/hwtracing/coresight/coresight-config.c
+++ b/drivers/hwtracing/coresight/coresight-config.c
@@ -76,10 +76,10 @@ static int cscfg_set_on_enable(struct cscfg_feature_csdev *feat_csdev)
 	unsigned long flags;
 	int i;
 
-	spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
+	raw_spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
 	for (i = 0; i < feat_csdev->nr_regs; i++)
 		cscfg_set_reg(&feat_csdev->regs_csdev[i]);
-	spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
+	raw_spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
 	dev_dbg(&feat_csdev->csdev->dev, "Feature %s: %s",
 		feat_csdev->feat_desc->name, "set on enable");
 	return 0;
@@ -91,10 +91,10 @@ static void cscfg_save_on_disable(struct cscfg_feature_csdev *feat_csdev)
 	unsigned long flags;
 	int i;
 
-	spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
+	raw_spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
 	for (i = 0; i < feat_csdev->nr_regs; i++)
 		cscfg_save_reg(&feat_csdev->regs_csdev[i]);
-	spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
+	raw_spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
 	dev_dbg(&feat_csdev->csdev->dev, "Feature %s: %s",
 		feat_csdev->feat_desc->name, "save on disable");
 }
diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h
index 6ba013975741..b9ebc9fcfb7f 100644
--- a/drivers/hwtracing/coresight/coresight-config.h
+++ b/drivers/hwtracing/coresight/coresight-config.h
@@ -206,7 +206,7 @@ struct cscfg_feature_csdev {
 	const struct cscfg_feature_desc *feat_desc;
 	struct coresight_device *csdev;
 	struct list_head node;
-	spinlock_t *drv_spinlock;
+	raw_spinlock_t *drv_spinlock;
 	int nr_params;
 	struct cscfg_parameter_csdev *params_csdev;
 	int nr_regs;
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
index dd8c74f893db..86893115df17 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
@@ -807,7 +807,7 @@ static int etm4_enable_sysfs(struct coresight_device *csdev)
 			return ret;
 	}
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/* sysfs needs to read and allocate a trace ID */
 	ret = etm4_read_alloc_trace_id(drvdata);
@@ -830,7 +830,7 @@ static int etm4_enable_sysfs(struct coresight_device *csdev)
 		etm4_release_trace_id(drvdata);
 
 unlock_sysfs_enable:
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	if (!ret)
 		dev_dbg(&csdev->dev, "ETM tracing enabled\n");
@@ -977,7 +977,7 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
 	 * DYING hotplug callback is serviced by the ETM driver.
 	 */
 	cpus_read_lock();
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/*
 	 * Executing etm4_disable_hw on the cpu whose ETM is being disabled
@@ -985,7 +985,7 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
 	 */
 	smp_call_function_single(drvdata->cpu, etm4_disable_hw, drvdata, 1);
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	cpus_read_unlock();
 
 	/*
@@ -1663,13 +1663,13 @@ static int etm4_starting_cpu(unsigned int cpu)
 	if (!etmdrvdata[cpu])
 		return 0;
 
-	spin_lock(&etmdrvdata[cpu]->spinlock);
+	raw_spin_lock(&etmdrvdata[cpu]->spinlock);
 	if (!etmdrvdata[cpu]->os_unlock)
 		etm4_os_unlock(etmdrvdata[cpu]);
 
 	if (coresight_get_mode(etmdrvdata[cpu]->csdev))
 		etm4_enable_hw(etmdrvdata[cpu]);
-	spin_unlock(&etmdrvdata[cpu]->spinlock);
+	raw_spin_unlock(&etmdrvdata[cpu]->spinlock);
 	return 0;
 }
 
@@ -1678,10 +1678,10 @@ static int etm4_dying_cpu(unsigned int cpu)
 	if (!etmdrvdata[cpu])
 		return 0;
 
-	spin_lock(&etmdrvdata[cpu]->spinlock);
+	raw_spin_lock(&etmdrvdata[cpu]->spinlock);
 	if (coresight_get_mode(etmdrvdata[cpu]->csdev))
 		etm4_disable_hw(etmdrvdata[cpu]);
-	spin_unlock(&etmdrvdata[cpu]->spinlock);
+	raw_spin_unlock(&etmdrvdata[cpu]->spinlock);
 	return 0;
 }
 
@@ -2125,7 +2125,7 @@ static int etm4_probe(struct device *dev)
 			return -ENOMEM;
 	}
 
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 
 	drvdata->cpu = coresight_get_cpu(dev);
 	if (drvdata->cpu < 0)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
index a9f19629f3f8..11e865b8e824 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
@@ -174,7 +174,7 @@ static ssize_t reset_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	if (val)
 		config->mode = 0x0;
 
@@ -266,7 +266,7 @@ static ssize_t reset_store(struct device *dev,
 	config->vmid_mask0 = 0x0;
 	config->vmid_mask1 = 0x0;
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	/* for sysfs - only release trace id when resetting */
 	etm4_release_trace_id(drvdata);
@@ -300,7 +300,7 @@ static ssize_t mode_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->mode = val & ETMv4_MODE_ALL;
 
 	if (drvdata->instrp0 == true) {
@@ -437,7 +437,7 @@ static ssize_t mode_store(struct device *dev,
 	if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
 		etm4_config_trace_mode(config);
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	return size;
 }
@@ -466,14 +466,14 @@ static ssize_t pe_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	if (val > drvdata->nr_pe) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EINVAL;
 	}
 
 	config->pe_sel = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(pe);
@@ -501,7 +501,7 @@ static ssize_t event_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	switch (drvdata->nr_event) {
 	case 0x0:
 		/* EVENT0, bits[7:0] */
@@ -522,7 +522,7 @@ static ssize_t event_store(struct device *dev,
 	default:
 		break;
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(event);
@@ -550,7 +550,7 @@ static ssize_t event_instren_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	/* start by clearing all instruction event enable bits */
 	config->eventctrl1 &= ~TRCEVENTCTL1R_INSTEN_MASK;
 	switch (drvdata->nr_event) {
@@ -578,7 +578,7 @@ static ssize_t event_instren_store(struct device *dev,
 	default:
 		break;
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(event_instren);
@@ -739,11 +739,11 @@ static ssize_t event_vinst_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val &= TRCVICTLR_EVENT_MASK >> __bf_shf(TRCVICTLR_EVENT_MASK);
 	config->vinst_ctrl &= ~TRCVICTLR_EVENT_MASK;
 	config->vinst_ctrl |= FIELD_PREP(TRCVICTLR_EVENT_MASK, val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(event_vinst);
@@ -771,13 +771,13 @@ static ssize_t s_exlevel_vinst_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	/* clear all EXLEVEL_S bits  */
 	config->vinst_ctrl &= ~TRCVICTLR_EXLEVEL_S_MASK;
 	/* enable instruction tracing for corresponding exception level */
 	val &= drvdata->s_ex_level;
 	config->vinst_ctrl |= val << __bf_shf(TRCVICTLR_EXLEVEL_S_MASK);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(s_exlevel_vinst);
@@ -806,13 +806,13 @@ static ssize_t ns_exlevel_vinst_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	/* clear EXLEVEL_NS bits  */
 	config->vinst_ctrl &= ~TRCVICTLR_EXLEVEL_NS_MASK;
 	/* enable instruction tracing for corresponding exception level */
 	val &= drvdata->ns_ex_level;
 	config->vinst_ctrl |= val << __bf_shf(TRCVICTLR_EXLEVEL_NS_MASK);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(ns_exlevel_vinst);
@@ -846,9 +846,9 @@ static ssize_t addr_idx_store(struct device *dev,
 	 * Use spinlock to ensure index doesn't change while it gets
 	 * dereferenced multiple times within a spinlock block elsewhere.
 	 */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->addr_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_idx);
@@ -862,7 +862,7 @@ static ssize_t addr_instdatatype_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	val = FIELD_GET(TRCACATRn_TYPE_MASK, config->addr_acc[idx]);
 	len = scnprintf(buf, PAGE_SIZE, "%s\n",
@@ -870,7 +870,7 @@ static ssize_t addr_instdatatype_show(struct device *dev,
 			(val == TRCACATRn_TYPE_DATA_LOAD_ADDR ? "data_load" :
 			(val == TRCACATRn_TYPE_DATA_STORE_ADDR ? "data_store" :
 			"data_load_store")));
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return len;
 }
 
@@ -888,13 +888,13 @@ static ssize_t addr_instdatatype_store(struct device *dev,
 	if (sscanf(buf, "%s", str) != 1)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (!strcmp(str, "instr"))
 		/* TYPE, bits[1:0] */
 		config->addr_acc[idx] &= ~TRCACATRn_TYPE_MASK;
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_instdatatype);
@@ -909,14 +909,14 @@ static ssize_t addr_single_show(struct device *dev,
 	struct etmv4_config *config = &drvdata->config;
 
 	idx = config->addr_idx;
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 	      config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 	val = (unsigned long)config->addr_val[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -932,17 +932,17 @@ static ssize_t addr_single_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 	      config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
 	config->addr_val[idx] = (u64)val;
 	config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_single);
@@ -956,23 +956,23 @@ static ssize_t addr_range_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (idx % 2 != 0) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 	if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
 	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
 	      (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
 	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
 	val1 = (unsigned long)config->addr_val[idx];
 	val2 = (unsigned long)config->addr_val[idx + 1];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
 }
 
@@ -995,10 +995,10 @@ static ssize_t addr_range_store(struct device *dev,
 	if (val1 > val2)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (idx % 2 != 0) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
@@ -1006,7 +1006,7 @@ static ssize_t addr_range_store(struct device *dev,
 	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
 	      (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
 	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
@@ -1023,7 +1023,7 @@ static ssize_t addr_range_store(struct device *dev,
 		exclude = config->mode & ETM_MODE_EXCLUDE;
 	etm4_set_mode_exclude(drvdata, exclude ? true : false);
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_range);
@@ -1037,17 +1037,17 @@ static ssize_t addr_start_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 
 	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 	      config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
 	val = (unsigned long)config->addr_val[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1063,22 +1063,22 @@ static ssize_t addr_start_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (!drvdata->nr_addr_cmp) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EINVAL;
 	}
 	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 	      config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
 	config->addr_val[idx] = (u64)val;
 	config->addr_type[idx] = ETM_ADDR_TYPE_START;
 	config->vissctlr |= BIT(idx);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_start);
@@ -1092,17 +1092,17 @@ static ssize_t addr_stop_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 
 	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 	      config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
 	val = (unsigned long)config->addr_val[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1118,22 +1118,22 @@ static ssize_t addr_stop_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (!drvdata->nr_addr_cmp) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EINVAL;
 	}
 	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 	       config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
-		spin_unlock(&drvdata->spinlock);
+		raw_spin_unlock(&drvdata->spinlock);
 		return -EPERM;
 	}
 
 	config->addr_val[idx] = (u64)val;
 	config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
 	config->vissctlr |= BIT(idx + 16);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_stop);
@@ -1147,14 +1147,14 @@ static ssize_t addr_ctxtype_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	/* CONTEXTTYPE, bits[3:2] */
 	val = FIELD_GET(TRCACATRn_CONTEXTTYPE_MASK, config->addr_acc[idx]);
 	len = scnprintf(buf, PAGE_SIZE, "%s\n", val == ETM_CTX_NONE ? "none" :
 			(val == ETM_CTX_CTXID ? "ctxid" :
 			(val == ETM_CTX_VMID ? "vmid" : "all")));
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return len;
 }
 
@@ -1172,7 +1172,7 @@ static ssize_t addr_ctxtype_store(struct device *dev,
 	if (sscanf(buf, "%s", str) != 1)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	if (!strcmp(str, "none"))
 		/* start by clearing context type bits */
@@ -1199,7 +1199,7 @@ static ssize_t addr_ctxtype_store(struct device *dev,
 		if (drvdata->numvmidc)
 			config->addr_acc[idx] |= TRCACATRn_CONTEXTTYPE_VMID;
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_ctxtype);
@@ -1213,11 +1213,11 @@ static ssize_t addr_context_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	/* context ID comparator bits[6:4] */
 	val = FIELD_GET(TRCACATRn_CONTEXT_MASK, config->addr_acc[idx]);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1238,12 +1238,12 @@ static ssize_t addr_context_store(struct device *dev,
 		     drvdata->numcidc : drvdata->numvmidc))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	/* clear context ID comparator bits[6:4] */
 	config->addr_acc[idx] &= ~TRCACATRn_CONTEXT_MASK;
 	config->addr_acc[idx] |= val << __bf_shf(TRCACATRn_CONTEXT_MASK);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_context);
@@ -1257,10 +1257,10 @@ static ssize_t addr_exlevel_s_ns_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	val = FIELD_GET(TRCACATRn_EXLEVEL_MASK, config->addr_acc[idx]);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1279,12 +1279,12 @@ static ssize_t addr_exlevel_s_ns_store(struct device *dev,
 	if (val & ~(TRCACATRn_EXLEVEL_MASK >> __bf_shf(TRCACATRn_EXLEVEL_MASK)))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	/* clear Exlevel_ns & Exlevel_s bits[14:12, 11:8], bit[15] is res0 */
 	config->addr_acc[idx] &= ~TRCACATRn_EXLEVEL_MASK;
 	config->addr_acc[idx] |= val << __bf_shf(TRCACATRn_EXLEVEL_MASK);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(addr_exlevel_s_ns);
@@ -1307,7 +1307,7 @@ static ssize_t addr_cmp_view_show(struct device *dev,
 	int size = 0;
 	bool exclude = false;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->addr_idx;
 	addr_v = config->addr_val[idx];
 	addr_ctrl = config->addr_acc[idx];
@@ -1322,7 +1322,7 @@ static ssize_t addr_cmp_view_show(struct device *dev,
 		}
 		exclude = config->viiectlr & BIT(idx / 2 + 16);
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	if (addr_type) {
 		size = scnprintf(buf, PAGE_SIZE, "addr_cmp[%i] %s %#lx", idx,
 				 addr_type_names[addr_type], addr_v);
@@ -1366,9 +1366,9 @@ static ssize_t vinst_pe_cmp_start_stop_store(struct device *dev,
 	if (!drvdata->nr_pe_cmp)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->vipcssctlr = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(vinst_pe_cmp_start_stop);
@@ -1402,9 +1402,9 @@ static ssize_t seq_idx_store(struct device *dev,
 	 * Use spinlock to ensure index doesn't change while it gets
 	 * dereferenced multiple times within a spinlock block elsewhere.
 	 */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->seq_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(seq_idx);
@@ -1448,10 +1448,10 @@ static ssize_t seq_event_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->seq_idx;
 	val = config->seq_ctrl[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1467,11 +1467,11 @@ static ssize_t seq_event_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->seq_idx;
 	/* Seq control has two masks B[15:8] F[7:0] */
 	config->seq_ctrl[idx] = val & 0xFFFF;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(seq_event);
@@ -1535,9 +1535,9 @@ static ssize_t cntr_idx_store(struct device *dev,
 	 * Use spinlock to ensure index doesn't change while it gets
 	 * dereferenced multiple times within a spinlock block elsewhere.
 	 */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->cntr_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(cntr_idx);
@@ -1551,10 +1551,10 @@ static ssize_t cntrldvr_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->cntr_idx;
 	val = config->cntrldvr[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1572,10 +1572,10 @@ static ssize_t cntrldvr_store(struct device *dev,
 	if (val > ETM_CNTR_MAX_VAL)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->cntr_idx;
 	config->cntrldvr[idx] = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(cntrldvr);
@@ -1589,10 +1589,10 @@ static ssize_t cntr_val_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->cntr_idx;
 	val = config->cntr_val[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1610,10 +1610,10 @@ static ssize_t cntr_val_store(struct device *dev,
 	if (val > ETM_CNTR_MAX_VAL)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->cntr_idx;
 	config->cntr_val[idx] = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(cntr_val);
@@ -1627,10 +1627,10 @@ static ssize_t cntr_ctrl_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->cntr_idx;
 	val = config->cntr_ctrl[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1646,10 +1646,10 @@ static ssize_t cntr_ctrl_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->cntr_idx;
 	config->cntr_ctrl[idx] = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(cntr_ctrl);
@@ -1687,9 +1687,9 @@ static ssize_t res_idx_store(struct device *dev,
 	 * Use spinlock to ensure index doesn't change while it gets
 	 * dereferenced multiple times within a spinlock block elsewhere.
 	 */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->res_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(res_idx);
@@ -1703,10 +1703,10 @@ static ssize_t res_ctrl_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->res_idx;
 	val = config->res_ctrl[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1722,7 +1722,7 @@ static ssize_t res_ctrl_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->res_idx;
 	/* For odd idx pair inversal bit is RES0 */
 	if (idx % 2 != 0)
@@ -1732,7 +1732,7 @@ static ssize_t res_ctrl_store(struct device *dev,
 				       TRCRSCTLRn_INV |
 				       TRCRSCTLRn_GROUP_MASK |
 				       TRCRSCTLRn_SELECT_MASK);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(res_ctrl);
@@ -1761,9 +1761,9 @@ static ssize_t sshot_idx_store(struct device *dev,
 	if (val >= drvdata->nr_ss_cmp)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->ss_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(sshot_idx);
@@ -1776,9 +1776,9 @@ static ssize_t sshot_ctrl_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val = config->ss_ctrl[config->ss_idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1794,12 +1794,12 @@ static ssize_t sshot_ctrl_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->ss_idx;
 	config->ss_ctrl[idx] = FIELD_PREP(TRCSSCCRn_SAC_ARC_RST_MASK, val);
 	/* must clear bit 31 in related status register on programming */
 	config->ss_status[idx] &= ~TRCSSCSRn_STATUS;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(sshot_ctrl);
@@ -1811,9 +1811,9 @@ static ssize_t sshot_status_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val = config->ss_status[config->ss_idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 static DEVICE_ATTR_RO(sshot_status);
@@ -1826,9 +1826,9 @@ static ssize_t sshot_pe_ctrl_show(struct device *dev,
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct etmv4_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val = config->ss_pe_cmp[config->ss_idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1844,12 +1844,12 @@ static ssize_t sshot_pe_ctrl_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->ss_idx;
 	config->ss_pe_cmp[idx] = FIELD_PREP(TRCSSPCICRn_PC_MASK, val);
 	/* must clear bit 31 in related status register on programming */
 	config->ss_status[idx] &= ~TRCSSCSRn_STATUS;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(sshot_pe_ctrl);
@@ -1883,9 +1883,9 @@ static ssize_t ctxid_idx_store(struct device *dev,
 	 * Use spinlock to ensure index doesn't change while it gets
 	 * dereferenced multiple times within a spinlock block elsewhere.
 	 */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->ctxid_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(ctxid_idx);
@@ -1906,10 +1906,10 @@ static ssize_t ctxid_pid_show(struct device *dev,
 	if (task_active_pid_ns(current) != &init_pid_ns)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->ctxid_idx;
 	val = (unsigned long)config->ctxid_pid[idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -1944,10 +1944,10 @@ static ssize_t ctxid_pid_store(struct device *dev,
 	if (kstrtoul(buf, 16, &pid))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	idx = config->ctxid_idx;
 	config->ctxid_pid[idx] = (u64)pid;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(ctxid_pid);
@@ -1967,10 +1967,10 @@ static ssize_t ctxid_masks_show(struct device *dev,
 	if (task_active_pid_ns(current) != &init_pid_ns)
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val1 = config->ctxid_mask0;
 	val2 = config->ctxid_mask1;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
 }
 
@@ -2003,7 +2003,7 @@ static ssize_t ctxid_masks_store(struct device *dev,
 	if ((drvdata->numcidc > 4) && (nr_inputs != 2))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	/*
 	 * each byte[0..3] controls mask value applied to ctxid
 	 * comparator[0..3]
@@ -2075,7 +2075,7 @@ static ssize_t ctxid_masks_store(struct device *dev,
 			mask >>= 0x8;
 	}
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(ctxid_masks);
@@ -2109,9 +2109,9 @@ static ssize_t vmid_idx_store(struct device *dev,
 	 * Use spinlock to ensure index doesn't change while it gets
 	 * dereferenced multiple times within a spinlock block elsewhere.
 	 */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->vmid_idx = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(vmid_idx);
@@ -2131,9 +2131,9 @@ static ssize_t vmid_val_show(struct device *dev,
 	if (!task_is_in_init_pid_ns(current))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val = (unsigned long)config->vmid_val[config->vmid_idx];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
 
@@ -2161,9 +2161,9 @@ static ssize_t vmid_val_store(struct device *dev,
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->vmid_val[config->vmid_idx] = (u64)val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(vmid_val);
@@ -2182,10 +2182,10 @@ static ssize_t vmid_masks_show(struct device *dev,
 	if (!task_is_in_init_pid_ns(current))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val1 = config->vmid_mask0;
 	val2 = config->vmid_mask1;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
 }
 
@@ -2217,7 +2217,7 @@ static ssize_t vmid_masks_store(struct device *dev,
 	if ((drvdata->numvmidc > 4) && (nr_inputs != 2))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/*
 	 * each byte[0..3] controls mask value applied to vmid
@@ -2290,7 +2290,7 @@ static ssize_t vmid_masks_store(struct device *dev,
 		else
 			mask >>= 0x8;
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(vmid_masks);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
index 9e9165f62e81..366f8f23a3e5 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.h
+++ b/drivers/hwtracing/coresight/coresight-etm4x.h
@@ -989,7 +989,7 @@ struct etmv4_drvdata {
 	struct clk			*pclk;
 	void __iomem			*base;
 	struct coresight_device		*csdev;
-	spinlock_t			spinlock;
+	raw_spinlock_t			spinlock;
 	int				cpu;
 	u8				arch;
 	u8				nr_pe;
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 3/9] coresight: change coresight_trace_id_map's lock type to  raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
  2024-12-16 11:49 ` [PATCH v3 1/9] coresight: change coresight_device lock " Yeoreum Yun
  2024-12-16 11:49 ` [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 4/9] coresight-cti: change cti_drvdata spinlock's " Yeoreum Yun
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

coresight_trace_id_map->lock can be acquired while coresight devices'
drvdata_lock.

But the drvdata_lock can be raw_spinlock_t (i.e) coresight-etm4x.

To address this, change type of coresight_trace_id_map->lock to
raw_spinlock_t

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 drivers/hwtracing/coresight/coresight-core.c  |  2 +-
 .../hwtracing/coresight/coresight-trace-id.c  | 22 +++++++++----------
 include/linux/coresight.h                     |  2 +-
 3 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
index ea38ecf26fcb..cc2d87b2f248 100644
--- a/drivers/hwtracing/coresight/coresight-core.c
+++ b/drivers/hwtracing/coresight/coresight-core.c
@@ -1164,7 +1164,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
 
 	if (csdev->type == CORESIGHT_DEV_TYPE_SINK ||
 	    csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) {
-		spin_lock_init(&csdev->perf_sink_id_map.lock);
+		raw_spin_lock_init(&csdev->perf_sink_id_map.lock);
 		csdev->perf_sink_id_map.cpu_map = alloc_percpu(atomic_t);
 		if (!csdev->perf_sink_id_map.cpu_map) {
 			kfree(csdev);
diff --git a/drivers/hwtracing/coresight/coresight-trace-id.c b/drivers/hwtracing/coresight/coresight-trace-id.c
index d98e12cb30ec..a6531869e9ec 100644
--- a/drivers/hwtracing/coresight/coresight-trace-id.c
+++ b/drivers/hwtracing/coresight/coresight-trace-id.c
@@ -16,7 +16,7 @@
 static DEFINE_PER_CPU(atomic_t, id_map_default_cpu_ids) = ATOMIC_INIT(0);
 static struct coresight_trace_id_map id_map_default = {
 	.cpu_map = &id_map_default_cpu_ids,
-	.lock = __SPIN_LOCK_UNLOCKED(id_map_default.lock)
+	.lock = __RAW_SPIN_LOCK_UNLOCKED(id_map_default.lock)
 };
 
 /* #define TRACE_ID_DEBUG 1 */
@@ -121,11 +121,11 @@ static void coresight_trace_id_release_all(struct coresight_trace_id_map *id_map
 	unsigned long flags;
 	int cpu;
 
-	spin_lock_irqsave(&id_map->lock, flags);
+	raw_spin_lock_irqsave(&id_map->lock, flags);
 	bitmap_zero(id_map->used_ids, CORESIGHT_TRACE_IDS_MAX);
 	for_each_possible_cpu(cpu)
 		atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), 0);
-	spin_unlock_irqrestore(&id_map->lock, flags);
+	raw_spin_unlock_irqrestore(&id_map->lock, flags);
 	DUMP_ID_MAP(id_map);
 }
 
@@ -134,7 +134,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
 	unsigned long flags;
 	int id;
 
-	spin_lock_irqsave(&id_map->lock, flags);
+	raw_spin_lock_irqsave(&id_map->lock, flags);
 
 	/* check for existing allocation for this CPU */
 	id = _coresight_trace_id_read_cpu_id(cpu, id_map);
@@ -161,7 +161,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
 	atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), id);
 
 get_cpu_id_out_unlock:
-	spin_unlock_irqrestore(&id_map->lock, flags);
+	raw_spin_unlock_irqrestore(&id_map->lock, flags);
 
 	DUMP_ID_CPU(cpu, id);
 	DUMP_ID_MAP(id_map);
@@ -178,12 +178,12 @@ static void _coresight_trace_id_put_cpu_id(int cpu, struct coresight_trace_id_ma
 	if (!id)
 		return;
 
-	spin_lock_irqsave(&id_map->lock, flags);
+	raw_spin_lock_irqsave(&id_map->lock, flags);
 
 	coresight_trace_id_free(id, id_map);
 	atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), 0);
 
-	spin_unlock_irqrestore(&id_map->lock, flags);
+	raw_spin_unlock_irqrestore(&id_map->lock, flags);
 	DUMP_ID_CPU(cpu, id);
 	DUMP_ID_MAP(id_map);
 }
@@ -193,10 +193,10 @@ static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *i
 	unsigned long flags;
 	int id;
 
-	spin_lock_irqsave(&id_map->lock, flags);
+	raw_spin_lock_irqsave(&id_map->lock, flags);
 	/* prefer odd IDs for system components to avoid legacy CPU IDS */
 	id = coresight_trace_id_alloc_new_id(id_map, 0, true);
-	spin_unlock_irqrestore(&id_map->lock, flags);
+	raw_spin_unlock_irqrestore(&id_map->lock, flags);
 
 	DUMP_ID(id);
 	DUMP_ID_MAP(id_map);
@@ -207,9 +207,9 @@ static void coresight_trace_id_map_put_system_id(struct coresight_trace_id_map *
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&id_map->lock, flags);
+	raw_spin_lock_irqsave(&id_map->lock, flags);
 	coresight_trace_id_free(id, id_map);
-	spin_unlock_irqrestore(&id_map->lock, flags);
+	raw_spin_unlock_irqrestore(&id_map->lock, flags);
 
 	DUMP_ID(id);
 	DUMP_ID_MAP(id_map);
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index 924b58c343b3..6446ca1f09d8 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -233,7 +233,7 @@ struct coresight_trace_id_map {
 	DECLARE_BITMAP(used_ids, CORESIGHT_TRACE_IDS_MAX);
 	atomic_t __percpu *cpu_map;
 	atomic_t perf_cs_etm_session_active;
-	spinlock_t lock;
+	raw_spinlock_t lock;
 };
 
 /**
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 4/9] coresight-cti: change cti_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (2 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 3/9] coresight: change coresight_trace_id_map's lock " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 5/9] coresight-etb10: change etb_drvdata " Yeoreum Yun
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In coresight-cti drivers, cti_drvdata->spinlock can be held during __schedule()
by perf_event_task_sched_out()/in().

Since cti_drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type cti_drvdata->spinlock in coresight-cti drivers,
which can be called by perf_event_task_sched_out()/in(),
from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 .../hwtracing/coresight/coresight-cti-core.c  | 44 +++++------
 .../hwtracing/coresight/coresight-cti-sysfs.c | 76 +++++++++----------
 drivers/hwtracing/coresight/coresight-cti.h   |  2 +-
 3 files changed, 61 insertions(+), 61 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-cti-core.c b/drivers/hwtracing/coresight/coresight-cti-core.c
index d2b5a5718c29..80f6265e3740 100644
--- a/drivers/hwtracing/coresight/coresight-cti-core.c
+++ b/drivers/hwtracing/coresight/coresight-cti-core.c
@@ -93,7 +93,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
 	unsigned long flags;
 	int rc = 0;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* no need to do anything if enabled or unpowered*/
 	if (config->hw_enabled || !config->hw_powered)
@@ -108,7 +108,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
 
 	config->hw_enabled = true;
 	drvdata->config.enable_req_count++;
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 	return rc;
 
 cti_state_unchanged:
@@ -116,7 +116,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
 
 	/* cannot enable due to error */
 cti_err_not_enabled:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 	return rc;
 }
 
@@ -125,7 +125,7 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata)
 {
 	struct cti_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	config->hw_powered = true;
 
 	/* no need to do anything if no enable request */
@@ -138,12 +138,12 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata)
 
 	cti_write_all_hw_regs(drvdata);
 	config->hw_enabled = true;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return;
 
 	/* did not re-enable due to no claim / no request */
 cti_hp_not_enabled:
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 }
 
 /* disable hardware */
@@ -153,7 +153,7 @@ static int cti_disable_hw(struct cti_drvdata *drvdata)
 	struct coresight_device *csdev = drvdata->csdev;
 	int ret = 0;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/* don't allow negative refcounts, return an error */
 	if (!drvdata->config.enable_req_count) {
@@ -177,12 +177,12 @@ static int cti_disable_hw(struct cti_drvdata *drvdata)
 
 	coresight_disclaim_device_unlocked(csdev);
 	CS_LOCK(drvdata->base);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return ret;
 
 	/* not disabled this call */
 cti_not_disabled:
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return ret;
 }
 
@@ -198,11 +198,11 @@ void cti_write_intack(struct device *dev, u32 ackval)
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct cti_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	/* write if enabled */
 	if (cti_active(config))
 		cti_write_single_reg(drvdata, CTIINTACK, ackval);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 }
 
 /*
@@ -369,7 +369,7 @@ int cti_channel_trig_op(struct device *dev, enum cti_chan_op op,
 	reg_offset = (direction == CTI_TRIG_IN ? CTIINEN(trigger_idx) :
 		      CTIOUTEN(trigger_idx));
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/* read - modify write - the trigger / channel enable value */
 	reg_value = direction == CTI_TRIG_IN ? config->ctiinen[trigger_idx] :
@@ -388,7 +388,7 @@ int cti_channel_trig_op(struct device *dev, enum cti_chan_op op,
 	/* write through if enabled */
 	if (cti_active(config))
 		cti_write_single_reg(drvdata, reg_offset, reg_value);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return 0;
 }
 
@@ -406,7 +406,7 @@ int cti_channel_gate_op(struct device *dev, enum cti_chan_gate_op op,
 
 	chan_bitmask = BIT(channel_idx);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	reg_value = config->ctigate;
 	switch (op) {
 	case CTI_GATE_CHAN_ENABLE:
@@ -426,7 +426,7 @@ int cti_channel_gate_op(struct device *dev, enum cti_chan_gate_op op,
 		if (cti_active(config))
 			cti_write_single_reg(drvdata, CTIGATE, reg_value);
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return err;
 }
 
@@ -445,7 +445,7 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
 
 	chan_bitmask = BIT(channel_idx);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	reg_value = config->ctiappset;
 	switch (op) {
 	case CTI_CHAN_SET:
@@ -473,7 +473,7 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
 
 	if ((err == 0) && cti_active(config))
 		cti_write_single_reg(drvdata, reg_offset, reg_value);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	return err;
 }
@@ -676,7 +676,7 @@ static int cti_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
 	if (WARN_ON_ONCE(drvdata->ctidev.cpu != cpu))
 		return NOTIFY_BAD;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	switch (cmd) {
 	case CPU_PM_ENTER:
@@ -716,7 +716,7 @@ static int cti_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
 	}
 
 cti_notify_exit:
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return notify_res;
 }
 
@@ -743,11 +743,11 @@ static int cti_dying_cpu(unsigned int cpu)
 	if (!drvdata)
 		return 0;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	drvdata->config.hw_powered = false;
 	if (drvdata->config.hw_enabled)
 		coresight_disclaim_device(drvdata->csdev);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return 0;
 }
 
@@ -888,7 +888,7 @@ static int cti_probe(struct amba_device *adev, const struct amba_id *id)
 	drvdata->ctidev.ctm_id = 0;
 	INIT_LIST_HEAD(&drvdata->ctidev.trig_cons);
 
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 
 	/* initialise CTI driver config values */
 	cti_set_default_config(dev, drvdata);
diff --git a/drivers/hwtracing/coresight/coresight-cti-sysfs.c b/drivers/hwtracing/coresight/coresight-cti-sysfs.c
index d25dd2737b49..572b80ee96fb 100644
--- a/drivers/hwtracing/coresight/coresight-cti-sysfs.c
+++ b/drivers/hwtracing/coresight/coresight-cti-sysfs.c
@@ -84,11 +84,11 @@ static ssize_t enable_show(struct device *dev,
 	bool enabled, powered;
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	enable_req = drvdata->config.enable_req_count;
 	powered = drvdata->config.hw_powered;
 	enabled = drvdata->config.hw_enabled;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	if (powered)
 		return sprintf(buf, "%d\n", enabled);
@@ -134,9 +134,9 @@ static ssize_t powered_show(struct device *dev,
 	bool powered;
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	powered = drvdata->config.hw_powered;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	return sprintf(buf, "%d\n", powered);
 }
@@ -181,10 +181,10 @@ static ssize_t coresight_cti_reg_show(struct device *dev,
 	u32 val = 0;
 
 	pm_runtime_get_sync(dev->parent);
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	if (drvdata->config.hw_powered)
 		val = readl_relaxed(drvdata->base + cti_attr->off);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	pm_runtime_put_sync(dev->parent);
 	return sysfs_emit(buf, "0x%x\n", val);
 }
@@ -202,10 +202,10 @@ static __maybe_unused ssize_t coresight_cti_reg_store(struct device *dev,
 		return -EINVAL;
 
 	pm_runtime_get_sync(dev->parent);
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	if (drvdata->config.hw_powered)
 		cti_write_single_reg(drvdata, cti_attr->off, val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	pm_runtime_put_sync(dev->parent);
 	return size;
 }
@@ -264,7 +264,7 @@ static ssize_t cti_reg32_show(struct device *dev, char *buf,
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct cti_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	if ((reg_offset >= 0) && cti_active(config)) {
 		CS_UNLOCK(drvdata->base);
 		val = readl_relaxed(drvdata->base + reg_offset);
@@ -274,7 +274,7 @@ static ssize_t cti_reg32_show(struct device *dev, char *buf,
 	} else if (pcached_val) {
 		val = *pcached_val;
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return sprintf(buf, "%#x\n", val);
 }
 
@@ -293,7 +293,7 @@ static ssize_t cti_reg32_store(struct device *dev, const char *buf,
 	if (kstrtoul(buf, 0, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	/* local store */
 	if (pcached_val)
 		*pcached_val = (u32)val;
@@ -301,7 +301,7 @@ static ssize_t cti_reg32_store(struct device *dev, const char *buf,
 	/* write through if offset and enabled */
 	if ((reg_offset >= 0) && cti_active(config))
 		cti_write_single_reg(drvdata, reg_offset, val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 
@@ -349,9 +349,9 @@ static ssize_t inout_sel_store(struct device *dev,
 	if (val > (CTIINOUTEN_MAX - 1))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	drvdata->config.ctiinout_sel = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(inout_sel);
@@ -364,10 +364,10 @@ static ssize_t inen_show(struct device *dev,
 	int index;
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	index = drvdata->config.ctiinout_sel;
 	val = drvdata->config.ctiinen[index];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return sprintf(buf, "%#lx\n", val);
 }
 
@@ -383,14 +383,14 @@ static ssize_t inen_store(struct device *dev,
 	if (kstrtoul(buf, 0, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	index = config->ctiinout_sel;
 	config->ctiinen[index] = val;
 
 	/* write through if enabled */
 	if (cti_active(config))
 		cti_write_single_reg(drvdata, CTIINEN(index), val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(inen);
@@ -403,10 +403,10 @@ static ssize_t outen_show(struct device *dev,
 	int index;
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	index = drvdata->config.ctiinout_sel;
 	val = drvdata->config.ctiouten[index];
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return sprintf(buf, "%#lx\n", val);
 }
 
@@ -422,14 +422,14 @@ static ssize_t outen_store(struct device *dev,
 	if (kstrtoul(buf, 0, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	index = config->ctiinout_sel;
 	config->ctiouten[index] = val;
 
 	/* write through if enabled */
 	if (cti_active(config))
 		cti_write_single_reg(drvdata, CTIOUTEN(index), val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(outen);
@@ -463,7 +463,7 @@ static ssize_t appclear_store(struct device *dev,
 	if (kstrtoul(buf, 0, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/* a 1'b1 in appclr clears down the same bit in appset*/
 	config->ctiappset &= ~val;
@@ -471,7 +471,7 @@ static ssize_t appclear_store(struct device *dev,
 	/* write through if enabled */
 	if (cti_active(config))
 		cti_write_single_reg(drvdata, CTIAPPCLEAR, val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_WO(appclear);
@@ -487,12 +487,12 @@ static ssize_t apppulse_store(struct device *dev,
 	if (kstrtoul(buf, 0, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/* write through if enabled */
 	if (cti_active(config))
 		cti_write_single_reg(drvdata, CTIAPPPULSE, val);
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_WO(apppulse);
@@ -681,9 +681,9 @@ static ssize_t trig_filter_enable_show(struct device *dev,
 	u32 val;
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val = drvdata->config.trig_filter_enable;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return sprintf(buf, "%d\n", val);
 }
 
@@ -697,9 +697,9 @@ static ssize_t trig_filter_enable_store(struct device *dev,
 	if (kstrtoul(buf, 0, &val))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	drvdata->config.trig_filter_enable = !!val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_RW(trig_filter_enable);
@@ -728,7 +728,7 @@ static ssize_t chan_xtrigs_reset_store(struct device *dev,
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 	struct cti_config *config = &drvdata->config;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 
 	/* clear the CTI trigger / channel programming registers */
 	for (i = 0; i < config->nr_trig_max; i++) {
@@ -747,7 +747,7 @@ static ssize_t chan_xtrigs_reset_store(struct device *dev,
 	if (cti_active(config))
 		cti_write_all_hw_regs(drvdata);
 
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 static DEVICE_ATTR_WO(chan_xtrigs_reset);
@@ -768,9 +768,9 @@ static ssize_t chan_xtrigs_sel_store(struct device *dev,
 	if (val > (drvdata->config.nr_ctm_channels - 1))
 		return -EINVAL;
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	drvdata->config.xtrig_rchan_sel = val;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 	return size;
 }
 
@@ -781,9 +781,9 @@ static ssize_t chan_xtrigs_sel_show(struct device *dev,
 	unsigned long val;
 	struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	val = drvdata->config.xtrig_rchan_sel;
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	return sprintf(buf, "%ld\n", val);
 }
@@ -838,12 +838,12 @@ static ssize_t print_chan_list(struct device *dev,
 	unsigned long inuse_bits = 0, chan_mask;
 
 	/* scan regs to get bitmap of channels in use. */
-	spin_lock(&drvdata->spinlock);
+	raw_spin_lock(&drvdata->spinlock);
 	for (i = 0; i < config->nr_trig_max; i++) {
 		inuse_bits |= config->ctiinen[i];
 		inuse_bits |= config->ctiouten[i];
 	}
-	spin_unlock(&drvdata->spinlock);
+	raw_spin_unlock(&drvdata->spinlock);
 
 	/* inverse bits if printing free channels */
 	if (!inuse)
diff --git a/drivers/hwtracing/coresight/coresight-cti.h b/drivers/hwtracing/coresight/coresight-cti.h
index cb9ee616d01f..16e310e7e9d4 100644
--- a/drivers/hwtracing/coresight/coresight-cti.h
+++ b/drivers/hwtracing/coresight/coresight-cti.h
@@ -175,7 +175,7 @@ struct cti_drvdata {
 	void __iomem *base;
 	struct coresight_device	*csdev;
 	struct cti_device ctidev;
-	spinlock_t spinlock;
+	raw_spinlock_t spinlock;
 	struct cti_config config;
 	struct list_head node;
 	void (*csdev_release)(struct device *dev);
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 5/9] coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (3 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 4/9] coresight-cti: change cti_drvdata spinlock's " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 6/9] coresight-funnel: change funnel_drvdata " Yeoreum Yun
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In coresight-etb10 drivers, etb_drvdata->spinlock can be held
during __schedule() by perf_event_task_sched_out()/in().

Since etb_drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type etb_drvdata->spinlock in coresight-etb10 drivers,
which can be called by perf_event_task_sched_out()/in(),
from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 drivers/hwtracing/coresight/coresight-etb10.c | 26 +++++++++----------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c
index aea9ac9c4bd0..7948597d483d 100644
--- a/drivers/hwtracing/coresight/coresight-etb10.c
+++ b/drivers/hwtracing/coresight/coresight-etb10.c
@@ -84,7 +84,7 @@ struct etb_drvdata {
 	struct clk		*atclk;
 	struct coresight_device	*csdev;
 	struct miscdevice	miscdev;
-	spinlock_t		spinlock;
+	raw_spinlock_t		spinlock;
 	local_t			reading;
 	pid_t			pid;
 	u8			*buf;
@@ -145,7 +145,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev)
 	unsigned long flags;
 	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* Don't messup with perf sessions. */
 	if (coresight_get_mode(csdev) == CS_MODE_PERF) {
@@ -163,7 +163,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev)
 
 	csdev->refcnt++;
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 	return ret;
 }
 
@@ -176,7 +176,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
 	struct perf_output_handle *handle = data;
 	struct cs_buffers *buf = etm_perf_sink_config(handle);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* No need to continue if the component is already in used by sysFS. */
 	if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
@@ -219,7 +219,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
 	}
 
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 	return ret;
 }
 
@@ -352,11 +352,11 @@ static int etb_disable(struct coresight_device *csdev)
 	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 	unsigned long flags;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	csdev->refcnt--;
 	if (csdev->refcnt) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return -EBUSY;
 	}
 
@@ -366,7 +366,7 @@ static int etb_disable(struct coresight_device *csdev)
 	/* Dissociate from monitored process. */
 	drvdata->pid = -1;
 	coresight_set_mode(csdev, CS_MODE_DISABLED);
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	dev_dbg(&csdev->dev, "ETB disabled\n");
 	return 0;
@@ -443,7 +443,7 @@ static unsigned long etb_update_buffer(struct coresight_device *csdev,
 
 	capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* Don't do anything if another tracer is using this sink */
 	if (csdev->refcnt != 1)
@@ -566,7 +566,7 @@ static unsigned long etb_update_buffer(struct coresight_device *csdev,
 	__etb_enable_hw(drvdata);
 	CS_LOCK(drvdata->base);
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	return to_read;
 }
@@ -587,13 +587,13 @@ static void etb_dump(struct etb_drvdata *drvdata)
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
 		__etb_disable_hw(drvdata);
 		etb_dump_hw(drvdata);
 		__etb_enable_hw(drvdata);
 	}
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	dev_dbg(&drvdata->csdev->dev, "ETB dumped\n");
 }
@@ -746,7 +746,7 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
 	drvdata->base = base;
 	desc.access = CSDEV_ACCESS_IOMEM(base);
 
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 
 	drvdata->buffer_depth = etb_get_buffer_depth(drvdata);
 
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 6/9] coresight-funnel: change funnel_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (4 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 5/9] coresight-etb10: change etb_drvdata " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 7/9] coresight-replicator: change replicator_drvdata " Yeoreum Yun
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In coresight-funnel drivers, cti_drvdata->spinlock can be held
during __schedule() by perf_event_task_sched_out()/in().

Since funnel_drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type funnel_drvdata->spinlock in
coresight-funnel drivers, which can be called by
perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 drivers/hwtracing/coresight/coresight-funnel.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c
index 33efe1acbef7..a566c8854327 100644
--- a/drivers/hwtracing/coresight/coresight-funnel.c
+++ b/drivers/hwtracing/coresight/coresight-funnel.c
@@ -47,7 +47,7 @@ struct funnel_drvdata {
 	struct clk		*pclk;
 	struct coresight_device	*csdev;
 	unsigned long		priority;
-	spinlock_t		spinlock;
+	raw_spinlock_t		spinlock;
 };
 
 static int dynamic_funnel_enable_hw(struct funnel_drvdata *drvdata, int port)
@@ -85,7 +85,7 @@ static int funnel_enable(struct coresight_device *csdev,
 	unsigned long flags;
 	bool first_enable = false;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (atomic_read(&in->dest_refcnt) == 0) {
 		if (drvdata->base)
 			rc = dynamic_funnel_enable_hw(drvdata, in->dest_port);
@@ -94,7 +94,7 @@ static int funnel_enable(struct coresight_device *csdev,
 	}
 	if (!rc)
 		atomic_inc(&in->dest_refcnt);
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (first_enable)
 		dev_dbg(&csdev->dev, "FUNNEL inport %d enabled\n",
@@ -129,13 +129,13 @@ static void funnel_disable(struct coresight_device *csdev,
 	unsigned long flags;
 	bool last_disable = false;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (atomic_dec_return(&in->dest_refcnt) == 0) {
 		if (drvdata->base)
 			dynamic_funnel_disable_hw(drvdata, in->dest_port);
 		last_disable = true;
 	}
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (last_disable)
 		dev_dbg(&csdev->dev, "FUNNEL inport %d disabled\n",
@@ -266,7 +266,7 @@ static int funnel_probe(struct device *dev, struct resource *res)
 	}
 	dev->platform_data = pdata;
 
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 	desc.type = CORESIGHT_DEV_TYPE_LINK;
 	desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG;
 	desc.ops = &funnel_cs_ops;
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 7/9] coresight-replicator: change replicator_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (5 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 6/9] coresight-funnel: change funnel_drvdata " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 8/9] coresight-tmc: change tmc_drvdata " Yeoreum Yun
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In coresight-replicator drivers, replicator_drvdata->spinlock can be held
during __schedule() by perf_event_task_sched_out()/in().

Since replicator_drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type replicator_drvdata->spinlock in
coresight-replicator drivers, which can be called
by perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 drivers/hwtracing/coresight/coresight-replicator.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c
index 0fba87de6d1a..7d36fe2176cc 100644
--- a/drivers/hwtracing/coresight/coresight-replicator.c
+++ b/drivers/hwtracing/coresight/coresight-replicator.c
@@ -41,7 +41,7 @@ struct replicator_drvdata {
 	struct clk		*atclk;
 	struct clk		*pclk;
 	struct coresight_device	*csdev;
-	spinlock_t		spinlock;
+	raw_spinlock_t		spinlock;
 	bool			check_idfilter_val;
 };
 
@@ -125,7 +125,7 @@ static int replicator_enable(struct coresight_device *csdev,
 	unsigned long flags;
 	bool first_enable = false;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (atomic_read(&out->src_refcnt) == 0) {
 		if (drvdata->base)
 			rc = dynamic_replicator_enable(drvdata, in->dest_port,
@@ -135,7 +135,7 @@ static int replicator_enable(struct coresight_device *csdev,
 	}
 	if (!rc)
 		atomic_inc(&out->src_refcnt);
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (first_enable)
 		dev_dbg(&csdev->dev, "REPLICATOR enabled\n");
@@ -179,14 +179,14 @@ static void replicator_disable(struct coresight_device *csdev,
 	unsigned long flags;
 	bool last_disable = false;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (atomic_dec_return(&out->src_refcnt) == 0) {
 		if (drvdata->base)
 			dynamic_replicator_disable(drvdata, in->dest_port,
 						   out->src_port);
 		last_disable = true;
 	}
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (last_disable)
 		dev_dbg(&csdev->dev, "REPLICATOR disabled\n");
@@ -277,7 +277,7 @@ static int replicator_probe(struct device *dev, struct resource *res)
 	}
 	dev->platform_data = pdata;
 
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 	desc.type = CORESIGHT_DEV_TYPE_LINK;
 	desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
 	desc.ops = &replicator_cs_ops;
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 8/9] coresight-tmc: change tmc_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (6 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 7/9] coresight-replicator: change replicator_drvdata " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:23   ` Mike Leach
  2024-12-16 11:50 ` [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata " Yeoreum Yun
  2024-12-19 12:27 ` [PATCH v3 0/9] coresight: change some driver' spinlock " Mike Leach
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In coresight-tmc drivers, tmc_drvdata->spinlock can be held
during __schedule() by perf_event_task_sched_out()/in().

Since tmc_drvdata->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type tmc_drvdata->spinlock in coresight-tmc drivers,
which can be called by perf_event_task_sched_out()/in(),
from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 .../hwtracing/coresight/coresight-tmc-core.c  |  6 +--
 .../hwtracing/coresight/coresight-tmc-etf.c   | 48 +++++++++----------
 .../hwtracing/coresight/coresight-tmc-etr.c   | 40 ++++++++--------
 drivers/hwtracing/coresight/coresight-tmc.h   |  2 +-
 4 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c
index e9876252a789..4e9925300931 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-core.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-core.c
@@ -492,7 +492,7 @@ static int __tmc_probe(struct device *dev, struct resource *res)
 	drvdata->base = base;
 	desc.access = CSDEV_ACCESS_IOMEM(base);
 
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 
 	devid = readl_relaxed(drvdata->base + CORESIGHT_DEVID);
 	drvdata->config_type = BMVAL(devid, 6, 7);
@@ -596,7 +596,7 @@ static void tmc_shutdown(struct amba_device *adev)
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = amba_get_drvdata(adev);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	if (coresight_get_mode(drvdata->csdev) == CS_MODE_DISABLED)
 		goto out;
@@ -610,7 +610,7 @@ static void tmc_shutdown(struct amba_device *adev)
 	 * the system is going down after this.
 	 */
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 }
 
 static void __tmc_remove(struct device *dev)
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
index d4f641cd9de6..fca8e9ffb3cf 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
@@ -182,9 +182,9 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
 	 * If we don't have a buffer release the lock and allocate memory.
 	 * Otherwise keep the lock and move along.
 	 */
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (!drvdata->buf) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 		/* Allocating the memory here while outside of the spinlock */
 		buf = kzalloc(drvdata->size, GFP_KERNEL);
@@ -192,7 +192,7 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
 			return -ENOMEM;
 
 		/* Let's try again */
-		spin_lock_irqsave(&drvdata->spinlock, flags);
+		raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	}
 
 	if (drvdata->reading) {
@@ -235,7 +235,7 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
 		used = false;
 	}
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	/* Free memory outside the spinlock if need be */
 	if (!used)
@@ -253,7 +253,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
 	struct perf_output_handle *handle = data;
 	struct cs_buffers *buf = etm_perf_sink_config(handle);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	do {
 		ret = -EINVAL;
 		if (drvdata->reading)
@@ -296,7 +296,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
 			csdev->refcnt++;
 		}
 	} while (0);
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	return ret;
 }
@@ -331,16 +331,16 @@ static int tmc_disable_etf_sink(struct coresight_device *csdev)
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	if (drvdata->reading) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return -EBUSY;
 	}
 
 	csdev->refcnt--;
 	if (csdev->refcnt) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return -EBUSY;
 	}
 
@@ -351,7 +351,7 @@ static int tmc_disable_etf_sink(struct coresight_device *csdev)
 	drvdata->pid = -1;
 	coresight_set_mode(csdev, CS_MODE_DISABLED);
 
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	dev_dbg(&csdev->dev, "TMC-ETB/ETF disabled\n");
 	return 0;
@@ -366,9 +366,9 @@ static int tmc_enable_etf_link(struct coresight_device *csdev,
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 	bool first_enable = false;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (drvdata->reading) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return -EBUSY;
 	}
 
@@ -381,7 +381,7 @@ static int tmc_enable_etf_link(struct coresight_device *csdev,
 	}
 	if (!ret)
 		csdev->refcnt++;
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (first_enable)
 		dev_dbg(&csdev->dev, "TMC-ETF enabled\n");
@@ -396,9 +396,9 @@ static void tmc_disable_etf_link(struct coresight_device *csdev,
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 	bool last_disable = false;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (drvdata->reading) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return;
 	}
 
@@ -408,7 +408,7 @@ static void tmc_disable_etf_link(struct coresight_device *csdev,
 		coresight_set_mode(csdev, CS_MODE_DISABLED);
 		last_disable = true;
 	}
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (last_disable)
 		dev_dbg(&csdev->dev, "TMC-ETF disabled\n");
@@ -488,7 +488,7 @@ static unsigned long tmc_update_etf_buffer(struct coresight_device *csdev,
 	if (WARN_ON_ONCE(coresight_get_mode(csdev) != CS_MODE_PERF))
 		return 0;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* Don't do anything if another tracer is using this sink */
 	if (csdev->refcnt != 1)
@@ -585,7 +585,7 @@ static unsigned long tmc_update_etf_buffer(struct coresight_device *csdev,
 	 */
 	CS_LOCK(drvdata->base);
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	return to_read;
 }
@@ -623,7 +623,7 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
 			 drvdata->config_type != TMC_CONFIG_TYPE_ETF))
 		return -EINVAL;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	if (drvdata->reading) {
 		ret = -EBUSY;
@@ -655,7 +655,7 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
 
 	drvdata->reading = true;
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	return ret;
 }
@@ -672,14 +672,14 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
 			 drvdata->config_type != TMC_CONFIG_TYPE_ETF))
 		return -EINVAL;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* Re-enable the TMC if need be */
 	if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
 		/* There is no point in reading a TMC in HW FIFO mode */
 		mode = readl_relaxed(drvdata->base + TMC_MODE);
 		if (mode != TMC_MODE_CIRCULAR_BUFFER) {
-			spin_unlock_irqrestore(&drvdata->spinlock, flags);
+			raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 			return -EINVAL;
 		}
 		/*
@@ -693,7 +693,7 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
 		memset(drvdata->buf, 0, drvdata->size);
 		rc = __tmc_etb_enable_hw(drvdata);
 		if (rc) {
-			spin_unlock_irqrestore(&drvdata->spinlock, flags);
+			raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 			return rc;
 		}
 	} else {
@@ -706,7 +706,7 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
 	}
 
 	drvdata->reading = false;
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	/*
 	 * Free allocated memory outside of the spinlock.  There is no need
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index a48bb85d0e7f..a0a90ce7333e 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1176,10 +1176,10 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
 	 * buffer, provided the size matches. Any allocation has to be done
 	 * with the lock released.
 	 */
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	sysfs_buf = READ_ONCE(drvdata->sysfs_buf);
 	if (!sysfs_buf || (sysfs_buf->size != drvdata->size)) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 		/* Allocate memory with the locks released */
 		free_buf = new_buf = tmc_etr_setup_sysfs_buf(drvdata);
@@ -1187,7 +1187,7 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
 			return new_buf;
 
 		/* Let's try again */
-		spin_lock_irqsave(&drvdata->spinlock, flags);
+		raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	}
 
 	if (drvdata->reading || coresight_get_mode(csdev) == CS_MODE_PERF) {
@@ -1206,7 +1206,7 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
 	}
 
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	/* Free memory outside the spinlock if need be */
 	if (free_buf)
@@ -1224,7 +1224,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
 	if (IS_ERR(sysfs_buf))
 		return PTR_ERR(sysfs_buf);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/*
 	 * In sysFS mode we can have multiple writers per sink.  Since this
@@ -1243,7 +1243,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
 	}
 
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	if (!ret)
 		dev_dbg(&csdev->dev, "TMC-ETR enabled\n");
@@ -1562,17 +1562,17 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
 	struct etr_perf_buffer *etr_perf = config;
 	struct etr_buf *etr_buf = etr_perf->etr_buf;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* Don't do anything if another tracer is using this sink */
 	if (csdev->refcnt != 1) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		goto out;
 	}
 
 	if (WARN_ON(drvdata->perf_buf != etr_buf)) {
 		lost = true;
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		goto out;
 	}
 
@@ -1582,7 +1582,7 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
 	tmc_sync_etr_buf(drvdata);
 
 	CS_LOCK(drvdata->base);
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	lost = etr_buf->full;
 	offset = etr_buf->offset;
@@ -1651,7 +1651,7 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
 	struct perf_output_handle *handle = data;
 	struct etr_perf_buffer *etr_perf = etm_perf_sink_config(handle);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	 /* Don't use this sink if it is already claimed by sysFS */
 	if (coresight_get_mode(csdev) == CS_MODE_SYSFS) {
 		rc = -EBUSY;
@@ -1691,7 +1691,7 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
 	}
 
 unlock_out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 	return rc;
 }
 
@@ -1713,16 +1713,16 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	if (drvdata->reading) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return -EBUSY;
 	}
 
 	csdev->refcnt--;
 	if (csdev->refcnt) {
-		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 		return -EBUSY;
 	}
 
@@ -1735,7 +1735,7 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)
 	/* Reset perf specific data */
 	drvdata->perf_buf = NULL;
 
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	dev_dbg(&csdev->dev, "TMC-ETR disabled\n");
 	return 0;
@@ -1762,7 +1762,7 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
 	if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
 		return -EINVAL;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (drvdata->reading) {
 		ret = -EBUSY;
 		goto out;
@@ -1784,7 +1784,7 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
 
 	drvdata->reading = true;
 out:
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	return ret;
 }
@@ -1798,7 +1798,7 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
 	if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
 		return -EINVAL;
 
-	spin_lock_irqsave(&drvdata->spinlock, flags);
+	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
 
 	/* RE-enable the TMC if need be */
 	if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
@@ -1818,7 +1818,7 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
 	}
 
 	drvdata->reading = false;
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	/* Free allocated memory out side of the spinlock */
 	if (sysfs_buf)
diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h
index 2671926be62a..60b395025bc4 100644
--- a/drivers/hwtracing/coresight/coresight-tmc.h
+++ b/drivers/hwtracing/coresight/coresight-tmc.h
@@ -195,7 +195,7 @@ struct tmc_drvdata {
 	void __iomem		*base;
 	struct coresight_device	*csdev;
 	struct miscdevice	miscdev;
-	spinlock_t		spinlock;
+	raw_spinlock_t		spinlock;
 	pid_t			pid;
 	bool			reading;
 	union {
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (7 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 8/9] coresight-tmc: change tmc_drvdata " Yeoreum Yun
@ 2024-12-16 11:50 ` Yeoreum Yun
  2024-12-19 12:24   ` Mike Leach
  2024-12-19 12:27 ` [PATCH v3 0/9] coresight: change some driver' spinlock " Mike Leach
  9 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-16 11:50 UTC (permalink / raw)
  To: suzuki.poulose, mike.leach, james.clark, alexander.shishkin,
	bigeasy, clrkwllms, rostedt
  Cc: coresight, linux-arm-kernel, linux-kernel, linux-rt-devel,
	Yeoreum Yun

In ultrasoc-smb drivers, smb_drv_data->spinlock can be held
during __schedule() by perf_event_task_sched_out()/in().

Since smb__drv_data->spinlock type is spinlock_t and
perf_event_task_sched_out()/in() is called after acquiring rq_lock,
which is raw_spinlock_t (an unsleepable lock),
this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.

To address this, change type smb_drv_data->spinlock in ultrasoc-smb drivers,
which can be called by perf_event_task_sched_out()/in(),
from spinlock_t to raw_spinlock_t.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
 drivers/hwtracing/coresight/ultrasoc-smb.c | 12 ++++++------
 drivers/hwtracing/coresight/ultrasoc-smb.h |  2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.c b/drivers/hwtracing/coresight/ultrasoc-smb.c
index dc3c9504dd7c..26cfc939e5bd 100644
--- a/drivers/hwtracing/coresight/ultrasoc-smb.c
+++ b/drivers/hwtracing/coresight/ultrasoc-smb.c
@@ -98,7 +98,7 @@ static int smb_open(struct inode *inode, struct file *file)
 	struct smb_drv_data *drvdata = container_of(file->private_data,
 					struct smb_drv_data, miscdev);
 
-	guard(spinlock)(&drvdata->spinlock);
+	guard(raw_spinlock)(&drvdata->spinlock);
 
 	if (drvdata->reading)
 		return -EBUSY;
@@ -152,7 +152,7 @@ static int smb_release(struct inode *inode, struct file *file)
 	struct smb_drv_data *drvdata = container_of(file->private_data,
 					struct smb_drv_data, miscdev);
 
-	guard(spinlock)(&drvdata->spinlock);
+	guard(raw_spinlock)(&drvdata->spinlock);
 	drvdata->reading = false;
 
 	return 0;
@@ -245,7 +245,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,
 	struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
 	int ret = 0;
 
-	guard(spinlock)(&drvdata->spinlock);
+	guard(raw_spinlock)(&drvdata->spinlock);
 
 	/* Do nothing, the trace data is reading by other interface now */
 	if (drvdata->reading)
@@ -280,7 +280,7 @@ static int smb_disable(struct coresight_device *csdev)
 {
 	struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-	guard(spinlock)(&drvdata->spinlock);
+	guard(raw_spinlock)(&drvdata->spinlock);
 
 	if (drvdata->reading)
 		return -EBUSY;
@@ -378,7 +378,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
 	if (!buf)
 		return 0;
 
-	guard(spinlock)(&drvdata->spinlock);
+	guard(raw_spinlock)(&drvdata->spinlock);
 
 	/* Don't do anything if another tracer is using this sink. */
 	if (csdev->refcnt != 1)
@@ -563,7 +563,7 @@ static int smb_probe(struct platform_device *pdev)
 
 	smb_reset_buffer(drvdata);
 	platform_set_drvdata(pdev, drvdata);
-	spin_lock_init(&drvdata->spinlock);
+	raw_spin_lock_init(&drvdata->spinlock);
 	drvdata->pid = -1;
 
 	ret = smb_register_sink(pdev, drvdata);
diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.h b/drivers/hwtracing/coresight/ultrasoc-smb.h
index a91d39cfccb8..c4c111275627 100644
--- a/drivers/hwtracing/coresight/ultrasoc-smb.h
+++ b/drivers/hwtracing/coresight/ultrasoc-smb.h
@@ -115,7 +115,7 @@ struct smb_drv_data {
 	struct coresight_device	*csdev;
 	struct smb_data_buffer sdb;
 	struct miscdevice miscdev;
-	spinlock_t spinlock;
+	raw_spinlock_t spinlock;
 	bool reading;
 	pid_t pid;
 };
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}



^ permalink raw reply related	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 8/9] coresight-tmc: change tmc_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 8/9] coresight-tmc: change tmc_drvdata " Yeoreum Yun
@ 2024-12-19 12:23   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:23 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In coresight-tmc drivers, tmc_drvdata->spinlock can be held
> during __schedule() by perf_event_task_sched_out()/in().
>
> Since tmc_drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type tmc_drvdata->spinlock in coresight-tmc drivers,
> which can be called by perf_event_task_sched_out()/in(),
> from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  .../hwtracing/coresight/coresight-tmc-core.c  |  6 +--
>  .../hwtracing/coresight/coresight-tmc-etf.c   | 48 +++++++++----------
>  .../hwtracing/coresight/coresight-tmc-etr.c   | 40 ++++++++--------
>  drivers/hwtracing/coresight/coresight-tmc.h   |  2 +-
>  4 files changed, 48 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c
> index e9876252a789..4e9925300931 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-core.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c
> @@ -492,7 +492,7 @@ static int __tmc_probe(struct device *dev, struct resource *res)
>         drvdata->base = base;
>         desc.access = CSDEV_ACCESS_IOMEM(base);
>
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>
>         devid = readl_relaxed(drvdata->base + CORESIGHT_DEVID);
>         drvdata->config_type = BMVAL(devid, 6, 7);
> @@ -596,7 +596,7 @@ static void tmc_shutdown(struct amba_device *adev)
>         unsigned long flags;
>         struct tmc_drvdata *drvdata = amba_get_drvdata(adev);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         if (coresight_get_mode(drvdata->csdev) == CS_MODE_DISABLED)
>                 goto out;
> @@ -610,7 +610,7 @@ static void tmc_shutdown(struct amba_device *adev)
>          * the system is going down after this.
>          */
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>  }
>
>  static void __tmc_remove(struct device *dev)
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
> index d4f641cd9de6..fca8e9ffb3cf 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
> @@ -182,9 +182,9 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
>          * If we don't have a buffer release the lock and allocate memory.
>          * Otherwise keep the lock and move along.
>          */
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (!drvdata->buf) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>                 /* Allocating the memory here while outside of the spinlock */
>                 buf = kzalloc(drvdata->size, GFP_KERNEL);
> @@ -192,7 +192,7 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
>                         return -ENOMEM;
>
>                 /* Let's try again */
> -               spin_lock_irqsave(&drvdata->spinlock, flags);
> +               raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         }
>
>         if (drvdata->reading) {
> @@ -235,7 +235,7 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
>                 used = false;
>         }
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         /* Free memory outside the spinlock if need be */
>         if (!used)
> @@ -253,7 +253,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
>         struct perf_output_handle *handle = data;
>         struct cs_buffers *buf = etm_perf_sink_config(handle);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         do {
>                 ret = -EINVAL;
>                 if (drvdata->reading)
> @@ -296,7 +296,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
>                         csdev->refcnt++;
>                 }
>         } while (0);
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         return ret;
>  }
> @@ -331,16 +331,16 @@ static int tmc_disable_etf_sink(struct coresight_device *csdev)
>         unsigned long flags;
>         struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         if (drvdata->reading) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return -EBUSY;
>         }
>
>         csdev->refcnt--;
>         if (csdev->refcnt) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return -EBUSY;
>         }
>
> @@ -351,7 +351,7 @@ static int tmc_disable_etf_sink(struct coresight_device *csdev)
>         drvdata->pid = -1;
>         coresight_set_mode(csdev, CS_MODE_DISABLED);
>
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         dev_dbg(&csdev->dev, "TMC-ETB/ETF disabled\n");
>         return 0;
> @@ -366,9 +366,9 @@ static int tmc_enable_etf_link(struct coresight_device *csdev,
>         struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>         bool first_enable = false;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (drvdata->reading) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return -EBUSY;
>         }
>
> @@ -381,7 +381,7 @@ static int tmc_enable_etf_link(struct coresight_device *csdev,
>         }
>         if (!ret)
>                 csdev->refcnt++;
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (first_enable)
>                 dev_dbg(&csdev->dev, "TMC-ETF enabled\n");
> @@ -396,9 +396,9 @@ static void tmc_disable_etf_link(struct coresight_device *csdev,
>         struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>         bool last_disable = false;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (drvdata->reading) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return;
>         }
>
> @@ -408,7 +408,7 @@ static void tmc_disable_etf_link(struct coresight_device *csdev,
>                 coresight_set_mode(csdev, CS_MODE_DISABLED);
>                 last_disable = true;
>         }
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (last_disable)
>                 dev_dbg(&csdev->dev, "TMC-ETF disabled\n");
> @@ -488,7 +488,7 @@ static unsigned long tmc_update_etf_buffer(struct coresight_device *csdev,
>         if (WARN_ON_ONCE(coresight_get_mode(csdev) != CS_MODE_PERF))
>                 return 0;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* Don't do anything if another tracer is using this sink */
>         if (csdev->refcnt != 1)
> @@ -585,7 +585,7 @@ static unsigned long tmc_update_etf_buffer(struct coresight_device *csdev,
>          */
>         CS_LOCK(drvdata->base);
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         return to_read;
>  }
> @@ -623,7 +623,7 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
>                          drvdata->config_type != TMC_CONFIG_TYPE_ETF))
>                 return -EINVAL;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         if (drvdata->reading) {
>                 ret = -EBUSY;
> @@ -655,7 +655,7 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
>
>         drvdata->reading = true;
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         return ret;
>  }
> @@ -672,14 +672,14 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
>                          drvdata->config_type != TMC_CONFIG_TYPE_ETF))
>                 return -EINVAL;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* Re-enable the TMC if need be */
>         if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
>                 /* There is no point in reading a TMC in HW FIFO mode */
>                 mode = readl_relaxed(drvdata->base + TMC_MODE);
>                 if (mode != TMC_MODE_CIRCULAR_BUFFER) {
> -                       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +                       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                         return -EINVAL;
>                 }
>                 /*
> @@ -693,7 +693,7 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
>                 memset(drvdata->buf, 0, drvdata->size);
>                 rc = __tmc_etb_enable_hw(drvdata);
>                 if (rc) {
> -                       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +                       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                         return rc;
>                 }
>         } else {
> @@ -706,7 +706,7 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
>         }
>
>         drvdata->reading = false;
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         /*
>          * Free allocated memory outside of the spinlock.  There is no need
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> index a48bb85d0e7f..a0a90ce7333e 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> @@ -1176,10 +1176,10 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
>          * buffer, provided the size matches. Any allocation has to be done
>          * with the lock released.
>          */
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         sysfs_buf = READ_ONCE(drvdata->sysfs_buf);
>         if (!sysfs_buf || (sysfs_buf->size != drvdata->size)) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>                 /* Allocate memory with the locks released */
>                 free_buf = new_buf = tmc_etr_setup_sysfs_buf(drvdata);
> @@ -1187,7 +1187,7 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
>                         return new_buf;
>
>                 /* Let's try again */
> -               spin_lock_irqsave(&drvdata->spinlock, flags);
> +               raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         }
>
>         if (drvdata->reading || coresight_get_mode(csdev) == CS_MODE_PERF) {
> @@ -1206,7 +1206,7 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
>         }
>
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         /* Free memory outside the spinlock if need be */
>         if (free_buf)
> @@ -1224,7 +1224,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
>         if (IS_ERR(sysfs_buf))
>                 return PTR_ERR(sysfs_buf);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /*
>          * In sysFS mode we can have multiple writers per sink.  Since this
> @@ -1243,7 +1243,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
>         }
>
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (!ret)
>                 dev_dbg(&csdev->dev, "TMC-ETR enabled\n");
> @@ -1562,17 +1562,17 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
>         struct etr_perf_buffer *etr_perf = config;
>         struct etr_buf *etr_buf = etr_perf->etr_buf;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* Don't do anything if another tracer is using this sink */
>         if (csdev->refcnt != 1) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 goto out;
>         }
>
>         if (WARN_ON(drvdata->perf_buf != etr_buf)) {
>                 lost = true;
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 goto out;
>         }
>
> @@ -1582,7 +1582,7 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
>         tmc_sync_etr_buf(drvdata);
>
>         CS_LOCK(drvdata->base);
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         lost = etr_buf->full;
>         offset = etr_buf->offset;
> @@ -1651,7 +1651,7 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
>         struct perf_output_handle *handle = data;
>         struct etr_perf_buffer *etr_perf = etm_perf_sink_config(handle);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>          /* Don't use this sink if it is already claimed by sysFS */
>         if (coresight_get_mode(csdev) == CS_MODE_SYSFS) {
>                 rc = -EBUSY;
> @@ -1691,7 +1691,7 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
>         }
>
>  unlock_out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>         return rc;
>  }
>
> @@ -1713,16 +1713,16 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)
>         unsigned long flags;
>         struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         if (drvdata->reading) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return -EBUSY;
>         }
>
>         csdev->refcnt--;
>         if (csdev->refcnt) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return -EBUSY;
>         }
>
> @@ -1735,7 +1735,7 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)
>         /* Reset perf specific data */
>         drvdata->perf_buf = NULL;
>
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         dev_dbg(&csdev->dev, "TMC-ETR disabled\n");
>         return 0;
> @@ -1762,7 +1762,7 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
>         if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
>                 return -EINVAL;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (drvdata->reading) {
>                 ret = -EBUSY;
>                 goto out;
> @@ -1784,7 +1784,7 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
>
>         drvdata->reading = true;
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         return ret;
>  }
> @@ -1798,7 +1798,7 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
>         if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
>                 return -EINVAL;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* RE-enable the TMC if need be */
>         if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
> @@ -1818,7 +1818,7 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
>         }
>
>         drvdata->reading = false;
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         /* Free allocated memory out side of the spinlock */
>         if (sysfs_buf)
> diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h
> index 2671926be62a..60b395025bc4 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc.h
> +++ b/drivers/hwtracing/coresight/coresight-tmc.h
> @@ -195,7 +195,7 @@ struct tmc_drvdata {
>         void __iomem            *base;
>         struct coresight_device *csdev;
>         struct miscdevice       miscdev;
> -       spinlock_t              spinlock;
> +       raw_spinlock_t          spinlock;
>         pid_t                   pid;
>         bool                    reading;
>         union {
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>

-- 
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 1/9] coresight: change coresight_device lock type to raw_spinlock_t
  2024-12-16 11:49 ` [PATCH v3 1/9] coresight: change coresight_device lock " Yeoreum Yun
@ 2024-12-19 12:23   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:23 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> coresight_device->cscfg_csdev_lock can be held during __schedule()
> by perf_event_task_sched_out()/in().
>
> Since coresight->cscfg_csdev_lock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type of coresight_device->cscfg_csdev_lock
> from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  .../hwtracing/coresight/coresight-syscfg.c    | 26 +++++++++----------
>  include/linux/coresight.h                     |  2 +-
>  2 files changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c
> index 11138a9762b0..a70c1454b410 100644
> --- a/drivers/hwtracing/coresight/coresight-syscfg.c
> +++ b/drivers/hwtracing/coresight/coresight-syscfg.c
> @@ -89,9 +89,9 @@ static int cscfg_add_csdev_cfg(struct coresight_device *csdev,
>         }
>         /* if matched features, add config to device.*/
>         if (config_csdev) {
> -               spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +               raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
>                 list_add(&config_csdev->node, &csdev->config_csdev_list);
> -               spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +               raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
>         }
>
>         return 0;
> @@ -194,9 +194,9 @@ static int cscfg_load_feat_csdev(struct coresight_device *csdev,
>
>         /* add to internal csdev feature list & initialise using reset call */
>         cscfg_reset_feat(feat_csdev);
> -       spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
>         list_add(&feat_csdev->node, &csdev->feature_csdev_list);
> -       spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
>
>         return 0;
>  }
> @@ -765,7 +765,7 @@ static int cscfg_list_add_csdev(struct coresight_device *csdev,
>
>         INIT_LIST_HEAD(&csdev->feature_csdev_list);
>         INIT_LIST_HEAD(&csdev->config_csdev_list);
> -       spin_lock_init(&csdev->cscfg_csdev_lock);
> +       raw_spin_lock_init(&csdev->cscfg_csdev_lock);
>
>         return 0;
>  }
> @@ -855,7 +855,7 @@ void cscfg_csdev_reset_feats(struct coresight_device *csdev)
>         struct cscfg_feature_csdev *feat_csdev;
>         unsigned long flags;
>
> -       spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
>         if (list_empty(&csdev->feature_csdev_list))
>                 goto unlock_exit;
>
> @@ -863,7 +863,7 @@ void cscfg_csdev_reset_feats(struct coresight_device *csdev)
>                 cscfg_reset_feat(feat_csdev);
>
>  unlock_exit:
> -       spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
>  }
>  EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats);
>
> @@ -1059,7 +1059,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
>          * Look for matching configuration - set the active configuration
>          * context if found.
>          */
> -       spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
>         list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) {
>                 config_desc = config_csdev_item->config_desc;
>                 if ((atomic_read(&config_desc->active_cnt)) &&
> @@ -1069,7 +1069,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
>                         break;
>                 }
>         }
> -       spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
>
>         /*
>          * If found, attempt to enable
> @@ -1090,12 +1090,12 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev,
>                          *
>                          * Set enabled if OK, err if not.
>                          */
> -                       spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +                       raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
>                         if (csdev->active_cscfg_ctxt)
>                                 config_csdev_active->enabled = true;
>                         else
>                                 err = -EBUSY;
> -                       spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +                       raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
>                 }
>         }
>         return err;
> @@ -1124,7 +1124,7 @@ void cscfg_csdev_disable_active_config(struct coresight_device *csdev)
>          * If it was not enabled, we have no work to do, otherwise mark as disabled.
>          * Clear the active config pointer.
>          */
> -       spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags);
>         config_csdev = (struct cscfg_config_csdev *)csdev->active_cscfg_ctxt;
>         if (config_csdev) {
>                 if (!config_csdev->enabled)
> @@ -1133,7 +1133,7 @@ void cscfg_csdev_disable_active_config(struct coresight_device *csdev)
>                         config_csdev->enabled = false;
>         }
>         csdev->active_cscfg_ctxt = NULL;
> -       spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
> +       raw_spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags);
>
>         /* true if there was an enabled active config */
>         if (config_csdev)
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index c13342594278..924b58c343b3 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -296,7 +296,7 @@ struct coresight_device {
>         /* system configuration and feature lists */
>         struct list_head feature_csdev_list;
>         struct list_head config_csdev_list;
> -       spinlock_t cscfg_csdev_lock;
> +       raw_spinlock_t cscfg_csdev_lock;
>         void *active_cscfg_ctxt;
>  };
>
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>

--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock type to raw_spinlock_t
  2024-12-16 11:49 ` [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  2024-12-20 10:13     ` Yeoreum Yun
  0 siblings, 1 reply; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi,

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In coresight-etm4x drivers, etmv4_drvdata->spinlock can be held during
> __schedule() by perf_event_task_sched_out()/in().
>
> Since etmv4_drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type etmv4_drvdata->spinlock
> in coresight-etm4x drivers, which can be called
> by perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  .../hwtracing/coresight/coresight-config.c    |   8 +-
>  .../hwtracing/coresight/coresight-config.h    |   2 +-
>  .../coresight/coresight-etm4x-core.c          |  18 +-
>  .../coresight/coresight-etm4x-sysfs.c         | 250 +++++++++---------
>  drivers/hwtracing/coresight/coresight-etm4x.h |   2 +-
>  5 files changed, 140 insertions(+), 140 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-config.c b/drivers/hwtracing/coresight/coresight-config.c
> index 4723bf7402a2..4f72ae71b696 100644
> --- a/drivers/hwtracing/coresight/coresight-config.c
> +++ b/drivers/hwtracing/coresight/coresight-config.c
> @@ -76,10 +76,10 @@ static int cscfg_set_on_enable(struct cscfg_feature_csdev *feat_csdev)
>         unsigned long flags;
>         int i;
>
> -       spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
> +       raw_spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
>         for (i = 0; i < feat_csdev->nr_regs; i++)
>                 cscfg_set_reg(&feat_csdev->regs_csdev[i]);
> -       spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
> +       raw_spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
>         dev_dbg(&feat_csdev->csdev->dev, "Feature %s: %s",
>                 feat_csdev->feat_desc->name, "set on enable");
>         return 0;
> @@ -91,10 +91,10 @@ static void cscfg_save_on_disable(struct cscfg_feature_csdev *feat_csdev)
>         unsigned long flags;
>         int i;
>
> -       spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
> +       raw_spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
>         for (i = 0; i < feat_csdev->nr_regs; i++)
>                 cscfg_save_reg(&feat_csdev->regs_csdev[i]);
> -       spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
> +       raw_spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
>         dev_dbg(&feat_csdev->csdev->dev, "Feature %s: %s",
>                 feat_csdev->feat_desc->name, "save on disable");
>  }
> diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h
> index 6ba013975741..b9ebc9fcfb7f 100644
> --- a/drivers/hwtracing/coresight/coresight-config.h
> +++ b/drivers/hwtracing/coresight/coresight-config.h
> @@ -206,7 +206,7 @@ struct cscfg_feature_csdev {
>         const struct cscfg_feature_desc *feat_desc;
>         struct coresight_device *csdev;
>         struct list_head node;
> -       spinlock_t *drv_spinlock;
> +       raw_spinlock_t *drv_spinlock;
>         int nr_params;
>         struct cscfg_parameter_csdev *params_csdev;
>         int nr_regs;

The above changes are not etm4x specific - should be in the previous patch.

> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index dd8c74f893db..86893115df17 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -807,7 +807,7 @@ static int etm4_enable_sysfs(struct coresight_device *csdev)
>                         return ret;
>         }
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /* sysfs needs to read and allocate a trace ID */
>         ret = etm4_read_alloc_trace_id(drvdata);
> @@ -830,7 +830,7 @@ static int etm4_enable_sysfs(struct coresight_device *csdev)
>                 etm4_release_trace_id(drvdata);
>
>  unlock_sysfs_enable:
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         if (!ret)
>                 dev_dbg(&csdev->dev, "ETM tracing enabled\n");
> @@ -977,7 +977,7 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
>          * DYING hotplug callback is serviced by the ETM driver.
>          */
>         cpus_read_lock();
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /*
>          * Executing etm4_disable_hw on the cpu whose ETM is being disabled
> @@ -985,7 +985,7 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
>          */
>         smp_call_function_single(drvdata->cpu, etm4_disable_hw, drvdata, 1);
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         cpus_read_unlock();
>
>         /*
> @@ -1663,13 +1663,13 @@ static int etm4_starting_cpu(unsigned int cpu)
>         if (!etmdrvdata[cpu])
>                 return 0;
>
> -       spin_lock(&etmdrvdata[cpu]->spinlock);
> +       raw_spin_lock(&etmdrvdata[cpu]->spinlock);
>         if (!etmdrvdata[cpu]->os_unlock)
>                 etm4_os_unlock(etmdrvdata[cpu]);
>
>         if (coresight_get_mode(etmdrvdata[cpu]->csdev))
>                 etm4_enable_hw(etmdrvdata[cpu]);
> -       spin_unlock(&etmdrvdata[cpu]->spinlock);
> +       raw_spin_unlock(&etmdrvdata[cpu]->spinlock);
>         return 0;
>  }
>
> @@ -1678,10 +1678,10 @@ static int etm4_dying_cpu(unsigned int cpu)
>         if (!etmdrvdata[cpu])
>                 return 0;
>
> -       spin_lock(&etmdrvdata[cpu]->spinlock);
> +       raw_spin_lock(&etmdrvdata[cpu]->spinlock);
>         if (coresight_get_mode(etmdrvdata[cpu]->csdev))
>                 etm4_disable_hw(etmdrvdata[cpu]);
> -       spin_unlock(&etmdrvdata[cpu]->spinlock);
> +       raw_spin_unlock(&etmdrvdata[cpu]->spinlock);
>         return 0;
>  }
>
> @@ -2125,7 +2125,7 @@ static int etm4_probe(struct device *dev)
>                         return -ENOMEM;
>         }
>
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>
>         drvdata->cpu = coresight_get_cpu(dev);
>         if (drvdata->cpu < 0)
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
> index a9f19629f3f8..11e865b8e824 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
> @@ -174,7 +174,7 @@ static ssize_t reset_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         if (val)
>                 config->mode = 0x0;
>
> @@ -266,7 +266,7 @@ static ssize_t reset_store(struct device *dev,
>         config->vmid_mask0 = 0x0;
>         config->vmid_mask1 = 0x0;
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         /* for sysfs - only release trace id when resetting */
>         etm4_release_trace_id(drvdata);
> @@ -300,7 +300,7 @@ static ssize_t mode_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->mode = val & ETMv4_MODE_ALL;
>
>         if (drvdata->instrp0 == true) {
> @@ -437,7 +437,7 @@ static ssize_t mode_store(struct device *dev,
>         if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
>                 etm4_config_trace_mode(config);
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         return size;
>  }
> @@ -466,14 +466,14 @@ static ssize_t pe_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         if (val > drvdata->nr_pe) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EINVAL;
>         }
>
>         config->pe_sel = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(pe);
> @@ -501,7 +501,7 @@ static ssize_t event_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         switch (drvdata->nr_event) {
>         case 0x0:
>                 /* EVENT0, bits[7:0] */
> @@ -522,7 +522,7 @@ static ssize_t event_store(struct device *dev,
>         default:
>                 break;
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(event);
> @@ -550,7 +550,7 @@ static ssize_t event_instren_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         /* start by clearing all instruction event enable bits */
>         config->eventctrl1 &= ~TRCEVENTCTL1R_INSTEN_MASK;
>         switch (drvdata->nr_event) {
> @@ -578,7 +578,7 @@ static ssize_t event_instren_store(struct device *dev,
>         default:
>                 break;
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(event_instren);
> @@ -739,11 +739,11 @@ static ssize_t event_vinst_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val &= TRCVICTLR_EVENT_MASK >> __bf_shf(TRCVICTLR_EVENT_MASK);
>         config->vinst_ctrl &= ~TRCVICTLR_EVENT_MASK;
>         config->vinst_ctrl |= FIELD_PREP(TRCVICTLR_EVENT_MASK, val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(event_vinst);
> @@ -771,13 +771,13 @@ static ssize_t s_exlevel_vinst_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         /* clear all EXLEVEL_S bits  */
>         config->vinst_ctrl &= ~TRCVICTLR_EXLEVEL_S_MASK;
>         /* enable instruction tracing for corresponding exception level */
>         val &= drvdata->s_ex_level;
>         config->vinst_ctrl |= val << __bf_shf(TRCVICTLR_EXLEVEL_S_MASK);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(s_exlevel_vinst);
> @@ -806,13 +806,13 @@ static ssize_t ns_exlevel_vinst_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         /* clear EXLEVEL_NS bits  */
>         config->vinst_ctrl &= ~TRCVICTLR_EXLEVEL_NS_MASK;
>         /* enable instruction tracing for corresponding exception level */
>         val &= drvdata->ns_ex_level;
>         config->vinst_ctrl |= val << __bf_shf(TRCVICTLR_EXLEVEL_NS_MASK);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(ns_exlevel_vinst);
> @@ -846,9 +846,9 @@ static ssize_t addr_idx_store(struct device *dev,
>          * Use spinlock to ensure index doesn't change while it gets
>          * dereferenced multiple times within a spinlock block elsewhere.
>          */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->addr_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_idx);
> @@ -862,7 +862,7 @@ static ssize_t addr_instdatatype_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         val = FIELD_GET(TRCACATRn_TYPE_MASK, config->addr_acc[idx]);
>         len = scnprintf(buf, PAGE_SIZE, "%s\n",
> @@ -870,7 +870,7 @@ static ssize_t addr_instdatatype_show(struct device *dev,
>                         (val == TRCACATRn_TYPE_DATA_LOAD_ADDR ? "data_load" :
>                         (val == TRCACATRn_TYPE_DATA_STORE_ADDR ? "data_store" :
>                         "data_load_store")));
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return len;
>  }
>
> @@ -888,13 +888,13 @@ static ssize_t addr_instdatatype_store(struct device *dev,
>         if (sscanf(buf, "%s", str) != 1)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (!strcmp(str, "instr"))
>                 /* TYPE, bits[1:0] */
>                 config->addr_acc[idx] &= ~TRCACATRn_TYPE_MASK;
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_instdatatype);
> @@ -909,14 +909,14 @@ static ssize_t addr_single_show(struct device *dev,
>         struct etmv4_config *config = &drvdata->config;
>
>         idx = config->addr_idx;
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
>               config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>         val = (unsigned long)config->addr_val[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -932,17 +932,17 @@ static ssize_t addr_single_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
>               config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
>         config->addr_val[idx] = (u64)val;
>         config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_single);
> @@ -956,23 +956,23 @@ static ssize_t addr_range_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (idx % 2 != 0) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>         if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
>                config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
>               (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
>                config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
>         val1 = (unsigned long)config->addr_val[idx];
>         val2 = (unsigned long)config->addr_val[idx + 1];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
>  }
>
> @@ -995,10 +995,10 @@ static ssize_t addr_range_store(struct device *dev,
>         if (val1 > val2)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (idx % 2 != 0) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
> @@ -1006,7 +1006,7 @@ static ssize_t addr_range_store(struct device *dev,
>                config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
>               (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
>                config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
> @@ -1023,7 +1023,7 @@ static ssize_t addr_range_store(struct device *dev,
>                 exclude = config->mode & ETM_MODE_EXCLUDE;
>         etm4_set_mode_exclude(drvdata, exclude ? true : false);
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_range);
> @@ -1037,17 +1037,17 @@ static ssize_t addr_start_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>
>         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
>               config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
>         val = (unsigned long)config->addr_val[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1063,22 +1063,22 @@ static ssize_t addr_start_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (!drvdata->nr_addr_cmp) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EINVAL;
>         }
>         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
>               config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
>         config->addr_val[idx] = (u64)val;
>         config->addr_type[idx] = ETM_ADDR_TYPE_START;
>         config->vissctlr |= BIT(idx);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_start);
> @@ -1092,17 +1092,17 @@ static ssize_t addr_stop_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>
>         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
>               config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
>         val = (unsigned long)config->addr_val[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1118,22 +1118,22 @@ static ssize_t addr_stop_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (!drvdata->nr_addr_cmp) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EINVAL;
>         }
>         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
>                config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
> -               spin_unlock(&drvdata->spinlock);
> +               raw_spin_unlock(&drvdata->spinlock);
>                 return -EPERM;
>         }
>
>         config->addr_val[idx] = (u64)val;
>         config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
>         config->vissctlr |= BIT(idx + 16);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_stop);
> @@ -1147,14 +1147,14 @@ static ssize_t addr_ctxtype_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         /* CONTEXTTYPE, bits[3:2] */
>         val = FIELD_GET(TRCACATRn_CONTEXTTYPE_MASK, config->addr_acc[idx]);
>         len = scnprintf(buf, PAGE_SIZE, "%s\n", val == ETM_CTX_NONE ? "none" :
>                         (val == ETM_CTX_CTXID ? "ctxid" :
>                         (val == ETM_CTX_VMID ? "vmid" : "all")));
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return len;
>  }
>
> @@ -1172,7 +1172,7 @@ static ssize_t addr_ctxtype_store(struct device *dev,
>         if (sscanf(buf, "%s", str) != 1)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         if (!strcmp(str, "none"))
>                 /* start by clearing context type bits */
> @@ -1199,7 +1199,7 @@ static ssize_t addr_ctxtype_store(struct device *dev,
>                 if (drvdata->numvmidc)
>                         config->addr_acc[idx] |= TRCACATRn_CONTEXTTYPE_VMID;
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_ctxtype);
> @@ -1213,11 +1213,11 @@ static ssize_t addr_context_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         /* context ID comparator bits[6:4] */
>         val = FIELD_GET(TRCACATRn_CONTEXT_MASK, config->addr_acc[idx]);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1238,12 +1238,12 @@ static ssize_t addr_context_store(struct device *dev,
>                      drvdata->numcidc : drvdata->numvmidc))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         /* clear context ID comparator bits[6:4] */
>         config->addr_acc[idx] &= ~TRCACATRn_CONTEXT_MASK;
>         config->addr_acc[idx] |= val << __bf_shf(TRCACATRn_CONTEXT_MASK);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_context);
> @@ -1257,10 +1257,10 @@ static ssize_t addr_exlevel_s_ns_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         val = FIELD_GET(TRCACATRn_EXLEVEL_MASK, config->addr_acc[idx]);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1279,12 +1279,12 @@ static ssize_t addr_exlevel_s_ns_store(struct device *dev,
>         if (val & ~(TRCACATRn_EXLEVEL_MASK >> __bf_shf(TRCACATRn_EXLEVEL_MASK)))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         /* clear Exlevel_ns & Exlevel_s bits[14:12, 11:8], bit[15] is res0 */
>         config->addr_acc[idx] &= ~TRCACATRn_EXLEVEL_MASK;
>         config->addr_acc[idx] |= val << __bf_shf(TRCACATRn_EXLEVEL_MASK);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(addr_exlevel_s_ns);
> @@ -1307,7 +1307,7 @@ static ssize_t addr_cmp_view_show(struct device *dev,
>         int size = 0;
>         bool exclude = false;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->addr_idx;
>         addr_v = config->addr_val[idx];
>         addr_ctrl = config->addr_acc[idx];
> @@ -1322,7 +1322,7 @@ static ssize_t addr_cmp_view_show(struct device *dev,
>                 }
>                 exclude = config->viiectlr & BIT(idx / 2 + 16);
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         if (addr_type) {
>                 size = scnprintf(buf, PAGE_SIZE, "addr_cmp[%i] %s %#lx", idx,
>                                  addr_type_names[addr_type], addr_v);
> @@ -1366,9 +1366,9 @@ static ssize_t vinst_pe_cmp_start_stop_store(struct device *dev,
>         if (!drvdata->nr_pe_cmp)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->vipcssctlr = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(vinst_pe_cmp_start_stop);
> @@ -1402,9 +1402,9 @@ static ssize_t seq_idx_store(struct device *dev,
>          * Use spinlock to ensure index doesn't change while it gets
>          * dereferenced multiple times within a spinlock block elsewhere.
>          */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->seq_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(seq_idx);
> @@ -1448,10 +1448,10 @@ static ssize_t seq_event_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->seq_idx;
>         val = config->seq_ctrl[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1467,11 +1467,11 @@ static ssize_t seq_event_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->seq_idx;
>         /* Seq control has two masks B[15:8] F[7:0] */
>         config->seq_ctrl[idx] = val & 0xFFFF;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(seq_event);
> @@ -1535,9 +1535,9 @@ static ssize_t cntr_idx_store(struct device *dev,
>          * Use spinlock to ensure index doesn't change while it gets
>          * dereferenced multiple times within a spinlock block elsewhere.
>          */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->cntr_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(cntr_idx);
> @@ -1551,10 +1551,10 @@ static ssize_t cntrldvr_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->cntr_idx;
>         val = config->cntrldvr[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1572,10 +1572,10 @@ static ssize_t cntrldvr_store(struct device *dev,
>         if (val > ETM_CNTR_MAX_VAL)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->cntr_idx;
>         config->cntrldvr[idx] = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(cntrldvr);
> @@ -1589,10 +1589,10 @@ static ssize_t cntr_val_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->cntr_idx;
>         val = config->cntr_val[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1610,10 +1610,10 @@ static ssize_t cntr_val_store(struct device *dev,
>         if (val > ETM_CNTR_MAX_VAL)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->cntr_idx;
>         config->cntr_val[idx] = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(cntr_val);
> @@ -1627,10 +1627,10 @@ static ssize_t cntr_ctrl_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->cntr_idx;
>         val = config->cntr_ctrl[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1646,10 +1646,10 @@ static ssize_t cntr_ctrl_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->cntr_idx;
>         config->cntr_ctrl[idx] = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(cntr_ctrl);
> @@ -1687,9 +1687,9 @@ static ssize_t res_idx_store(struct device *dev,
>          * Use spinlock to ensure index doesn't change while it gets
>          * dereferenced multiple times within a spinlock block elsewhere.
>          */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->res_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(res_idx);
> @@ -1703,10 +1703,10 @@ static ssize_t res_ctrl_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->res_idx;
>         val = config->res_ctrl[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1722,7 +1722,7 @@ static ssize_t res_ctrl_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->res_idx;
>         /* For odd idx pair inversal bit is RES0 */
>         if (idx % 2 != 0)
> @@ -1732,7 +1732,7 @@ static ssize_t res_ctrl_store(struct device *dev,
>                                        TRCRSCTLRn_INV |
>                                        TRCRSCTLRn_GROUP_MASK |
>                                        TRCRSCTLRn_SELECT_MASK);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(res_ctrl);
> @@ -1761,9 +1761,9 @@ static ssize_t sshot_idx_store(struct device *dev,
>         if (val >= drvdata->nr_ss_cmp)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->ss_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(sshot_idx);
> @@ -1776,9 +1776,9 @@ static ssize_t sshot_ctrl_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val = config->ss_ctrl[config->ss_idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1794,12 +1794,12 @@ static ssize_t sshot_ctrl_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->ss_idx;
>         config->ss_ctrl[idx] = FIELD_PREP(TRCSSCCRn_SAC_ARC_RST_MASK, val);
>         /* must clear bit 31 in related status register on programming */
>         config->ss_status[idx] &= ~TRCSSCSRn_STATUS;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(sshot_ctrl);
> @@ -1811,9 +1811,9 @@ static ssize_t sshot_status_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val = config->ss_status[config->ss_idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>  static DEVICE_ATTR_RO(sshot_status);
> @@ -1826,9 +1826,9 @@ static ssize_t sshot_pe_ctrl_show(struct device *dev,
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct etmv4_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val = config->ss_pe_cmp[config->ss_idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1844,12 +1844,12 @@ static ssize_t sshot_pe_ctrl_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->ss_idx;
>         config->ss_pe_cmp[idx] = FIELD_PREP(TRCSSPCICRn_PC_MASK, val);
>         /* must clear bit 31 in related status register on programming */
>         config->ss_status[idx] &= ~TRCSSCSRn_STATUS;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(sshot_pe_ctrl);
> @@ -1883,9 +1883,9 @@ static ssize_t ctxid_idx_store(struct device *dev,
>          * Use spinlock to ensure index doesn't change while it gets
>          * dereferenced multiple times within a spinlock block elsewhere.
>          */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->ctxid_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(ctxid_idx);
> @@ -1906,10 +1906,10 @@ static ssize_t ctxid_pid_show(struct device *dev,
>         if (task_active_pid_ns(current) != &init_pid_ns)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->ctxid_idx;
>         val = (unsigned long)config->ctxid_pid[idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -1944,10 +1944,10 @@ static ssize_t ctxid_pid_store(struct device *dev,
>         if (kstrtoul(buf, 16, &pid))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         idx = config->ctxid_idx;
>         config->ctxid_pid[idx] = (u64)pid;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(ctxid_pid);
> @@ -1967,10 +1967,10 @@ static ssize_t ctxid_masks_show(struct device *dev,
>         if (task_active_pid_ns(current) != &init_pid_ns)
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val1 = config->ctxid_mask0;
>         val2 = config->ctxid_mask1;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
>  }
>
> @@ -2003,7 +2003,7 @@ static ssize_t ctxid_masks_store(struct device *dev,
>         if ((drvdata->numcidc > 4) && (nr_inputs != 2))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         /*
>          * each byte[0..3] controls mask value applied to ctxid
>          * comparator[0..3]
> @@ -2075,7 +2075,7 @@ static ssize_t ctxid_masks_store(struct device *dev,
>                         mask >>= 0x8;
>         }
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(ctxid_masks);
> @@ -2109,9 +2109,9 @@ static ssize_t vmid_idx_store(struct device *dev,
>          * Use spinlock to ensure index doesn't change while it gets
>          * dereferenced multiple times within a spinlock block elsewhere.
>          */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->vmid_idx = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(vmid_idx);
> @@ -2131,9 +2131,9 @@ static ssize_t vmid_val_show(struct device *dev,
>         if (!task_is_in_init_pid_ns(current))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val = (unsigned long)config->vmid_val[config->vmid_idx];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
>  }
>
> @@ -2161,9 +2161,9 @@ static ssize_t vmid_val_store(struct device *dev,
>         if (kstrtoul(buf, 16, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->vmid_val[config->vmid_idx] = (u64)val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(vmid_val);
> @@ -2182,10 +2182,10 @@ static ssize_t vmid_masks_show(struct device *dev,
>         if (!task_is_in_init_pid_ns(current))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val1 = config->vmid_mask0;
>         val2 = config->vmid_mask1;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
>  }
>
> @@ -2217,7 +2217,7 @@ static ssize_t vmid_masks_store(struct device *dev,
>         if ((drvdata->numvmidc > 4) && (nr_inputs != 2))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /*
>          * each byte[0..3] controls mask value applied to vmid
> @@ -2290,7 +2290,7 @@ static ssize_t vmid_masks_store(struct device *dev,
>                 else
>                         mask >>= 0x8;
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(vmid_masks);
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
> index 9e9165f62e81..366f8f23a3e5 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x.h
> +++ b/drivers/hwtracing/coresight/coresight-etm4x.h
> @@ -989,7 +989,7 @@ struct etmv4_drvdata {
>         struct clk                      *pclk;
>         void __iomem                    *base;
>         struct coresight_device         *csdev;
> -       spinlock_t                      spinlock;
> +       raw_spinlock_t                  spinlock;
>         int                             cpu;
>         u8                              arch;
>         u8                              nr_pe;
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

with the above change:

Reviewed-by: Mike Leach <mike.leach@linaro.org>


--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 3/9] coresight: change coresight_trace_id_map's lock type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 3/9] coresight: change coresight_trace_id_map's lock " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> coresight_trace_id_map->lock can be acquired while coresight devices'
> drvdata_lock.
>
> But the drvdata_lock can be raw_spinlock_t (i.e) coresight-etm4x.
>
> To address this, change type of coresight_trace_id_map->lock to
> raw_spinlock_t
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-core.c  |  2 +-
>  .../hwtracing/coresight/coresight-trace-id.c  | 22 +++++++++----------
>  include/linux/coresight.h                     |  2 +-
>  3 files changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
> index ea38ecf26fcb..cc2d87b2f248 100644
> --- a/drivers/hwtracing/coresight/coresight-core.c
> +++ b/drivers/hwtracing/coresight/coresight-core.c
> @@ -1164,7 +1164,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
>
>         if (csdev->type == CORESIGHT_DEV_TYPE_SINK ||
>             csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) {
> -               spin_lock_init(&csdev->perf_sink_id_map.lock);
> +               raw_spin_lock_init(&csdev->perf_sink_id_map.lock);
>                 csdev->perf_sink_id_map.cpu_map = alloc_percpu(atomic_t);
>                 if (!csdev->perf_sink_id_map.cpu_map) {
>                         kfree(csdev);
> diff --git a/drivers/hwtracing/coresight/coresight-trace-id.c b/drivers/hwtracing/coresight/coresight-trace-id.c
> index d98e12cb30ec..a6531869e9ec 100644
> --- a/drivers/hwtracing/coresight/coresight-trace-id.c
> +++ b/drivers/hwtracing/coresight/coresight-trace-id.c
> @@ -16,7 +16,7 @@
>  static DEFINE_PER_CPU(atomic_t, id_map_default_cpu_ids) = ATOMIC_INIT(0);
>  static struct coresight_trace_id_map id_map_default = {
>         .cpu_map = &id_map_default_cpu_ids,
> -       .lock = __SPIN_LOCK_UNLOCKED(id_map_default.lock)
> +       .lock = __RAW_SPIN_LOCK_UNLOCKED(id_map_default.lock)
>  };
>
>  /* #define TRACE_ID_DEBUG 1 */
> @@ -121,11 +121,11 @@ static void coresight_trace_id_release_all(struct coresight_trace_id_map *id_map
>         unsigned long flags;
>         int cpu;
>
> -       spin_lock_irqsave(&id_map->lock, flags);
> +       raw_spin_lock_irqsave(&id_map->lock, flags);
>         bitmap_zero(id_map->used_ids, CORESIGHT_TRACE_IDS_MAX);
>         for_each_possible_cpu(cpu)
>                 atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), 0);
> -       spin_unlock_irqrestore(&id_map->lock, flags);
> +       raw_spin_unlock_irqrestore(&id_map->lock, flags);
>         DUMP_ID_MAP(id_map);
>  }
>
> @@ -134,7 +134,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
>         unsigned long flags;
>         int id;
>
> -       spin_lock_irqsave(&id_map->lock, flags);
> +       raw_spin_lock_irqsave(&id_map->lock, flags);
>
>         /* check for existing allocation for this CPU */
>         id = _coresight_trace_id_read_cpu_id(cpu, id_map);
> @@ -161,7 +161,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
>         atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), id);
>
>  get_cpu_id_out_unlock:
> -       spin_unlock_irqrestore(&id_map->lock, flags);
> +       raw_spin_unlock_irqrestore(&id_map->lock, flags);
>
>         DUMP_ID_CPU(cpu, id);
>         DUMP_ID_MAP(id_map);
> @@ -178,12 +178,12 @@ static void _coresight_trace_id_put_cpu_id(int cpu, struct coresight_trace_id_ma
>         if (!id)
>                 return;
>
> -       spin_lock_irqsave(&id_map->lock, flags);
> +       raw_spin_lock_irqsave(&id_map->lock, flags);
>
>         coresight_trace_id_free(id, id_map);
>         atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), 0);
>
> -       spin_unlock_irqrestore(&id_map->lock, flags);
> +       raw_spin_unlock_irqrestore(&id_map->lock, flags);
>         DUMP_ID_CPU(cpu, id);
>         DUMP_ID_MAP(id_map);
>  }
> @@ -193,10 +193,10 @@ static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *i
>         unsigned long flags;
>         int id;
>
> -       spin_lock_irqsave(&id_map->lock, flags);
> +       raw_spin_lock_irqsave(&id_map->lock, flags);
>         /* prefer odd IDs for system components to avoid legacy CPU IDS */
>         id = coresight_trace_id_alloc_new_id(id_map, 0, true);
> -       spin_unlock_irqrestore(&id_map->lock, flags);
> +       raw_spin_unlock_irqrestore(&id_map->lock, flags);
>
>         DUMP_ID(id);
>         DUMP_ID_MAP(id_map);
> @@ -207,9 +207,9 @@ static void coresight_trace_id_map_put_system_id(struct coresight_trace_id_map *
>  {
>         unsigned long flags;
>
> -       spin_lock_irqsave(&id_map->lock, flags);
> +       raw_spin_lock_irqsave(&id_map->lock, flags);
>         coresight_trace_id_free(id, id_map);
> -       spin_unlock_irqrestore(&id_map->lock, flags);
> +       raw_spin_unlock_irqrestore(&id_map->lock, flags);
>
>         DUMP_ID(id);
>         DUMP_ID_MAP(id_map);
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index 924b58c343b3..6446ca1f09d8 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -233,7 +233,7 @@ struct coresight_trace_id_map {
>         DECLARE_BITMAP(used_ids, CORESIGHT_TRACE_IDS_MAX);
>         atomic_t __percpu *cpu_map;
>         atomic_t perf_cs_etm_session_active;
> -       spinlock_t lock;
> +       raw_spinlock_t lock;
>  };
>
>  /**
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>


--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 4/9] coresight-cti: change cti_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 4/9] coresight-cti: change cti_drvdata spinlock's " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In coresight-cti drivers, cti_drvdata->spinlock can be held during __schedule()
> by perf_event_task_sched_out()/in().
>
> Since cti_drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type cti_drvdata->spinlock in coresight-cti drivers,
> which can be called by perf_event_task_sched_out()/in(),
> from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  .../hwtracing/coresight/coresight-cti-core.c  | 44 +++++------
>  .../hwtracing/coresight/coresight-cti-sysfs.c | 76 +++++++++----------
>  drivers/hwtracing/coresight/coresight-cti.h   |  2 +-
>  3 files changed, 61 insertions(+), 61 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-cti-core.c b/drivers/hwtracing/coresight/coresight-cti-core.c
> index d2b5a5718c29..80f6265e3740 100644
> --- a/drivers/hwtracing/coresight/coresight-cti-core.c
> +++ b/drivers/hwtracing/coresight/coresight-cti-core.c
> @@ -93,7 +93,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
>         unsigned long flags;
>         int rc = 0;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* no need to do anything if enabled or unpowered*/
>         if (config->hw_enabled || !config->hw_powered)
> @@ -108,7 +108,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
>
>         config->hw_enabled = true;
>         drvdata->config.enable_req_count++;
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>         return rc;
>
>  cti_state_unchanged:
> @@ -116,7 +116,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
>
>         /* cannot enable due to error */
>  cti_err_not_enabled:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>         return rc;
>  }
>
> @@ -125,7 +125,7 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata)
>  {
>         struct cti_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         config->hw_powered = true;
>
>         /* no need to do anything if no enable request */
> @@ -138,12 +138,12 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata)
>
>         cti_write_all_hw_regs(drvdata);
>         config->hw_enabled = true;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return;
>
>         /* did not re-enable due to no claim / no request */
>  cti_hp_not_enabled:
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>  }
>
>  /* disable hardware */
> @@ -153,7 +153,7 @@ static int cti_disable_hw(struct cti_drvdata *drvdata)
>         struct coresight_device *csdev = drvdata->csdev;
>         int ret = 0;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /* don't allow negative refcounts, return an error */
>         if (!drvdata->config.enable_req_count) {
> @@ -177,12 +177,12 @@ static int cti_disable_hw(struct cti_drvdata *drvdata)
>
>         coresight_disclaim_device_unlocked(csdev);
>         CS_LOCK(drvdata->base);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return ret;
>
>         /* not disabled this call */
>  cti_not_disabled:
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return ret;
>  }
>
> @@ -198,11 +198,11 @@ void cti_write_intack(struct device *dev, u32 ackval)
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct cti_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         /* write if enabled */
>         if (cti_active(config))
>                 cti_write_single_reg(drvdata, CTIINTACK, ackval);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>  }
>
>  /*
> @@ -369,7 +369,7 @@ int cti_channel_trig_op(struct device *dev, enum cti_chan_op op,
>         reg_offset = (direction == CTI_TRIG_IN ? CTIINEN(trigger_idx) :
>                       CTIOUTEN(trigger_idx));
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /* read - modify write - the trigger / channel enable value */
>         reg_value = direction == CTI_TRIG_IN ? config->ctiinen[trigger_idx] :
> @@ -388,7 +388,7 @@ int cti_channel_trig_op(struct device *dev, enum cti_chan_op op,
>         /* write through if enabled */
>         if (cti_active(config))
>                 cti_write_single_reg(drvdata, reg_offset, reg_value);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return 0;
>  }
>
> @@ -406,7 +406,7 @@ int cti_channel_gate_op(struct device *dev, enum cti_chan_gate_op op,
>
>         chan_bitmask = BIT(channel_idx);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         reg_value = config->ctigate;
>         switch (op) {
>         case CTI_GATE_CHAN_ENABLE:
> @@ -426,7 +426,7 @@ int cti_channel_gate_op(struct device *dev, enum cti_chan_gate_op op,
>                 if (cti_active(config))
>                         cti_write_single_reg(drvdata, CTIGATE, reg_value);
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return err;
>  }
>
> @@ -445,7 +445,7 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
>
>         chan_bitmask = BIT(channel_idx);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         reg_value = config->ctiappset;
>         switch (op) {
>         case CTI_CHAN_SET:
> @@ -473,7 +473,7 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
>
>         if ((err == 0) && cti_active(config))
>                 cti_write_single_reg(drvdata, reg_offset, reg_value);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         return err;
>  }
> @@ -676,7 +676,7 @@ static int cti_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
>         if (WARN_ON_ONCE(drvdata->ctidev.cpu != cpu))
>                 return NOTIFY_BAD;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         switch (cmd) {
>         case CPU_PM_ENTER:
> @@ -716,7 +716,7 @@ static int cti_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
>         }
>
>  cti_notify_exit:
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return notify_res;
>  }
>
> @@ -743,11 +743,11 @@ static int cti_dying_cpu(unsigned int cpu)
>         if (!drvdata)
>                 return 0;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         drvdata->config.hw_powered = false;
>         if (drvdata->config.hw_enabled)
>                 coresight_disclaim_device(drvdata->csdev);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return 0;
>  }
>
> @@ -888,7 +888,7 @@ static int cti_probe(struct amba_device *adev, const struct amba_id *id)
>         drvdata->ctidev.ctm_id = 0;
>         INIT_LIST_HEAD(&drvdata->ctidev.trig_cons);
>
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>
>         /* initialise CTI driver config values */
>         cti_set_default_config(dev, drvdata);
> diff --git a/drivers/hwtracing/coresight/coresight-cti-sysfs.c b/drivers/hwtracing/coresight/coresight-cti-sysfs.c
> index d25dd2737b49..572b80ee96fb 100644
> --- a/drivers/hwtracing/coresight/coresight-cti-sysfs.c
> +++ b/drivers/hwtracing/coresight/coresight-cti-sysfs.c
> @@ -84,11 +84,11 @@ static ssize_t enable_show(struct device *dev,
>         bool enabled, powered;
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         enable_req = drvdata->config.enable_req_count;
>         powered = drvdata->config.hw_powered;
>         enabled = drvdata->config.hw_enabled;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         if (powered)
>                 return sprintf(buf, "%d\n", enabled);
> @@ -134,9 +134,9 @@ static ssize_t powered_show(struct device *dev,
>         bool powered;
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         powered = drvdata->config.hw_powered;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         return sprintf(buf, "%d\n", powered);
>  }
> @@ -181,10 +181,10 @@ static ssize_t coresight_cti_reg_show(struct device *dev,
>         u32 val = 0;
>
>         pm_runtime_get_sync(dev->parent);
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         if (drvdata->config.hw_powered)
>                 val = readl_relaxed(drvdata->base + cti_attr->off);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         pm_runtime_put_sync(dev->parent);
>         return sysfs_emit(buf, "0x%x\n", val);
>  }
> @@ -202,10 +202,10 @@ static __maybe_unused ssize_t coresight_cti_reg_store(struct device *dev,
>                 return -EINVAL;
>
>         pm_runtime_get_sync(dev->parent);
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         if (drvdata->config.hw_powered)
>                 cti_write_single_reg(drvdata, cti_attr->off, val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         pm_runtime_put_sync(dev->parent);
>         return size;
>  }
> @@ -264,7 +264,7 @@ static ssize_t cti_reg32_show(struct device *dev, char *buf,
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct cti_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         if ((reg_offset >= 0) && cti_active(config)) {
>                 CS_UNLOCK(drvdata->base);
>                 val = readl_relaxed(drvdata->base + reg_offset);
> @@ -274,7 +274,7 @@ static ssize_t cti_reg32_show(struct device *dev, char *buf,
>         } else if (pcached_val) {
>                 val = *pcached_val;
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return sprintf(buf, "%#x\n", val);
>  }
>
> @@ -293,7 +293,7 @@ static ssize_t cti_reg32_store(struct device *dev, const char *buf,
>         if (kstrtoul(buf, 0, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         /* local store */
>         if (pcached_val)
>                 *pcached_val = (u32)val;
> @@ -301,7 +301,7 @@ static ssize_t cti_reg32_store(struct device *dev, const char *buf,
>         /* write through if offset and enabled */
>         if ((reg_offset >= 0) && cti_active(config))
>                 cti_write_single_reg(drvdata, reg_offset, val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>
> @@ -349,9 +349,9 @@ static ssize_t inout_sel_store(struct device *dev,
>         if (val > (CTIINOUTEN_MAX - 1))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         drvdata->config.ctiinout_sel = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(inout_sel);
> @@ -364,10 +364,10 @@ static ssize_t inen_show(struct device *dev,
>         int index;
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         index = drvdata->config.ctiinout_sel;
>         val = drvdata->config.ctiinen[index];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return sprintf(buf, "%#lx\n", val);
>  }
>
> @@ -383,14 +383,14 @@ static ssize_t inen_store(struct device *dev,
>         if (kstrtoul(buf, 0, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         index = config->ctiinout_sel;
>         config->ctiinen[index] = val;
>
>         /* write through if enabled */
>         if (cti_active(config))
>                 cti_write_single_reg(drvdata, CTIINEN(index), val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(inen);
> @@ -403,10 +403,10 @@ static ssize_t outen_show(struct device *dev,
>         int index;
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         index = drvdata->config.ctiinout_sel;
>         val = drvdata->config.ctiouten[index];
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return sprintf(buf, "%#lx\n", val);
>  }
>
> @@ -422,14 +422,14 @@ static ssize_t outen_store(struct device *dev,
>         if (kstrtoul(buf, 0, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         index = config->ctiinout_sel;
>         config->ctiouten[index] = val;
>
>         /* write through if enabled */
>         if (cti_active(config))
>                 cti_write_single_reg(drvdata, CTIOUTEN(index), val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(outen);
> @@ -463,7 +463,7 @@ static ssize_t appclear_store(struct device *dev,
>         if (kstrtoul(buf, 0, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /* a 1'b1 in appclr clears down the same bit in appset*/
>         config->ctiappset &= ~val;
> @@ -471,7 +471,7 @@ static ssize_t appclear_store(struct device *dev,
>         /* write through if enabled */
>         if (cti_active(config))
>                 cti_write_single_reg(drvdata, CTIAPPCLEAR, val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_WO(appclear);
> @@ -487,12 +487,12 @@ static ssize_t apppulse_store(struct device *dev,
>         if (kstrtoul(buf, 0, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /* write through if enabled */
>         if (cti_active(config))
>                 cti_write_single_reg(drvdata, CTIAPPPULSE, val);
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_WO(apppulse);
> @@ -681,9 +681,9 @@ static ssize_t trig_filter_enable_show(struct device *dev,
>         u32 val;
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val = drvdata->config.trig_filter_enable;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return sprintf(buf, "%d\n", val);
>  }
>
> @@ -697,9 +697,9 @@ static ssize_t trig_filter_enable_store(struct device *dev,
>         if (kstrtoul(buf, 0, &val))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         drvdata->config.trig_filter_enable = !!val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_RW(trig_filter_enable);
> @@ -728,7 +728,7 @@ static ssize_t chan_xtrigs_reset_store(struct device *dev,
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>         struct cti_config *config = &drvdata->config;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>
>         /* clear the CTI trigger / channel programming registers */
>         for (i = 0; i < config->nr_trig_max; i++) {
> @@ -747,7 +747,7 @@ static ssize_t chan_xtrigs_reset_store(struct device *dev,
>         if (cti_active(config))
>                 cti_write_all_hw_regs(drvdata);
>
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>  static DEVICE_ATTR_WO(chan_xtrigs_reset);
> @@ -768,9 +768,9 @@ static ssize_t chan_xtrigs_sel_store(struct device *dev,
>         if (val > (drvdata->config.nr_ctm_channels - 1))
>                 return -EINVAL;
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         drvdata->config.xtrig_rchan_sel = val;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>         return size;
>  }
>
> @@ -781,9 +781,9 @@ static ssize_t chan_xtrigs_sel_show(struct device *dev,
>         unsigned long val;
>         struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
>
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         val = drvdata->config.xtrig_rchan_sel;
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         return sprintf(buf, "%ld\n", val);
>  }
> @@ -838,12 +838,12 @@ static ssize_t print_chan_list(struct device *dev,
>         unsigned long inuse_bits = 0, chan_mask;
>
>         /* scan regs to get bitmap of channels in use. */
> -       spin_lock(&drvdata->spinlock);
> +       raw_spin_lock(&drvdata->spinlock);
>         for (i = 0; i < config->nr_trig_max; i++) {
>                 inuse_bits |= config->ctiinen[i];
>                 inuse_bits |= config->ctiouten[i];
>         }
> -       spin_unlock(&drvdata->spinlock);
> +       raw_spin_unlock(&drvdata->spinlock);
>
>         /* inverse bits if printing free channels */
>         if (!inuse)
> diff --git a/drivers/hwtracing/coresight/coresight-cti.h b/drivers/hwtracing/coresight/coresight-cti.h
> index cb9ee616d01f..16e310e7e9d4 100644
> --- a/drivers/hwtracing/coresight/coresight-cti.h
> +++ b/drivers/hwtracing/coresight/coresight-cti.h
> @@ -175,7 +175,7 @@ struct cti_drvdata {
>         void __iomem *base;
>         struct coresight_device *csdev;
>         struct cti_device ctidev;
> -       spinlock_t spinlock;
> +       raw_spinlock_t spinlock;
>         struct cti_config config;
>         struct list_head node;
>         void (*csdev_release)(struct device *dev);
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>


--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 5/9] coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 5/9] coresight-etb10: change etb_drvdata " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In coresight-etb10 drivers, etb_drvdata->spinlock can be held
> during __schedule() by perf_event_task_sched_out()/in().
>
> Since etb_drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type etb_drvdata->spinlock in coresight-etb10 drivers,
> which can be called by perf_event_task_sched_out()/in(),
> from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-etb10.c | 26 +++++++++----------
>  1 file changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c
> index aea9ac9c4bd0..7948597d483d 100644
> --- a/drivers/hwtracing/coresight/coresight-etb10.c
> +++ b/drivers/hwtracing/coresight/coresight-etb10.c
> @@ -84,7 +84,7 @@ struct etb_drvdata {
>         struct clk              *atclk;
>         struct coresight_device *csdev;
>         struct miscdevice       miscdev;
> -       spinlock_t              spinlock;
> +       raw_spinlock_t          spinlock;
>         local_t                 reading;
>         pid_t                   pid;
>         u8                      *buf;
> @@ -145,7 +145,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev)
>         unsigned long flags;
>         struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* Don't messup with perf sessions. */
>         if (coresight_get_mode(csdev) == CS_MODE_PERF) {
> @@ -163,7 +163,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev)
>
>         csdev->refcnt++;
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>         return ret;
>  }
>
> @@ -176,7 +176,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
>         struct perf_output_handle *handle = data;
>         struct cs_buffers *buf = etm_perf_sink_config(handle);
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* No need to continue if the component is already in used by sysFS. */
>         if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
> @@ -219,7 +219,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
>         }
>
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>         return ret;
>  }
>
> @@ -352,11 +352,11 @@ static int etb_disable(struct coresight_device *csdev)
>         struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>         unsigned long flags;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         csdev->refcnt--;
>         if (csdev->refcnt) {
> -               spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +               raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>                 return -EBUSY;
>         }
>
> @@ -366,7 +366,7 @@ static int etb_disable(struct coresight_device *csdev)
>         /* Dissociate from monitored process. */
>         drvdata->pid = -1;
>         coresight_set_mode(csdev, CS_MODE_DISABLED);
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         dev_dbg(&csdev->dev, "ETB disabled\n");
>         return 0;
> @@ -443,7 +443,7 @@ static unsigned long etb_update_buffer(struct coresight_device *csdev,
>
>         capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>
>         /* Don't do anything if another tracer is using this sink */
>         if (csdev->refcnt != 1)
> @@ -566,7 +566,7 @@ static unsigned long etb_update_buffer(struct coresight_device *csdev,
>         __etb_enable_hw(drvdata);
>         CS_LOCK(drvdata->base);
>  out:
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         return to_read;
>  }
> @@ -587,13 +587,13 @@ static void etb_dump(struct etb_drvdata *drvdata)
>  {
>         unsigned long flags;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) {
>                 __etb_disable_hw(drvdata);
>                 etb_dump_hw(drvdata);
>                 __etb_enable_hw(drvdata);
>         }
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         dev_dbg(&drvdata->csdev->dev, "ETB dumped\n");
>  }
> @@ -746,7 +746,7 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
>         drvdata->base = base;
>         desc.access = CSDEV_ACCESS_IOMEM(base);
>
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>
>         drvdata->buffer_depth = etb_get_buffer_depth(drvdata);
>
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>

--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  2024-12-20 10:07     ` Yeoreum Yun
  0 siblings, 1 reply; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Title of patch - this patch has nothing to do with cti_drvdata.

Mike


On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In ultrasoc-smb drivers, smb_drv_data->spinlock can be held
> during __schedule() by perf_event_task_sched_out()/in().
>
> Since smb__drv_data->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type smb_drv_data->spinlock in ultrasoc-smb drivers,
> which can be called by perf_event_task_sched_out()/in(),
> from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  drivers/hwtracing/coresight/ultrasoc-smb.c | 12 ++++++------
>  drivers/hwtracing/coresight/ultrasoc-smb.h |  2 +-
>  2 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.c b/drivers/hwtracing/coresight/ultrasoc-smb.c
> index dc3c9504dd7c..26cfc939e5bd 100644
> --- a/drivers/hwtracing/coresight/ultrasoc-smb.c
> +++ b/drivers/hwtracing/coresight/ultrasoc-smb.c
> @@ -98,7 +98,7 @@ static int smb_open(struct inode *inode, struct file *file)
>         struct smb_drv_data *drvdata = container_of(file->private_data,
>                                         struct smb_drv_data, miscdev);
>
> -       guard(spinlock)(&drvdata->spinlock);
> +       guard(raw_spinlock)(&drvdata->spinlock);
>
>         if (drvdata->reading)
>                 return -EBUSY;
> @@ -152,7 +152,7 @@ static int smb_release(struct inode *inode, struct file *file)
>         struct smb_drv_data *drvdata = container_of(file->private_data,
>                                         struct smb_drv_data, miscdev);
>
> -       guard(spinlock)(&drvdata->spinlock);
> +       guard(raw_spinlock)(&drvdata->spinlock);
>         drvdata->reading = false;
>
>         return 0;
> @@ -245,7 +245,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,
>         struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
>         int ret = 0;
>
> -       guard(spinlock)(&drvdata->spinlock);
> +       guard(raw_spinlock)(&drvdata->spinlock);
>
>         /* Do nothing, the trace data is reading by other interface now */
>         if (drvdata->reading)
> @@ -280,7 +280,7 @@ static int smb_disable(struct coresight_device *csdev)
>  {
>         struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> -       guard(spinlock)(&drvdata->spinlock);
> +       guard(raw_spinlock)(&drvdata->spinlock);
>
>         if (drvdata->reading)
>                 return -EBUSY;
> @@ -378,7 +378,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
>         if (!buf)
>                 return 0;
>
> -       guard(spinlock)(&drvdata->spinlock);
> +       guard(raw_spinlock)(&drvdata->spinlock);
>
>         /* Don't do anything if another tracer is using this sink. */
>         if (csdev->refcnt != 1)
> @@ -563,7 +563,7 @@ static int smb_probe(struct platform_device *pdev)
>
>         smb_reset_buffer(drvdata);
>         platform_set_drvdata(pdev, drvdata);
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>         drvdata->pid = -1;
>
>         ret = smb_register_sink(pdev, drvdata);
> diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.h b/drivers/hwtracing/coresight/ultrasoc-smb.h
> index a91d39cfccb8..c4c111275627 100644
> --- a/drivers/hwtracing/coresight/ultrasoc-smb.h
> +++ b/drivers/hwtracing/coresight/ultrasoc-smb.h
> @@ -115,7 +115,7 @@ struct smb_drv_data {
>         struct coresight_device *csdev;
>         struct smb_data_buffer sdb;
>         struct miscdevice miscdev;
> -       spinlock_t spinlock;
> +       raw_spinlock_t spinlock;
>         bool reading;
>         pid_t pid;
>  };
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>


--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 6/9] coresight-funnel: change funnel_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 6/9] coresight-funnel: change funnel_drvdata " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In coresight-funnel drivers, cti_drvdata->spinlock can be held
> during __schedule() by perf_event_task_sched_out()/in().
>
> Since funnel_drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type funnel_drvdata->spinlock in
> coresight-funnel drivers, which can be called by
> perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-funnel.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c
> index 33efe1acbef7..a566c8854327 100644
> --- a/drivers/hwtracing/coresight/coresight-funnel.c
> +++ b/drivers/hwtracing/coresight/coresight-funnel.c
> @@ -47,7 +47,7 @@ struct funnel_drvdata {
>         struct clk              *pclk;
>         struct coresight_device *csdev;
>         unsigned long           priority;
> -       spinlock_t              spinlock;
> +       raw_spinlock_t          spinlock;
>  };
>
>  static int dynamic_funnel_enable_hw(struct funnel_drvdata *drvdata, int port)
> @@ -85,7 +85,7 @@ static int funnel_enable(struct coresight_device *csdev,
>         unsigned long flags;
>         bool first_enable = false;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (atomic_read(&in->dest_refcnt) == 0) {
>                 if (drvdata->base)
>                         rc = dynamic_funnel_enable_hw(drvdata, in->dest_port);
> @@ -94,7 +94,7 @@ static int funnel_enable(struct coresight_device *csdev,
>         }
>         if (!rc)
>                 atomic_inc(&in->dest_refcnt);
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (first_enable)
>                 dev_dbg(&csdev->dev, "FUNNEL inport %d enabled\n",
> @@ -129,13 +129,13 @@ static void funnel_disable(struct coresight_device *csdev,
>         unsigned long flags;
>         bool last_disable = false;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (atomic_dec_return(&in->dest_refcnt) == 0) {
>                 if (drvdata->base)
>                         dynamic_funnel_disable_hw(drvdata, in->dest_port);
>                 last_disable = true;
>         }
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (last_disable)
>                 dev_dbg(&csdev->dev, "FUNNEL inport %d disabled\n",
> @@ -266,7 +266,7 @@ static int funnel_probe(struct device *dev, struct resource *res)
>         }
>         dev->platform_data = pdata;
>
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>         desc.type = CORESIGHT_DEV_TYPE_LINK;
>         desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG;
>         desc.ops = &funnel_cs_ops;
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>

--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 7/9] coresight-replicator: change replicator_drvdata spinlock's type to raw_spinlock_t
  2024-12-16 11:50 ` [PATCH v3 7/9] coresight-replicator: change replicator_drvdata " Yeoreum Yun
@ 2024-12-19 12:24   ` Mike Leach
  0 siblings, 0 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:24 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In coresight-replicator drivers, replicator_drvdata->spinlock can be held
> during __schedule() by perf_event_task_sched_out()/in().
>
> Since replicator_drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this, change type replicator_drvdata->spinlock in
> coresight-replicator drivers, which can be called
> by perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-replicator.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c
> index 0fba87de6d1a..7d36fe2176cc 100644
> --- a/drivers/hwtracing/coresight/coresight-replicator.c
> +++ b/drivers/hwtracing/coresight/coresight-replicator.c
> @@ -41,7 +41,7 @@ struct replicator_drvdata {
>         struct clk              *atclk;
>         struct clk              *pclk;
>         struct coresight_device *csdev;
> -       spinlock_t              spinlock;
> +       raw_spinlock_t          spinlock;
>         bool                    check_idfilter_val;
>  };
>
> @@ -125,7 +125,7 @@ static int replicator_enable(struct coresight_device *csdev,
>         unsigned long flags;
>         bool first_enable = false;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (atomic_read(&out->src_refcnt) == 0) {
>                 if (drvdata->base)
>                         rc = dynamic_replicator_enable(drvdata, in->dest_port,
> @@ -135,7 +135,7 @@ static int replicator_enable(struct coresight_device *csdev,
>         }
>         if (!rc)
>                 atomic_inc(&out->src_refcnt);
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (first_enable)
>                 dev_dbg(&csdev->dev, "REPLICATOR enabled\n");
> @@ -179,14 +179,14 @@ static void replicator_disable(struct coresight_device *csdev,
>         unsigned long flags;
>         bool last_disable = false;
>
> -       spin_lock_irqsave(&drvdata->spinlock, flags);
> +       raw_spin_lock_irqsave(&drvdata->spinlock, flags);
>         if (atomic_dec_return(&out->src_refcnt) == 0) {
>                 if (drvdata->base)
>                         dynamic_replicator_disable(drvdata, in->dest_port,
>                                                    out->src_port);
>                 last_disable = true;
>         }
> -       spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +       raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
>         if (last_disable)
>                 dev_dbg(&csdev->dev, "REPLICATOR disabled\n");
> @@ -277,7 +277,7 @@ static int replicator_probe(struct device *dev, struct resource *res)
>         }
>         dev->platform_data = pdata;
>
> -       spin_lock_init(&drvdata->spinlock);
> +       raw_spin_lock_init(&drvdata->spinlock);
>         desc.type = CORESIGHT_DEV_TYPE_LINK;
>         desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
>         desc.ops = &replicator_cs_ops;
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Reviewed-by: Mike Leach <mike.leach@linaro.org>

--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
                   ` (8 preceding siblings ...)
  2024-12-16 11:50 ` [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata " Yeoreum Yun
@ 2024-12-19 12:27 ` Mike Leach
  2024-12-20 10:06   ` Yeoreum Yun
  2024-12-20 10:38   ` Yeoreum Yun
  9 siblings, 2 replies; 29+ messages in thread
From: Mike Leach @ 2024-12-19 12:27 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi,

On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
>
> In some coresight drivers, drvdata->spinlock can be held during __schedule()
> by perf_event_task_sched_out()/in().
>
> Since drvdata->spinlock type is spinlock_t and
> perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> which is raw_spinlock_t (an unsleepable lock),
> this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
>
> To address this,change type drvdata->spinlock in some coresight drivers,
> which can be called by perf_event_task_sched_out()/in(),
> from spinlock_t to raw_spinlock_t.
>
> Reviewed-by: James Clark <james.clark@linaro.org>
>
> v2 to v3:
>     - Fix build error
>
> v1 to v2:
>     - seperate patchsets to change locktype and apply gurad API.
>
> Yeoreum Yun (9):
>   coresight: change coresight_device lock type to  raw_spinlock_t
>   coresight-etm4x: change etmv4_drvdata spinlock type to  raw_spinlock_t
>   coresight: change coresight_trace_id_map's lock type to
>     raw_spinlock_t
>   coresight-cti: change cti_drvdata spinlock's type to raw_spinlock_t
>   coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t
>   coresight-funnel: change funnel_drvdata spinlock's type to
>     raw_spinlock_t
>   coresight-replicator: change replicator_drvdata spinlock's type to
>     raw_spinlock_t
>   coresight-tmc: change tmc_drvdata spinlock's type to raw_spinlock_t
>   coresight/ultrasoc: change cti_drvdata spinlock's type to
>     raw_spinlock_t
>
>  .../hwtracing/coresight/coresight-config.c    |   8 +-
>  .../hwtracing/coresight/coresight-config.h    |   2 +-
>  drivers/hwtracing/coresight/coresight-core.c  |   2 +-
>  .../hwtracing/coresight/coresight-cti-core.c  |  44 +--
>  .../hwtracing/coresight/coresight-cti-sysfs.c |  76 +++---
>  drivers/hwtracing/coresight/coresight-cti.h   |   2 +-
>  drivers/hwtracing/coresight/coresight-etb10.c |  26 +-
>  .../coresight/coresight-etm4x-core.c          |  18 +-
>  .../coresight/coresight-etm4x-sysfs.c         | 250 +++++++++---------
>  drivers/hwtracing/coresight/coresight-etm4x.h |   2 +-
>  .../hwtracing/coresight/coresight-funnel.c    |  12 +-
>  .../coresight/coresight-replicator.c          |  12 +-
>  .../hwtracing/coresight/coresight-syscfg.c    |  26 +-
>  .../hwtracing/coresight/coresight-tmc-core.c  |   6 +-
>  .../hwtracing/coresight/coresight-tmc-etf.c   |  48 ++--
>  .../hwtracing/coresight/coresight-tmc-etr.c   |  40 +--
>  drivers/hwtracing/coresight/coresight-tmc.h   |   2 +-
>  .../hwtracing/coresight/coresight-trace-id.c  |  22 +-
>  drivers/hwtracing/coresight/ultrasoc-smb.c    |  12 +-
>  drivers/hwtracing/coresight/ultrasoc-smb.h    |   2 +-
>  include/linux/coresight.h                     |   4 +-
>  21 files changed, 308 insertions(+), 308 deletions(-)
>
> --
> LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
>

Notably missing is the same changes for the etm3x driver. The ETMv3.x
and PTM1.x are supported by this driver, and these trace source
variants are also supported in perf in the cs_etm.c code.

STM is also missing, though this is not directly enabled via perf -
but could perhaps run concurrently as it can be a target output for
ftrace.

Regards

Mike

-- 
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-19 12:27 ` [PATCH v3 0/9] coresight: change some driver' spinlock " Mike Leach
@ 2024-12-20 10:06   ` Yeoreum Yun
  2024-12-20 10:38   ` Yeoreum Yun
  1 sibling, 0 replies; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-20 10:06 UTC (permalink / raw)
  To: Mike Leach
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Mike,

> Hi,
>
> On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
> >
> > In some coresight drivers, drvdata->spinlock can be held during __schedule()
> > by perf_event_task_sched_out()/in().
> >
> > Since drvdata->spinlock type is spinlock_t and
> > perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> > which is raw_spinlock_t (an unsleepable lock),
> > this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
> >
> > To address this,change type drvdata->spinlock in some coresight drivers,
> > which can be called by perf_event_task_sched_out()/in(),
> > from spinlock_t to raw_spinlock_t.
> >
> > Reviewed-by: James Clark <james.clark@linaro.org>
> >
> > v2 to v3:
> >     - Fix build error
> >
> > v1 to v2:
> >     - seperate patchsets to change locktype and apply gurad API.
> >
> > Yeoreum Yun (9):
> >   coresight: change coresight_device lock type to  raw_spinlock_t
> >   coresight-etm4x: change etmv4_drvdata spinlock type to  raw_spinlock_t
> >   coresight: change coresight_trace_id_map's lock type to
> >     raw_spinlock_t
> >   coresight-cti: change cti_drvdata spinlock's type to raw_spinlock_t
> >   coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t
> >   coresight-funnel: change funnel_drvdata spinlock's type to
> >     raw_spinlock_t
> >   coresight-replicator: change replicator_drvdata spinlock's type to
> >     raw_spinlock_t
> >   coresight-tmc: change tmc_drvdata spinlock's type to raw_spinlock_t
> >   coresight/ultrasoc: change cti_drvdata spinlock's type to
> >     raw_spinlock_t
> >
> >  .../hwtracing/coresight/coresight-config.c    |   8 +-
> >  .../hwtracing/coresight/coresight-config.h    |   2 +-
> >  drivers/hwtracing/coresight/coresight-core.c  |   2 +-
> >  .../hwtracing/coresight/coresight-cti-core.c  |  44 +--
> >  .../hwtracing/coresight/coresight-cti-sysfs.c |  76 +++---
> >  drivers/hwtracing/coresight/coresight-cti.h   |   2 +-
> >  drivers/hwtracing/coresight/coresight-etb10.c |  26 +-
> >  .../coresight/coresight-etm4x-core.c          |  18 +-
> >  .../coresight/coresight-etm4x-sysfs.c         | 250 +++++++++---------
> >  drivers/hwtracing/coresight/coresight-etm4x.h |   2 +-
> >  .../hwtracing/coresight/coresight-funnel.c    |  12 +-
> >  .../coresight/coresight-replicator.c          |  12 +-
> >  .../hwtracing/coresight/coresight-syscfg.c    |  26 +-
> >  .../hwtracing/coresight/coresight-tmc-core.c  |   6 +-
> >  .../hwtracing/coresight/coresight-tmc-etf.c   |  48 ++--
> >  .../hwtracing/coresight/coresight-tmc-etr.c   |  40 +--
> >  drivers/hwtracing/coresight/coresight-tmc.h   |   2 +-
> >  .../hwtracing/coresight/coresight-trace-id.c  |  22 +-
> >  drivers/hwtracing/coresight/ultrasoc-smb.c    |  12 +-
> >  drivers/hwtracing/coresight/ultrasoc-smb.h    |   2 +-
> >  include/linux/coresight.h                     |   4 +-
> >  21 files changed, 308 insertions(+), 308 deletions(-)
> >
> > --
> > LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
> >
>
> Notably missing is the same changes for the etm3x driver. The ETMv3.x
> and PTM1.x are supported by this driver, and these trace source
> variants are also supported in perf in the cs_etm.c code.
>
> STM is also missing, though this is not directly enabled via perf -
> but could perhaps run concurrently as it can be a target output for
> ftrace.
>
> Regards

Thanks for review. okay I'll back with new patch set including etm3 /
stm.

Thanks!

> --
> Mike Leach
> Principal Engineer, ARM Ltd.
> Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata spinlock's type to raw_spinlock_t
  2024-12-19 12:24   ` Mike Leach
@ 2024-12-20 10:07     ` Yeoreum Yun
  0 siblings, 0 replies; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-20 10:07 UTC (permalink / raw)
  To: Mike Leach
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Mike.

> Title of patch - this patch has nothing to do with cti_drvdata.

Sorry. I'll fix this. Thanks
>
>
> On Mon, 16 Dec 2024 at 11:50, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
> >
> > In ultrasoc-smb drivers, smb_drv_data->spinlock can be held
> > during __schedule() by perf_event_task_sched_out()/in().
> >
> > Since smb__drv_data->spinlock type is spinlock_t and
> > perf_event_task_sched_out()/in() is called after acquiring rq_lock,
> > which is raw_spinlock_t (an unsleepable lock),
> > this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable.
> >
> > To address this, change type smb_drv_data->spinlock in ultrasoc-smb drivers,
> > which can be called by perf_event_task_sched_out()/in(),
> > from spinlock_t to raw_spinlock_t.
> >
> > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
> > ---
> >  drivers/hwtracing/coresight/ultrasoc-smb.c | 12 ++++++------
> >  drivers/hwtracing/coresight/ultrasoc-smb.h |  2 +-
> >  2 files changed, 7 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.c b/drivers/hwtracing/coresight/ultrasoc-smb.c
> > index dc3c9504dd7c..26cfc939e5bd 100644
> > --- a/drivers/hwtracing/coresight/ultrasoc-smb.c
> > +++ b/drivers/hwtracing/coresight/ultrasoc-smb.c
> > @@ -98,7 +98,7 @@ static int smb_open(struct inode *inode, struct file *file)
> >         struct smb_drv_data *drvdata = container_of(file->private_data,
> >                                         struct smb_drv_data, miscdev);
> >
> > -       guard(spinlock)(&drvdata->spinlock);
> > +       guard(raw_spinlock)(&drvdata->spinlock);
> >
> >         if (drvdata->reading)
> >                 return -EBUSY;
> > @@ -152,7 +152,7 @@ static int smb_release(struct inode *inode, struct file *file)
> >         struct smb_drv_data *drvdata = container_of(file->private_data,
> >                                         struct smb_drv_data, miscdev);
> >
> > -       guard(spinlock)(&drvdata->spinlock);
> > +       guard(raw_spinlock)(&drvdata->spinlock);
> >         drvdata->reading = false;
> >
> >         return 0;
> > @@ -245,7 +245,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,
> >         struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
> >         int ret = 0;
> >
> > -       guard(spinlock)(&drvdata->spinlock);
> > +       guard(raw_spinlock)(&drvdata->spinlock);
> >
> >         /* Do nothing, the trace data is reading by other interface now */
> >         if (drvdata->reading)
> > @@ -280,7 +280,7 @@ static int smb_disable(struct coresight_device *csdev)
> >  {
> >         struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
> >
> > -       guard(spinlock)(&drvdata->spinlock);
> > +       guard(raw_spinlock)(&drvdata->spinlock);
> >
> >         if (drvdata->reading)
> >                 return -EBUSY;
> > @@ -378,7 +378,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
> >         if (!buf)
> >                 return 0;
> >
> > -       guard(spinlock)(&drvdata->spinlock);
> > +       guard(raw_spinlock)(&drvdata->spinlock);
> >
> >         /* Don't do anything if another tracer is using this sink. */
> >         if (csdev->refcnt != 1)
> > @@ -563,7 +563,7 @@ static int smb_probe(struct platform_device *pdev)
> >
> >         smb_reset_buffer(drvdata);
> >         platform_set_drvdata(pdev, drvdata);
> > -       spin_lock_init(&drvdata->spinlock);
> > +       raw_spin_lock_init(&drvdata->spinlock);
> >         drvdata->pid = -1;
> >
> >         ret = smb_register_sink(pdev, drvdata);
> > diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.h b/drivers/hwtracing/coresight/ultrasoc-smb.h
> > index a91d39cfccb8..c4c111275627 100644
> > --- a/drivers/hwtracing/coresight/ultrasoc-smb.h
> > +++ b/drivers/hwtracing/coresight/ultrasoc-smb.h
> > @@ -115,7 +115,7 @@ struct smb_drv_data {
> >         struct coresight_device *csdev;
> >         struct smb_data_buffer sdb;
> >         struct miscdevice miscdev;
> > -       spinlock_t spinlock;
> > +       raw_spinlock_t spinlock;
> >         bool reading;
> >         pid_t pid;
> >  };
> > --
> > LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
> >
>
>
> --
> Mike Leach
> Principal Engineer, ARM Ltd.
> Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock type to raw_spinlock_t
  2024-12-19 12:24   ` Mike Leach
@ 2024-12-20 10:13     ` Yeoreum Yun
  0 siblings, 0 replies; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-20 10:13 UTC (permalink / raw)
  To: Mike Leach
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Mike.
> > diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h
> > index 6ba013975741..b9ebc9fcfb7f 100644
> > --- a/drivers/hwtracing/coresight/coresight-config.h
> > +++ b/drivers/hwtracing/coresight/coresight-config.h
> > @@ -206,7 +206,7 @@ struct cscfg_feature_csdev {
> >         const struct cscfg_feature_desc *feat_desc;
> >         struct coresight_device *csdev;
> >         struct list_head node;
> > -       spinlock_t *drv_spinlock;
> > +       raw_spinlock_t *drv_spinlock;
> >         int nr_params;
> >         struct cscfg_parameter_csdev *params_csdev;
> >         int nr_regs;
>
> The above changes are not etm4x specific - should be in the previous patch.

Yes, However when this changes, etm4x should be changed at the same time
because of build failures.

That's why I modified this with etm4x where currenly cscfg is used only.

Thanks


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-19 12:27 ` [PATCH v3 0/9] coresight: change some driver' spinlock " Mike Leach
  2024-12-20 10:06   ` Yeoreum Yun
@ 2024-12-20 10:38   ` Yeoreum Yun
  2024-12-20 11:35     ` Suzuki K Poulose
  1 sibling, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-20 10:38 UTC (permalink / raw)
  To: Mike Leach
  Cc: suzuki.poulose, james.clark, alexander.shishkin, bigeasy,
	clrkwllms, rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Mike.

> Notably missing is the same changes for the etm3x driver. The ETMv3.x
> and PTM1.x are supported by this driver, and these trace source
> variants are also supported in perf in the cs_etm.c code.

But I wonder etmv3 needs to change. Because its spinlock is used only
via sysfs enable/disable path.
So, I think it doesn't need to change the lock type.

> STM is also missing, though this is not directly enabled via perf -
> but could perhaps run concurrently as it can be a target output for
> ftrace.

Actually, I couldn't find out the path where
the STM's lock could be grabbed under other raw_spin_lock (including csdev)
If you don't mind would you let me the code path please?

Thanks
> --
> Mike Leach
> Principal Engineer, ARM Ltd.
> Manchester Design Centre. UK


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-20 10:38   ` Yeoreum Yun
@ 2024-12-20 11:35     ` Suzuki K Poulose
  2024-12-20 11:39       ` Yeoreum Yun
  0 siblings, 1 reply; 29+ messages in thread
From: Suzuki K Poulose @ 2024-12-20 11:35 UTC (permalink / raw)
  To: Yeoreum Yun, Mike Leach
  Cc: james.clark, alexander.shishkin, bigeasy, clrkwllms, rostedt,
	coresight, linux-arm-kernel, linux-kernel, linux-rt-devel

On 20/12/2024 10:38, Yeoreum Yun wrote:
> Hi Mike.
> 
>> Notably missing is the same changes for the etm3x driver. The ETMv3.x
>> and PTM1.x are supported by this driver, and these trace source
>> variants are also supported in perf in the cs_etm.c code.
> 
> But I wonder etmv3 needs to change. Because its spinlock is used only
> via sysfs enable/disable path.
> So, I think it doesn't need to change the lock type.

ETM3 can be used in perf mode, similar to the ETM4x.

So, you need to fix it as well.


> 
>> STM is also missing, though this is not directly enabled via perf -
>> but could perhaps run concurrently as it can be a target output for
>> ftrace.
> 
> Actually, I couldn't find out the path where
> the STM's lock could be grabbed under other raw_spin_lock (including csdev)
> If you don't mind would you let me the code path please?

STM can't be used in perf mode, and as such you may skip it.

Suzuki


> 
> Thanks
>> --
>> Mike Leach
>> Principal Engineer, ARM Ltd.
>> Manchester Design Centre. UK



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-20 11:35     ` Suzuki K Poulose
@ 2024-12-20 11:39       ` Yeoreum Yun
  2024-12-20 11:48         ` Suzuki K Poulose
  0 siblings, 1 reply; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-20 11:39 UTC (permalink / raw)
  To: Suzuki K Poulose
  Cc: Mike Leach, james.clark, alexander.shishkin, bigeasy, clrkwllms,
	rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Suzuki,
> On 20/12/2024 10:38, Yeoreum Yun wrote:
> > Hi Mike.
> >
> > > Notably missing is the same changes for the etm3x driver. The ETMv3.x
> > > and PTM1.x are supported by this driver, and these trace source
> > > variants are also supported in perf in the cs_etm.c code.
> >
> > But I wonder etmv3 needs to change. Because its spinlock is used only
> > via sysfs enable/disable path.
> > So, I think it doesn't need to change the lock type.
>
> ETM3 can be used in perf mode, similar to the ETM4x.
>
> So, you need to fix it as well.

Yes. But etmv3's etmdata->spinlock doesn't used in perf path
its usage is only in sysfs interface path.
That's why I think it could skip too.

Thanks.


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-20 11:39       ` Yeoreum Yun
@ 2024-12-20 11:48         ` Suzuki K Poulose
  2024-12-20 11:50           ` Yeoreum Yun
  2024-12-21 17:02           ` Yeoreum Yun
  0 siblings, 2 replies; 29+ messages in thread
From: Suzuki K Poulose @ 2024-12-20 11:48 UTC (permalink / raw)
  To: Yeoreum Yun
  Cc: Mike Leach, james.clark, alexander.shishkin, bigeasy, clrkwllms,
	rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

On 20/12/2024 11:39, Yeoreum Yun wrote:
> Hi Suzuki,
>> On 20/12/2024 10:38, Yeoreum Yun wrote:
>>> Hi Mike.
>>>
>>>> Notably missing is the same changes for the etm3x driver. The ETMv3.x
>>>> and PTM1.x are supported by this driver, and these trace source
>>>> variants are also supported in perf in the cs_etm.c code.
>>>
>>> But I wonder etmv3 needs to change. Because its spinlock is used only
>>> via sysfs enable/disable path.
>>> So, I think it doesn't need to change the lock type.
>>
>> ETM3 can be used in perf mode, similar to the ETM4x.
>>
>> So, you need to fix it as well.
> 
> Yes. But etmv3's etmdata->spinlock doesn't used in perf path
> its usage is only in sysfs interface path.
> That's why I think it could skip too.

Ok, which I think is a problem, since the sysfs mode could overwrite the 
"config" while perf is preparing the config from the event parsing.
And we would need it there. So, for the time being, we can accept this
series, pending other review comments and address this issue separately

Suzuki


> 
> Thanks.



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-20 11:48         ` Suzuki K Poulose
@ 2024-12-20 11:50           ` Yeoreum Yun
  2024-12-21 17:02           ` Yeoreum Yun
  1 sibling, 0 replies; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-20 11:50 UTC (permalink / raw)
  To: Suzuki K Poulose
  Cc: Mike Leach, james.clark, alexander.shishkin, bigeasy, clrkwllms,
	rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Suzuki,

> > > >
> > > > > Notably missing is the same changes for the etm3x driver. The ETMv3.x
> > > > > and PTM1.x are supported by this driver, and these trace source
> > > > > variants are also supported in perf in the cs_etm.c code.
> > > >
> > > > But I wonder etmv3 needs to change. Because its spinlock is used only
> > > > via sysfs enable/disable path.
> > > > So, I think it doesn't need to change the lock type.
> > >
> > > ETM3 can be used in perf mode, similar to the ETM4x.
> > >
> > > So, you need to fix it as well.
> >
> > Yes. But etmv3's etmdata->spinlock doesn't used in perf path
> > its usage is only in sysfs interface path.
> > That's why I think it could skip too.
>
> Ok, which I think is a problem, since the sysfs mode could overwrite the
> "config" while perf is preparing the config from the event parsing.
> And we would need it there. So, for the time being, we can accept this
> series, pending other review comments and address this issue separately

Agree. also it has the same problem in etm4.
I have a patchset for etm3/etm4 for this. but it's based on this series.
So, after this patch is mereged. I'll send related patch.
Thanks.


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t
  2024-12-20 11:48         ` Suzuki K Poulose
  2024-12-20 11:50           ` Yeoreum Yun
@ 2024-12-21 17:02           ` Yeoreum Yun
  1 sibling, 0 replies; 29+ messages in thread
From: Yeoreum Yun @ 2024-12-21 17:02 UTC (permalink / raw)
  To: Suzuki K Poulose
  Cc: Mike Leach, james.clark, alexander.shishkin, bigeasy, clrkwllms,
	rostedt, coresight, linux-arm-kernel, linux-kernel,
	linux-rt-devel

Hi Suzuki.

> On 20/12/2024 11:39, Yeoreum Yun wrote:
> > Hi Suzuki,
> > > On 20/12/2024 10:38, Yeoreum Yun wrote:
> > > > Hi Mike.
> > > >
> > > > > Notably missing is the same changes for the etm3x driver. The ETMv3.x
> > > > > and PTM1.x are supported by this driver, and these trace source
> > > > > variants are also supported in perf in the cs_etm.c code.
> > > >
> > > > But I wonder etmv3 needs to change. Because its spinlock is used only
> > > > via sysfs enable/disable path.
> > > > So, I think it doesn't need to change the lock type.
> > >
> > > ETM3 can be used in perf mode, similar to the ETM4x.
> > >
> > > So, you need to fix it as well.
> >
> > Yes. But etmv3's etmdata->spinlock doesn't used in perf path
> > its usage is only in sysfs interface path.
> > That's why I think it could skip too.
>
> Ok, which I think is a problem, since the sysfs mode could overwrite the
> "config" while perf is preparing the config from the event parsing.
> And we would need it there. So, for the time being, we can accept this
> series, pending other review comments and address this issue separately
>

Here is the patchset fixing above one:
    - https://lore.kernel.org/linux-arm-kernel/20241221165934.1161856-1-yeoreum.yun@arm.com/


^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2024-12-21 17:07 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-16 11:49 [PATCH v3 0/9] coresight: change some driver' spinlock type to raw_spinlock_t Yeoreum Yun
2024-12-16 11:49 ` [PATCH v3 1/9] coresight: change coresight_device lock " Yeoreum Yun
2024-12-19 12:23   ` Mike Leach
2024-12-16 11:49 ` [PATCH v3 2/9] coresight-etm4x: change etmv4_drvdata spinlock " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-20 10:13     ` Yeoreum Yun
2024-12-16 11:50 ` [PATCH v3 3/9] coresight: change coresight_trace_id_map's lock " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-16 11:50 ` [PATCH v3 4/9] coresight-cti: change cti_drvdata spinlock's " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-16 11:50 ` [PATCH v3 5/9] coresight-etb10: change etb_drvdata " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-16 11:50 ` [PATCH v3 6/9] coresight-funnel: change funnel_drvdata " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-16 11:50 ` [PATCH v3 7/9] coresight-replicator: change replicator_drvdata " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-16 11:50 ` [PATCH v3 8/9] coresight-tmc: change tmc_drvdata " Yeoreum Yun
2024-12-19 12:23   ` Mike Leach
2024-12-16 11:50 ` [PATCH v3 9/9] coresight/ultrasoc: change cti_drvdata " Yeoreum Yun
2024-12-19 12:24   ` Mike Leach
2024-12-20 10:07     ` Yeoreum Yun
2024-12-19 12:27 ` [PATCH v3 0/9] coresight: change some driver' spinlock " Mike Leach
2024-12-20 10:06   ` Yeoreum Yun
2024-12-20 10:38   ` Yeoreum Yun
2024-12-20 11:35     ` Suzuki K Poulose
2024-12-20 11:39       ` Yeoreum Yun
2024-12-20 11:48         ` Suzuki K Poulose
2024-12-20 11:50           ` Yeoreum Yun
2024-12-21 17:02           ` Yeoreum Yun

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).