Commit ef8bbd73 authored by Grant Likely's avatar Grant Likely

of: Use vargs in __of_node_alloc

The overlay code needs to construct a new full_name from the parent name
and the node name, but the current method has to allocate and then free
an temporary string which is wasteful. Fix this problem by using vargs
to pass in a format and arguments into __of_node_alloc().

At the same time remove the allocflags argument to __of_node_alloc().
The only users all use GFP_KERNEL, so there is no need to provide it as
an option. If there is ever a need later it can be added back.
Signed-off-by: default avatarGrant Likely <grant.likely@linaro.org>
parent 66e6a5a1
...@@ -274,33 +274,33 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags) ...@@ -274,33 +274,33 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
/** /**
* __of_node_alloc() - Create an empty device node dynamically. * __of_node_alloc() - Create an empty device node dynamically.
* @full_name: Full name of the new device node * @full_name: Full name of the new device node
* @allocflags: Allocation flags (typically pass GFP_KERNEL)
* *
* Create an empty device tree node, suitable for further modification. * Create an empty device tree node, suitable for further modification.
* The node data are dynamically allocated and all the node flags * The node data are dynamically allocated and all the node flags
* have the OF_DYNAMIC & OF_DETACHED bits set. * have the OF_DYNAMIC & OF_DETACHED bits set.
* Returns the newly allocated node or NULL on out of memory error. * Returns the newly allocated node or NULL on out of memory error.
*/ */
struct device_node *__of_node_alloc(const char *full_name, gfp_t allocflags) struct device_node *__of_node_alloc(const char *fmt, ...)
{ {
va_list vargs;
struct device_node *node; struct device_node *node;
node = kzalloc(sizeof(*node), allocflags); node = kzalloc(sizeof(*node), GFP_KERNEL);
if (!node) if (!node)
return NULL; return NULL;
va_start(vargs, fmt);
node->full_name = kstrdup(full_name, allocflags); node->full_name = kvasprintf(GFP_KERNEL, fmt, vargs);
of_node_set_flag(node, OF_DYNAMIC); va_end(vargs);
of_node_set_flag(node, OF_DETACHED);
if (!node->full_name) if (!node->full_name)
goto err_free; goto err_free;
of_node_set_flag(node, OF_DYNAMIC);
of_node_set_flag(node, OF_DETACHED);
of_node_init(node); of_node_init(node);
return node; return node;
err_free: err_free:
kfree(node->full_name);
kfree(node); kfree(node);
return NULL; return NULL;
} }
......
...@@ -61,7 +61,7 @@ static inline int of_property_notify(int action, struct device_node *np, ...@@ -61,7 +61,7 @@ static inline int of_property_notify(int action, struct device_node *np,
* own the devtree lock or work on detached trees only. * own the devtree lock or work on detached trees only.
*/ */
struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags); struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
struct device_node *__of_node_alloc(const char *full_name, gfp_t allocflags); __printf(1, 2) struct device_node *__of_node_alloc(const char *fmt, ...);
extern const void *__of_get_property(const struct device_node *np, extern const void *__of_get_property(const struct device_node *np,
const char *name, int *lenp); const char *name, int *lenp);
......
...@@ -449,11 +449,11 @@ static void __init of_selftest_changeset(void) ...@@ -449,11 +449,11 @@ static void __init of_selftest_changeset(void)
struct of_changeset chgset; struct of_changeset chgset;
of_changeset_init(&chgset); of_changeset_init(&chgset);
n1 = __of_node_alloc("/testcase-data/changeset/n1", GFP_KERNEL); n1 = __of_node_alloc("/testcase-data/changeset/n1");
selftest(n1, "testcase setup failure\n"); selftest(n1, "testcase setup failure\n");
n2 = __of_node_alloc("/testcase-data/changeset/n2", GFP_KERNEL); n2 = __of_node_alloc("/testcase-data/changeset/n2");
selftest(n2, "testcase setup failure\n"); selftest(n2, "testcase setup failure\n");
n21 = __of_node_alloc("/testcase-data/changeset/n2/n21", GFP_KERNEL); n21 = __of_node_alloc("/testcase-data/changeset/n2/n21");
selftest(n21, "testcase setup failure %p\n", n21); selftest(n21, "testcase setup failure %p\n", n21);
nremove = of_find_node_by_path("/testcase-data/changeset/node-remove"); nremove = of_find_node_by_path("/testcase-data/changeset/node-remove");
selftest(nremove, "testcase setup failure\n"); selftest(nremove, "testcase setup failure\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment