[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/8] device tree: correctly ignore unit-address when matching nodes by name
On Tue, 2012-02-28 at 16:54 +0000, David Vrabel wrote: > From: David Vrabel <david.vrabel@xxxxxxxxxx> > > When matching node by their name, correctly ignore the unit address > (@...) part of the name. Previously, a "memory-controller" node would > be incorrectly matched as a "memory" node. Are we reinventing this ourselves or is this derived from the Linux (or other) version of similar code? > > Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> > --- > xen/common/device_tree.c | 19 +++++++++++++++---- > 1 files changed, 15 insertions(+), 4 deletions(-) > > diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c > index d50cb9c..e5df748 100644 > --- a/xen/common/device_tree.c > +++ b/xen/common/device_tree.c > @@ -24,6 +24,20 @@ > struct dt_early_info __initdata early_info; > void *device_tree_flattened; > > +static bool_t __init node_matches(const void *fdt, int node, const char > *match) > +{ > + const char *name; > + size_t len; > + > + name = fdt_get_name(fdt, node, NULL); > + len = strlen(match); > + > + /* Match both "match" and "match@..." patterns but not > + "match-foo". */ > + return strncmp(name, match, len) == 0 > + && (name[len] == '@' || name[len] == '\0'); How can name[len] == '@' when len came from strlen? Wouldn't you need some sort of strchr construct? Oh, I see, it's strlen(match) not strlen(name) and the short-curcuiting behaviour of && protects you from the case where strlen(match) > strlen(name) because the strncmp will fail so name[len] won't be evaluated. Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > +} > + > static void __init get_val(const u32 **cell, u32 cells, u64 *val) > { > *val = 0; > @@ -93,13 +107,10 @@ static void __init early_scan(const void *fdt) > { > int node; > int depth; > - const char *name; > u32 address_cells[MAX_DEPTH]; > u32 size_cells[MAX_DEPTH]; > > for (node = 0; depth >= 0; node = fdt_next_node(fdt, node, &depth)) { > - name = fdt_get_name(fdt, node, NULL); > - > if (depth >= MAX_DEPTH) { > early_printk("fdt: node '%s': nested too deep\n", > fdt_get_name(fdt, node, NULL)); > @@ -109,7 +120,7 @@ static void __init early_scan(const void *fdt) > address_cells[depth] = prop_by_name_u32(fdt, node, "#address-cells"); > size_cells[depth] = prop_by_name_u32(fdt, node, "#size-cells"); > > - if (strncmp(name, "memory", 6) == 0) > + if (node_matches(fdt, node, "memory")) > process_memory_node(fdt, node, address_cells[depth-1], > size_cells[depth-1]); > } > } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |