Re: [PATCH 3/5] cpufreq: loongson3: Replace per-package mutex with per-node

Zhongqiu Han <[email protected]>
Newsgroups dev.linux.lists.loongarch,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.stable
Message-ID <[email protected]>
On 8/20/2026 7:34 PM, Zhongqiu Han wrote:
> On 8/18/2026 8:39 PM, Huacai Chen wrote:
>> Our server productions (e.g. Loongson-3D6000/3E6000) can have multiple
>> nodes in one package and SMC mailboxes are also per-node. So replace the
>> per-package mutex with per-node one.
>>
>> Cc: [email protected]
>> Signed-off-by: Hongliang Wang <[email protected]>
>> Signed-off-by: Huacai Chen <[email protected]>
>> ---
>>   drivers/cpufreq/loongson3_cpufreq.c | 14 +++++++-------
>>   1 file changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/cpufreq/loongson3_cpufreq.c b/drivers/cpufreq/ 
>> loongson3_cpufreq.c
>> index 630f679aa739..e3cd78a5ab18 100644
>> --- a/drivers/cpufreq/loongson3_cpufreq.c
>> +++ b/drivers/cpufreq/loongson3_cpufreq.c
>> @@ -169,7 +169,7 @@ struct loongson3_freq_data {
>>       struct cpufreq_frequency_table table[];
>>   };
>> -static struct mutex cpufreq_mutex[MAX_PACKAGES];
>> +static struct mutex cpufreq_mutex[MAX_NUMNODES];
>>   static struct cpufreq_driver loongson3_cpufreq_driver;
>>   static DEFINE_PER_CPU(struct loongson3_freq_data *, freq_data);
>> @@ -177,14 +177,14 @@ static inline int do_service_request(u32 id, u32 
>> info, u32 cmd, u32 val, u32 ext
>>   {
>>       int retries;
>>       unsigned int cpu = raw_smp_processor_id();
>> -    unsigned int package = cpu_data[cpu].package;
>> +    unsigned int nid = cpu_to_node(cpu);

What if NUMA is disabled?

>>       union smc_message msg, last;
>> -    mutex_lock(&cpufreq_mutex[package]);
>> +    mutex_lock(&cpufreq_mutex[nid]);
>>       last.value = iocsr_read32(LOONGARCH_IOCSR_SMCMBX);
>>       if (!last.complete) {
>> -        mutex_unlock(&cpufreq_mutex[package]);
>> +        mutex_unlock(&cpufreq_mutex[nid]);
>>           return -EPERM;
>>       }
>> @@ -208,11 +208,11 @@ static inline int do_service_request(u32 id, u32 
>> info, u32 cmd, u32 val, u32 ext
>>       }
>>       if (!msg.complete || msg.cmd != CMD_OK) {
>> -        mutex_unlock(&cpufreq_mutex[package]);
>> +        mutex_unlock(&cpufreq_mutex[nid]);
>>           return -EPERM;
>>       }
>> -    mutex_unlock(&cpufreq_mutex[package]);
>> +    mutex_unlock(&cpufreq_mutex[nid]);
> 
> An optimization independent of this patch: considering to use
> guard(mutex)(xxx.lock)
> 
>>       return msg.val;
>>   }
>> @@ -337,7 +337,7 @@ static int loongson3_cpufreq_probe(struct 
>> platform_device *pdev)
>>   {
>>       int i, ret;
>> -    for (i = 0; i < MAX_PACKAGES; i++) {
>> +    for (i = 0; i < MAX_NUMNODES; i++) {
>>           ret = devm_mutex_init(&pdev->dev, &cpufreq_mutex[i]);
>>           if (ret)
>>               return ret;
> 
> 


-- 
Thx and BRs,
Zhongqiu Han
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.