Messages in this thread | | | From | Rob Herring <> | Date | Fri, 23 Jun 2017 09:13:38 -0500 | Subject | Re: [PATCH v2] vsprintf: Add %p extension "%pOF" for device tree |
| |
On Thu, Jun 22, 2017 at 10:01 PM, Joe Perches <joe@perches.com> wrote: > On Thu, 2017-06-22 at 15:44 -0500, Rob Herring wrote: >> From: Pantelis Antoniou <pantelis.antoniou@konsulko.com> >> >> 90% of the usage of device node's full_name is printing it out in a >> kernel message. However, storing the full path for every node is >> wasteful and redundant. With a custom format specifier, we can generate >> the full path at run-time and eventually remove the full path from every >> node. >> >> For instance typical use is: >> pr_info("Frobbing node %s\n", node->full_name); >> >> Which can be written now as: >> pr_info("Frobbing node %pOF\n", node); > > I still think this should use another identifier like > %pO for object then another letter for type of object > maybe N for node.
It is. O is for kobj and F is for device node. It doesn't make a much sense separately, but OF together makes sense as Open Firmware.
> > And F is flags, f is name > >> diff --git a/lib/vsprintf.c b/lib/vsprintf.c > [] >> @@ -1470,6 +1471,131 @@ char *flags_string(char *buf, char *end, void *flags_ptr, const char *fmt) >> return format_flags(buf, end, flags, names); >> } >> >> +static int device_node_calc_depth(const struct device_node *np) >> +{ >> + int d; >> + >> + for (d = 0; np; d++) >> + np = np->parent; >> + >> + return d; >> +} >> + >> +static noinline_for_stack >> +char *device_node_gen_full_name(const struct device_node *np, char *buf, char *end) >> +{ >> + int i; >> + int depth = device_node_calc_depth(np); >> + static const struct printf_spec strspec = { >> + .field_width = -1, >> + .precision = -1, >> + }; >> + const struct device_node *nodes[depth]; >> + >> + if (!depth) >> + returnuf; >> + /* special case for root node */ >> + if (depth == 1) >> + return string(buf, end, "/", strspec); >> + >> + depth--; >> + for (i = depth - 1; i >= 0; i--) { >> + nodes[i] = np; >> + np = np->parent; >> + } >> + for (i = 0; i < depth; i++) { >> + buf = string(buf, end, "/", strspec); >> + buf = string(buf, end, kbasename(nodes[i]->full_name), strspec); >> + } >> + return buf; >> +} > > I think there should be another function to get > a particular struct device_node * at a particular > depth to avoid all the pointers on stack. > > Basically, adapt the for (i = depth - 1 loop to > a function that returns nodes[i]
Okay.
Rob
| |