Re: [PATCH V8 2/7] interconnect: core: Add dynamic id allocation support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2/10/2025 4:20 PM, Dmitry Baryshkov wrote:
> On Wed, Feb 05, 2025 at 06:27:38PM +0000, Raviteja Laggyshetty wrote:
>> The current interconnect framework relies on static IDs for node
>> creation and registration, which limits topologies with multiple
>> instances of the same interconnect provider. To address this, update
>> the interconnect framework APIs icc_node_create() and icc_link_create()
>> APIs to dynamically allocate IDs for interconnect nodes during creation.
>> This change removes the dependency on static IDs, allowing multiple
>> instances of the same hardware, such as EPSS L3.
>>
>> Signed-off-by: Raviteja Laggyshetty <quic_rlaggysh@xxxxxxxxxxx>
>> ---
>>  drivers/interconnect/core.c | 13 ++++++++++++-
>>  1 file changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
>> index 9d5404a07e8a..40700246f1b6 100644
>> --- a/drivers/interconnect/core.c
>> +++ b/drivers/interconnect/core.c
>> @@ -20,6 +20,8 @@
>>  
>>  #include "internal.h"
>>  
>> +#define ICC_DYN_ID_START 10000
>> +
>>  #define CREATE_TRACE_POINTS
>>  #include "trace.h"
>>  
>> @@ -826,7 +828,12 @@ static struct icc_node *icc_node_create_nolock(int id)
>>  	if (!node)
>>  		return ERR_PTR(-ENOMEM);
>>  
>> -	id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
>> +	/* negative id indicates dynamic id allocation */
>> +	if (id < 0)
> 
> Nit: I think it might be better to add an explicit define for that and
> to decline all other negatdive values. Please leave us some room for
> future expansion.
> 
Do you mean to replace the value of ALLOC_DYN_ID from -1 to some
positive value like 100000 and to use it as initial ID for the nodes
requiring the dynamic allocation ? This explicit define can be used as
check for dynamic allocation and also as argument to idr_alloc min value
argument. Is my interpretation of the comment correct ?

>> +		id = idr_alloc(&icc_idr, node, ICC_DYN_ID_START, 0, GFP_KERNEL);
>> +	else
>> +		id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
>> +
>>  	if (id < 0) {
>>  		WARN(1, "%s: couldn't get idr\n", __func__);
>>  		kfree(node);
>> @@ -962,6 +969,10 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider)
>>  	node->avg_bw = node->init_avg;
>>  	node->peak_bw = node->init_peak;
>>  
>> +	if (node->id >= ICC_DYN_ID_START)
>> +		node->name = devm_kasprintf(provider->dev, GFP_KERNEL, "%s@%s",
>> +					    node->name, dev_name(provider->dev));
>> +
>>  	if (node->avg_bw || node->peak_bw) {
>>  		if (provider->pre_aggregate)
>>  			provider->pre_aggregate(node);
>> -- 
>> 2.39.2
>>
> 





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux