Skip to content

Commit

Permalink
of: Drop ->next pointer from struct device_node
Browse files Browse the repository at this point in the history
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@linaro.org>
Acked-by: Frank Rowand <frank.rowand@sonymobile.com>
Cc: Gaurav Minocha <gaurav.minocha.os@gmail.com>
  • Loading branch information
Grant Likely committed Dec 3, 2014
1 parent 5267720 commit 70161ff
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
24 changes: 18 additions & 6 deletions drivers/of/fdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;

Expand Down
1 change: 0 additions & 1 deletion include/linux/of.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 70161ff

Please sign in to comment.