[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 09/17] xen/arm: introduce a helper to parse device tree NUMA distance map
On 25.04.2023 09:56, Henry Wang wrote: > From: Wei Chen <wei.chen@xxxxxxx> > > A NUMA aware device tree will provide a "distance-map" node to > describe distance between any two nodes. This patch introduce a > new helper to parse this distance map. > > Signed-off-by: Wei Chen <wei.chen@xxxxxxx> > Signed-off-by: Henry Wang <Henry.Wang@xxxxxxx> While trying to hunt down the caller(s) of numa_set_distance() in the context to replying to patch 3, I came across this one: > --- a/xen/arch/arm/numa_device_tree.c > +++ b/xen/arch/arm/numa_device_tree.c > @@ -151,3 +151,111 @@ invalid_data: > numa_fw_bad(); > return -EINVAL; > } > + > +/* Parse NUMA distance map v1 */ > +static int __init fdt_parse_numa_distance_map_v1(const void *fdt, int node) > +{ > + const struct fdt_property *prop; > + const __be32 *matrix; > + unsigned int i, entry_count; > + int len; > + > + printk(XENLOG_INFO "NUMA: parsing numa-distance-map\n"); > + > + prop = fdt_get_property(fdt, node, "distance-matrix", &len); > + if ( !prop ) > + { > + printk(XENLOG_WARNING > + "NUMA: No distance-matrix property in distance-map\n"); > + goto invalid_data; > + } > + > + if ( len % sizeof(__be32) != 0 ) > + { > + printk(XENLOG_WARNING > + "distance-matrix in node is not a multiple of u32\n"); > + goto invalid_data; > + } > + > + entry_count = len / sizeof(__be32); > + if ( entry_count == 0 ) > + { > + printk(XENLOG_WARNING "NUMA: Invalid distance-matrix\n"); > + goto invalid_data; > + } > + > + matrix = (const __be32 *)prop->data; > + for ( i = 0; i + 2 < entry_count; i += 3 ) > + { > + unsigned int from, to, distance, opposite; With these ... > + from = dt_next_cell(1, &matrix); > + to = dt_next_cell(1, &matrix); > + distance = dt_next_cell(1, &matrix); > + if ( (from == to && distance != NUMA_LOCAL_DISTANCE) || > + (from != to && distance <= NUMA_LOCAL_DISTANCE) ) > + { > + printk(XENLOG_WARNING > + "NUMA: Invalid distance: > NODE#%"PRIu32"->NODE#%"PRIu32":%"PRIu32"\n", ... you don't mean PRIu32 here and ... > + from, to, distance); > + goto invalid_data; > + } > + > + printk(XENLOG_INFO "NUMA: distance: > NODE#%"PRIu32"->NODE#%"PRIu32":%"PRIu32"\n", ... here and yet further down anymore. That'll at the same time shorten all these lines quite a bit. > + from, to, distance); > + > + /* Get opposite way distance */ > + opposite = __node_distance(to, from); > + /* The default value in node_distance_map is NUMA_NO_DISTANCE */ > + if ( opposite == NUMA_NO_DISTANCE ) And the matrix you're reading from can't hold NUMA_NO_DISTANCE entries? I ask because you don't check this above; you only check against NUMA_LOCAL_DISTANCE. > + { > + /* Bi-directions are not set, set both */ > + numa_set_distance(from, to, distance); > + numa_set_distance(to, from, distance); > + } > + else > + { > + /* > + * Opposite way distance has been set to a different value. > + * It may be a firmware device tree bug? > + */ > + if ( opposite != distance ) > + { > + /* > + * In device tree NUMA distance-matrix binding: > + * > https://www.kernel.org/doc/Documentation/devicetree/bindings/numa.txt > + * There is a notes mentions: > + * "Each entry represents distance from first node to > + * second node. The distances are equal in either > + * direction." > + * > + * That means device tree doesn't permit this case. > + * But in ACPI spec, it cares to specifically permit this > + * case: > + * "Except for the relative distance from a System Locality > + * to itself, each relative distance is stored twice in the > + * matrix. This provides the capability to describe the > + * scenario where the relative distances for the two > + * directions between System Localities is different." > + * > + * That means a real machine allows such NUMA configuration. > + * So, place a WARNING here to notice system administrators, > + * is it the specail case that they hijack the device tree > + * to support their rare machines? > + */ > + printk(XENLOG_WARNING > + "Un-matched bi-direction! > NODE#%"PRIu32"->NODE#%"PRIu32":%"PRIu32", > NODE#%"PRIu32"->NODE#%"PRIu32":%"PRIu32"\n", > + from, to, distance, to, from, opposite); > + } > + > + /* Opposite way distance has been set, just set this way */ > + numa_set_distance(from, to, distance); It took me a while to understand what the comment is to tell me, because in this iteration the opposite entry wasn't set. May I suggest to make more explicit that you refer to an earlier iteration, e.g. by "... was set before, ..."? > + } > + } > + > + return 0; > + > +invalid_data: Nit: Style (labels to be indented by [at least] one blank). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |