[Skiboot] [PATCH V2 1/3] core/device: Add function to return child node using name at substring "@"

Athira Rajeev atrajeev at linux.vnet.ibm.com
Fri Feb 3 04:06:22 AEDT 2023



> On 30-Jan-2023, at 3:14 PM, Mahesh J Salgaonkar <mahesh at linux.ibm.com> wrote:
> 
> On 2023-01-18 11:14:50 Wed, Athira Rajeev wrote:
>> Add a function dt_find_by_name_substr() that returns the child node if
>> it matches till first occurence at "@" of a given name, otherwise NULL.
>> This is helpful for cases with node name like: "name at addr". In
>> scenarios where nodes are added with "name at addr" format and if the
>> value of "addr" is not known, that node can't be matched with node
>> name or addr. Hence matching with substring as node name will return
>> the expected result. Patch adds dt_find_by_name_substr() function
>> and testcase for the same in core/test/run-device.c
>> 
>> Signed-off-by: Athira Rajeev <atrajeev at linux.vnet.ibm.com>
>> ---
>> Changelog:
>> v1 -> v2:
>> - Addressed review comment from Dan to update
>>  the utility funtion to search and compare
>>  upto "@". Renamed it as dt_find_by_name_substr.
>> 
>> core/device.c          | 18 ++++++++++++++++++
>> core/test/run-device.c | 11 +++++++++++
>> include/device.h       |  3 +++
>> 3 files changed, 32 insertions(+)
>> 
>> diff --git a/core/device.c b/core/device.c
>> index 2de37c74..df3a5775 100644
>> --- a/core/device.c
>> +++ b/core/device.c
>> @@ -395,6 +395,24 @@ struct dt_node *dt_find_by_name(struct dt_node *root, const char *name)
>> }
>> 
>> 
>> +struct dt_node *dt_find_by_name_substr(struct dt_node *root, const char *name)
>> +{
>> +	struct dt_node *child, *match;
>> +	char *pos;
>> +
>> +	list_for_each(&root->children, child, list) {
>> +		pos = strchr(child->name, '@');
>> +		if (!strncmp(child->name, name, pos - child->name))
> 
> Shouldn't we care about string length of substring to be checked before
> comparision ? The code assumes that it is always within the limit of
> position of '@' in node name string. Hence, it returns a wrong node
> whose name partially matches with substring passed.
> 
> e.g.
> With following two nodes in deviec tree (as per your test):
> /node at 1
> /node0_1 at 2
> 
> the substring 'node0', 'node0@' and 'node0_@' all matches with 'node at 1' device
> tree node.
> Is this expected ?

Hi Mahesh,

Thanks for reviewing and pointing out.
As you pointed, currently it also returns if name partially matches with substring which is not expected.
I willer-work on changes and post a V3

> 
> Also, what do you expect dt_find_by_name_substr() to return for string
> like 'node0' and 'node0_' ? NULL or node '/node0_1 at 2' ?
> 
>> +			return child;
>> +
>> +		match = dt_find_by_name_substr(child, name);
>> +		if (match)
>> +			return match;
>> +	}
>> +
>> +	return NULL;
>> +}
>> +
>> struct dt_node *dt_new_check(struct dt_node *parent, const char *name)
>> {
>> 	struct dt_node *node = dt_find_by_name(parent, name);
>> diff --git a/core/test/run-device.c b/core/test/run-device.c
>> index 4a12382b..0e463e58 100644
>> --- a/core/test/run-device.c
>> +++ b/core/test/run-device.c
>> @@ -466,6 +466,17 @@ int main(void)
>> 	new_prop_ph = dt_prop_get_u32(ut2, "something");
>> 	assert(!(new_prop_ph == ev1_ph));
>> 	dt_free(subtree);
>> +
>> +	/* Test dt_find_by_name_substr */
>> +	root = dt_new_root("");
>> +	addr1 = dt_new_addr(root, "node", 0x1);
>> +	addr2 = dt_new_addr(root, "node0_1", 0x2);
>> +	assert(dt_find_by_name(root, "node at 1") == addr1);
>> +	assert(dt_find_by_name(root, "node0_1 at 2") == addr2);
>> +	assert(dt_find_by_name_substr(root, "node at 1") == addr1);
>> +	assert(dt_find_by_name_substr(root, "node0_1 at 2") == addr2);
> 
> Below additional tests are failing:
> 
> 	assert(dt_find_by_name_substr(root, "node0@") == NULL);
> 	assert(dt_find_by_name_substr(root, "node0_@") == NULL);
> 
> Maybe we should add few more test checks for "node0" and "node0_" as well.

Sure, I will fix this in V3

Thanks
Athira 
> 
> Thanks,
> -Mahesh.



More information about the Skiboot mailing list