On 12/3/2014 7:09 AM, Grant Likely wrote: > On Wed, Dec 3, 2014 at 3:39 AM, Frank Rowand <frowand.list@xxxxxxxxx> wrote: >> On 11/28/2014 8:48 AM, Grant Likely wrote: < snip > >>> Instead of keeping it always in order, what about reordering the whole >>> list after all the nodes at a given level are unflattened? That would >>> avoid traversing the entire sibling list on every node addition. Like >>> this: >> >> Seems pretty close to a wash to me. Either one would work. Though >> mine would benefit from the comment you added in yours. >> >> -Frank > > Okay, if I can take that as an 'acked-by' from you then I'll merge my > version of the patch. I prefer doing the post processing to sort the > list because it is theoretically less costly. Yes, that would be fine. Acked-by: Frank Rowand <frank.rowand@xxxxxxxxxxxxxx> > > g. > >>> >>> g. >>> >>> >From de46de766eb4d2240208bf83fdae955361069352 Mon Sep 17 00:00:00 2001 >>> From: Grant Likely <grant.likely@xxxxxxxxxx> >>> Date: Fri, 28 Nov 2014 16:03:33 +0000 >>> Subject: [PATCH] of: Drop ->next pointer from struct device_node >>> >>> The ->next pointer in struct device_node is a hanger-on from when it was >>> used to iterate over the whole tree by a particular device_type property >>> value. Those days are long over, but the fdt unflattening code still >>> uses it to put nodes in the unflattened tree into the same order as node >>> in the flat tree. By reworking the unflattening code to reverse the list >>> after unflattening all the children of a node, the pointer can be >>> dropped which gives a small amount of memory savings. >>> >>> Signed-off-by: Grant Likely <grant.likely@xxxxxxxxxx> >>> Cc: Gaurav Minocha <gaurav.minocha.os@xxxxxxxxx> >>> Cc: Frank Rowand <frowand.list@xxxxxxxxx> >>> --- >>> drivers/of/fdt.c | 24 ++++++++++++++++++------ >>> include/linux/of.h | 1 - >>> 2 files changed, 18 insertions(+), 7 deletions(-) >>> >>> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c >>> index 7f6ee31d5650..a41f9fdb1aa0 100644 >>> --- a/drivers/of/fdt.c >>> +++ b/drivers/of/fdt.c >>> @@ -226,12 +226,8 @@ static void * unflatten_dt_node(void *blob, >>> prev_pp = &np->properties; >>> if (dad != NULL) { >>> np->parent = dad; >>> - /* we temporarily use the next field as `last_child'*/ >>> - if (dad->next == NULL) >>> - dad->child = np; >>> - else >>> - dad->next->sibling = np; >>> - dad->next = np; >>> + np->sibling = dad->child; >>> + dad->child = np; >>> } >>> } >>> /* process properties */ >>> @@ -329,6 +325,22 @@ static void * unflatten_dt_node(void *blob, >>> >>> if (*poffset < 0 && *poffset != -FDT_ERR_NOTFOUND) >>> pr_err("unflatten: error %d processing FDT\n", *poffset); >>> + >>> + /* >>> + * Reverse the child list. Some drivers assumes node order matches .dts >>> + * node order >>> + */ >>> + if (!dryrun && np->child) { >>> + struct device_node *child = np->child; >>> + np->child = NULL; >>> + while (child) { >>> + struct device_node *next = child->sibling; >>> + child->sibling = np->child; >>> + np->child = child; >>> + child = next; >>> + } >>> + } >>> + >>> if (nodepp) >>> *nodepp = np; >>> >>> diff --git a/include/linux/of.h b/include/linux/of.h >>> index 8b021db3e16e..3f0f0ffbd5e5 100644 >>> --- a/include/linux/of.h >>> +++ b/include/linux/of.h >>> @@ -56,7 +56,6 @@ struct device_node { >>> struct device_node *parent; >>> struct device_node *child; >>> struct device_node *sibling; >>> - struct device_node *next; /* next device of same type */ >>> struct kobject kobj; >>> unsigned long _flags; >>> void *data; >>> >> > -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html