[PATCH 2/4] cpuidle: riscv-sbi: Use scoped device node handling to simplify error paths

Krzysztof Kozlowski krzysztof.kozlowski at linaro.org
Tue Aug 20 02:36:32 PDT 2024


On 19/08/2024 18:19, Jonathan Cameron wrote:
> On Mon, 19 Aug 2024 17:13:13 +0100
> Jonathan Cameron <Jonathan.Cameron at Huawei.com> wrote:
> 
>> On Fri, 16 Aug 2024 17:09:29 +0200
>> Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org> wrote:
>>
>>> Obtain the device node reference with scoped/cleanup.h to reduce error
>>> handling and make the code a bit simpler.
>>>
>>> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>  
>> The original code looks suspect. See below.
> 
> Whilst here...  Why not do similar for state_node to avoid
> the delayed return check.
> Existing code
> 	{
> 		state_node = of_get_cpu_state_node(cpu_node, i - 1);
> 		if (!state_node)
> 			break;

I don't see how __free() helps here. You can return regardless of __free().

> 
> 		ret = sbi_dt_parse_state_node(state_node, &states[i]);
> 		of_node_put(state_node);

... and this code is quite easy to read: you get reference and
immediately release it.

> 
> 		if (ret)
> 			//another bug here on holding cpu_node btw.
> 			return ret;
> 		pr_debug("sbi-state %#x index %d\n", states[i], i);
> 	}
> //I think only path to this is is early break above.
> 	if (i != state_count) {
> 		ret = -ENODEV;
> 		goto fail;
> 	}
> Can be something like
> 
> 	{
> 		struct device_node *state_node __free(device_node) =
> 			= of_get-cpu_State_nod(cpu_node, i - 1);
> 	
> 		if (!state_node)
> 			return -ENODEV;
> 
> 		ret = sbi_dt_parse_state_node(state_node, &states[i]);
> 		if (ret)
> 			return ret;
> 
> 		pr_debug("sbi-state %#x index %d\n", states[i], i);
> 	}
> 		

Maybe I miss something, but I do not see how the __free() simplifies
here anything.

Best regards,
Krzysztof




More information about the linux-riscv mailing list