Re: [PATCH v4 01/10] coresight: configfs: Don't assume active until cscfg_mgr is set

From: James Clark

Date: Wed Oct 28 2026 - 09:02:32 EST




On 28/10/2026 10:14, Suzuki K Poulose wrote:
On 16/10/2026 11:46, James Clark wrote:
Perf's etm_setup_aux() calls cscfg_activate_config() and dereferences
cscfg_mgr, which can be done after coresight_init() has initialized the
Perf PMU but before cscfg_init() has finished while the driver is still
loading.

Fix it by only assuming cscfg is initialized if cscfg_mgr is set.


Is this possible though ? The component drivers are dependent on the
coresight-core being loaded and this is not complete until the coresight
module has been initialised.

No component drivers are needed for this path. etm_perf_init() creates the PMU regardless of whether any sources or sinks exist. Perf can use perf_event_open() on it immediately (although it would fail eventually), but it would be after hitting this part.


Or the other way to fix this is delay the etm_perf init after the cscfg
init, which clearly is the order of dependencies ?

That's what I tried initially, and that's what Leo suggested on V3. But cscfg is dependent on the core creating some sysfs files first, so the init dependency is currently in the correct order.


Cheers
Suzuki


Fixes: a0114b4740dd ("coresight: etm-perf: Update to activate selected configuration")
Signed-off-by: James Clark <james.clark@xxxxxxxxxx>
---
  drivers/hwtracing/coresight/coresight-syscfg.c | 11 ++++++++---
  1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/ hwtracing/coresight/coresight-syscfg.c
index 2bfdd7b45e49..7e3c9844bc00 100644
--- a/drivers/hwtracing/coresight/coresight-syscfg.c
+++ b/drivers/hwtracing/coresight/coresight-syscfg.c
@@ -26,6 +26,11 @@ static DEFINE_MUTEX(cscfg_mutex);
  /* only one of these */
  static struct cscfg_manager *cscfg_mgr;
+static enum cscfg_load_ops cscfg_get_state(void)
+{
+    return cscfg_mgr ? cscfg_mgr->load_state : CSCFG_UNLOAD;
+}
+
  /* load features and configuations into the lists */
  /* get name feature instance from a coresight device list of features */
@@ -581,7 +586,7 @@ int cscfg_load_config_sets(struct cscfg_config_desc **config_descs,
      int err = 0;
      mutex_lock(&cscfg_mutex);
-    if (cscfg_mgr->load_state != CSCFG_NONE) {
+    if (cscfg_get_state() != CSCFG_NONE) {
          mutex_unlock(&cscfg_mutex);
          return -EBUSY;
      }
@@ -662,7 +667,7 @@ int cscfg_unload_config_sets(struct cscfg_load_owner_info *owner_info)
      struct cscfg_load_owner_info *load_list_item = NULL;
      mutex_lock(&cscfg_mutex);
-    if (cscfg_mgr->load_state != CSCFG_NONE) {
+    if (cscfg_get_state() != CSCFG_NONE) {
          mutex_unlock(&cscfg_mutex);
          return -EBUSY;
      }
@@ -902,7 +907,7 @@ static int _cscfg_activate_config(unsigned long cfg_hash)
      struct cscfg_config_desc *config_desc;
      int err = -EINVAL;
-    if (cscfg_mgr->load_state == CSCFG_UNLOAD)
+    if (cscfg_get_state() == CSCFG_UNLOAD)
          return -EBUSY;
      list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) {