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

James Clark james.clark at linaro.org
Wed Oct 28 06:00:14 PDT 2026



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 at linaro.org>
>> ---
>>   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) {
>>
> 




More information about the linux-arm-kernel mailing list