Re: [RFC PATCH 07/77] livetree: Improve get_node_by_phandle()

David Gibson <[email protected]> Thu, 15 Jan 2026 11:41:32 +1100
Newsgroups org.kernel.vger.devicetree-spec,org.kernel.vger.devicetree-compiler,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel
Message-ID <aWg3vOBK4uKwyRp4@zatzit>
On Mon, Jan 12, 2026 at 03:18:57PM +0100, Herve Codina wrote:
> get_node_by_phandle() allows to get a node based on its phandle value.
> It checks the phandle value against value available in internal node
> structure.
> 
> This internal phandle value is updated during process_check() and so,
> get_node_by_phandle() cannot give correct results before the
> process_check() call.
> 
> Improve get_node_by_phandle() to look at node phandle properties when
> the internal phandle value is not valid.
> 
> This allows to return a correct matching node even if process_check()
> was not called yet.
> 
> With the recently introduced FDT_REF_LOCAL dtb tag, this will be needed
> to update internal phandle references before the call to process_check().
> Indeed, this tag allows to identify phandles and internal references
> need to be updated based on the phandle value before the
> process_check() call.

Having two entirely different paths for get_node_by_phandle() is
really ugly.

I suspect a better approach would be to special case updates to the
internal phandle field as we parse the phandle properties, rather than
doing it as a batch during the checks.

> Signed-off-by: Herve Codina <[email protected]>
> ---
>  livetree.c | 21 ++++++++++++++++++++-
>  1 file changed, 20 insertions(+), 1 deletion(-)
> 
> diff --git a/livetree.c b/livetree.c
> index f328824..9b67934 100644
> --- a/livetree.c
> +++ b/livetree.c
> @@ -609,16 +609,35 @@ struct node *get_node_by_label(struct node *tree, const char *label)
>  	return NULL;
>  }
>  
> +static cell_t get_node_phandle_existing(struct node *node)
> +{
> +	struct property *prop;
> +
> +	if (phandle_is_valid(node->phandle))
g> +		return node->phandle;
> +
> +	prop = get_property(node, "phandle");
> +	if (!prop) {
> +		prop = get_property(node, "linux,phandle");
> +		if (!prop)
> +			return 0;
> +	}
> +
> +	return propval_cell(prop);
> +}
> +
>  struct node *get_node_by_phandle(struct node *tree, cell_t phandle)
>  {
>  	struct node *child, *node;
> +	cell_t tree_phandle;
>  
>  	if (!phandle_is_valid(phandle)) {
>  		assert(generate_fixups);
>  		return NULL;
>  	}
>  
> -	if (tree->phandle == phandle) {
> +	tree_phandle = get_node_phandle_existing(tree);

It's especially nasty that we call the expensive version first, then
fall back to the cheap version...

> +	if (phandle_is_valid(tree_phandle) && tree_phandle == phandle) {
>  		if (tree->deleted)
>  			return NULL;
>  		return tree;
> -- 
> 2.52.0
> 
> 

-- 
David Gibson (he or they)	| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you, not the other way
				| around.
http://www.ozlabs.org/~dgibson
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmloN7sACgkQzQJF27ox
2GdNaRAAhpnDwX3t8VCtnkOFwRc2B5dUhP8EmHgH5lOmcwZwM7Uh5O4/48tQXM9v
z5T4Fvnl7eOQj0IpP2cLOreRODu2X2PLtZljnfo9Ywe7plQ+UL2ou891Oozv1A4E
j6HPXjofjNwkNqwxx7am3pNJTWG9F9+TnTMd7rEln3BIC/yVHeQoTIT3qCYriSzj
fpxxf+A0qsHsTKKtG/kPRxRz0Pzapx7mxIjcM5IBlSkqPwwApvAccRzq8TeVDEvn
6mZuWrI+M5ueK5ZArCBkXc8h0MLY23rTraCM8LzXVU8wjy+OZJ2dV16vUEhU194M
SYT1bjCRAW/DFWWcLgpUJ877IdXHulIoN7DDeNEeNhPBCA7OfNFsk1ntVQaAHWB8
UowVJo3+roGHzLOlrJ1S/t46z6yOfgAhFJnWl99Amk/sBCfD6YAZWKI6ui2+mScs
iLDfopkkBgK1ieytY564xpyDWmP66pB9h5XkwsK8zYjtu9xSuruc46i4ITTPreoF
4TWexNwN2ox4Lrccx1N9eIqwcALYgK3ABjxPGXCIRsYG8LNRBVCoKYfAwhhUXu6t
WAToCBr9bhhHQFjxEguhc+G+B6UednLmxZOnNRwk0FRqOyHfFKcBhqkesiuUwBus
ezwNK3e2pjd4s3pMNB+ZksCkGeJFviuGwdQ+/4Bd4dt+p4kKk70=
=psHe
-----END PGP SIGNATURE-----