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-----