On Fri, Sep 19, 2025 at 12:06:53PM -0400, Sean Anderson wrote:
[...]
diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index 022c8384b98d..6dfb1198c16e 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -1046,8 +1046,11 @@ static void coresight_device_release(struct device *dev) { struct coresight_device *csdev = to_coresight_device(dev);
- fwnode_handle_put(csdev->dev.fwnode);
- if (panic_ops(csdev))
atomic_notifier_chain_unregister(&panic_notifier_list,
free_percpu(csdev->perf_sink_id_map.cpu_map);&csdev->panic_notifier);
- fwnode_handle_put(csdev->dev.fwnode);
The moving fwnode_handle_put() is irrelvant to panic notifier fix, should be moved out from this patch.
kfree(csdev); } @@ -1315,6 +1318,16 @@ void coresight_release_platform_data(struct coresight_device *csdev, coresight_remove_conns_sysfs_group(csdev); } +static int coresight_panic_notifier(struct notifier_block *nb,
unsigned long action, void *data)
+{
- struct coresight_device *csdev =
container_of(nb, struct coresight_device, panic_notifier);
Need to check device mode:
if (coresight_get_mode(csdev) == CS_MODE_DISABLED) return NOTIFY_DONE;
The rest is fine for me.
Thanks, Leo
- panic_ops(csdev)->sync(csdev);
- return NOTIFY_DONE;
+}
struct coresight_device *coresight_register(struct coresight_desc *desc) { int ret; @@ -1357,6 +1370,17 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) goto err_out; } }
- if (panic_ops(csdev)) {
csdev->panic_notifier.notifier_call = coresight_panic_notifier;
ret = atomic_notifier_chain_register(&panic_notifier_list,
&csdev->panic_notifier);
if (ret) {
coresight_device_release(&csdev->dev);
goto err_out;
}
- }
- /*
- Make sure the device registration and the connection fixup
- are synchronised, so that we don't see uninitialised devices
@@ -1563,36 +1587,6 @@ const struct bus_type coresight_bustype = { .name = "coresight", }; -static int coresight_panic_sync(struct device *dev, void *data) -{
- int mode;
- struct coresight_device *csdev;
- /* Run through panic sync handlers for all enabled devices */
- csdev = container_of(dev, struct coresight_device, dev);
- mode = coresight_get_mode(csdev);
- if ((mode == CS_MODE_SYSFS) || (mode == CS_MODE_PERF)) {
if (panic_ops(csdev))
panic_ops(csdev)->sync(csdev);
- }
- return 0;
-}
-static int coresight_panic_cb(struct notifier_block *self,
unsigned long v, void *p)
-{
- bus_for_each_dev(&coresight_bustype, NULL, NULL,
coresight_panic_sync);
- return 0;
-}
-static struct notifier_block coresight_notifier = {
- .notifier_call = coresight_panic_cb,
-};
static int __init coresight_init(void) { int ret; @@ -1605,20 +1599,11 @@ static int __init coresight_init(void) if (ret) goto exit_bus_unregister;
- /* Register function to be called for panic */
- ret = atomic_notifier_chain_register(&panic_notifier_list,
&coresight_notifier);
- if (ret)
goto exit_perf;
- /* initialise the coresight syscfg API */ ret = cscfg_init(); if (!ret) return 0;
- atomic_notifier_chain_unregister(&panic_notifier_list,
&coresight_notifier);
-exit_perf: etm_perf_exit(); exit_bus_unregister: bus_unregister(&coresight_bustype); @@ -1628,8 +1613,6 @@ static int __init coresight_init(void) static void __exit coresight_exit(void) { cscfg_exit();
- atomic_notifier_chain_unregister(&panic_notifier_list,
etm_perf_exit(); bus_unregister(&coresight_bustype);&coresight_notifier);
} diff --git a/include/linux/coresight.h b/include/linux/coresight.h index 4ac65c68bbf4..a7aaf9d3d01d 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -280,6 +280,7 @@ struct coresight_trace_id_map {
- @config_csdev_list: List of system configurations added to the device.
- @cscfg_csdev_lock: Protect the lists of configurations and features.
- @active_cscfg_ctxt: Context information for current active system configuration.
*/
- @panic_notifier: Notifier block used to clean up during a panic
struct coresight_device { struct coresight_platform_data *pdata; @@ -304,6 +305,7 @@ struct coresight_device { struct list_head config_csdev_list; raw_spinlock_t cscfg_csdev_lock; void *active_cscfg_ctxt;
- struct notifier_block panic_notifier;
}; /* -- 2.35.1.1320.gc452695387.dirty