Skip to content

Commit 743c5a9

Browse files
LeviYeoReumSuzuki K Poulose
authored andcommitted
coresight-etm4x: change etmv4_drvdata spinlock type to raw_spinlock_t
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> Reviewed-by: James Clark <james.clark@linaro.org> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/20250306121110.1647948-3-yeoreum.yun@arm.com
1 parent 26f060c commit 743c5a9

File tree

5 files changed

+140
-140
lines changed

5 files changed

+140
-140
lines changed

drivers/hwtracing/coresight/coresight-config.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ static int cscfg_set_on_enable(struct cscfg_feature_csdev *feat_csdev)
7676
unsigned long flags;
7777
int i;
7878

79-
spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
79+
raw_spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
8080
for (i = 0; i < feat_csdev->nr_regs; i++)
8181
cscfg_set_reg(&feat_csdev->regs_csdev[i]);
82-
spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
82+
raw_spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
8383
dev_dbg(&feat_csdev->csdev->dev, "Feature %s: %s",
8484
feat_csdev->feat_desc->name, "set on enable");
8585
return 0;
@@ -91,10 +91,10 @@ static void cscfg_save_on_disable(struct cscfg_feature_csdev *feat_csdev)
9191
unsigned long flags;
9292
int i;
9393

94-
spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
94+
raw_spin_lock_irqsave(feat_csdev->drv_spinlock, flags);
9595
for (i = 0; i < feat_csdev->nr_regs; i++)
9696
cscfg_save_reg(&feat_csdev->regs_csdev[i]);
97-
spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
97+
raw_spin_unlock_irqrestore(feat_csdev->drv_spinlock, flags);
9898
dev_dbg(&feat_csdev->csdev->dev, "Feature %s: %s",
9999
feat_csdev->feat_desc->name, "save on disable");
100100
}

drivers/hwtracing/coresight/coresight-config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ struct cscfg_feature_csdev {
206206
const struct cscfg_feature_desc *feat_desc;
207207
struct coresight_device *csdev;
208208
struct list_head node;
209-
spinlock_t *drv_spinlock;
209+
raw_spinlock_t *drv_spinlock;
210210
int nr_params;
211211
struct cscfg_parameter_csdev *params_csdev;
212212
int nr_regs;

drivers/hwtracing/coresight/coresight-etm4x-core.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ static int etm4_enable_sysfs(struct coresight_device *csdev, struct coresight_pa
830830
return ret;
831831
}
832832

833-
spin_lock(&drvdata->spinlock);
833+
raw_spin_lock(&drvdata->spinlock);
834834

835835
drvdata->trcid = path->trace_id;
836836

@@ -849,7 +849,7 @@ static int etm4_enable_sysfs(struct coresight_device *csdev, struct coresight_pa
849849
if (ret)
850850
etm4_release_trace_id(drvdata);
851851

852-
spin_unlock(&drvdata->spinlock);
852+
raw_spin_unlock(&drvdata->spinlock);
853853

854854
if (!ret)
855855
dev_dbg(&csdev->dev, "ETM tracing enabled\n");
@@ -1011,15 +1011,15 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
10111011
* DYING hotplug callback is serviced by the ETM driver.
10121012
*/
10131013
cpus_read_lock();
1014-
spin_lock(&drvdata->spinlock);
1014+
raw_spin_lock(&drvdata->spinlock);
10151015

10161016
/*
10171017
* Executing etm4_disable_hw on the cpu whose ETM is being disabled
10181018
* ensures that register writes occur when cpu is powered.
10191019
*/
10201020
smp_call_function_single(drvdata->cpu, etm4_disable_hw, drvdata, 1);
10211021

1022-
spin_unlock(&drvdata->spinlock);
1022+
raw_spin_unlock(&drvdata->spinlock);
10231023
cpus_read_unlock();
10241024

10251025
/*
@@ -1698,13 +1698,13 @@ static int etm4_starting_cpu(unsigned int cpu)
16981698
if (!etmdrvdata[cpu])
16991699
return 0;
17001700

1701-
spin_lock(&etmdrvdata[cpu]->spinlock);
1701+
raw_spin_lock(&etmdrvdata[cpu]->spinlock);
17021702
if (!etmdrvdata[cpu]->os_unlock)
17031703
etm4_os_unlock(etmdrvdata[cpu]);
17041704

17051705
if (coresight_get_mode(etmdrvdata[cpu]->csdev))
17061706
etm4_enable_hw(etmdrvdata[cpu]);
1707-
spin_unlock(&etmdrvdata[cpu]->spinlock);
1707+
raw_spin_unlock(&etmdrvdata[cpu]->spinlock);
17081708
return 0;
17091709
}
17101710

@@ -1713,10 +1713,10 @@ static int etm4_dying_cpu(unsigned int cpu)
17131713
if (!etmdrvdata[cpu])
17141714
return 0;
17151715

1716-
spin_lock(&etmdrvdata[cpu]->spinlock);
1716+
raw_spin_lock(&etmdrvdata[cpu]->spinlock);
17171717
if (coresight_get_mode(etmdrvdata[cpu]->csdev))
17181718
etm4_disable_hw(etmdrvdata[cpu]);
1719-
spin_unlock(&etmdrvdata[cpu]->spinlock);
1719+
raw_spin_unlock(&etmdrvdata[cpu]->spinlock);
17201720
return 0;
17211721
}
17221722

@@ -2160,7 +2160,7 @@ static int etm4_probe(struct device *dev)
21602160
return -ENOMEM;
21612161
}
21622162

2163-
spin_lock_init(&drvdata->spinlock);
2163+
raw_spin_lock_init(&drvdata->spinlock);
21642164

21652165
drvdata->cpu = coresight_get_cpu(dev);
21662166
if (drvdata->cpu < 0)

0 commit comments

Comments
 (0)