Skip to content

Commit 89c3842

Browse files
John Garryrobherring
authored andcommitted
of, numa: Validate some distance map rules
Currently the NUMA distance map parsing does not validate the distance table for the distance-matrix rules 1-2 in [1]. However the arch NUMA code may enforce some of these rules, but not all. Such is the case for the arm64 port, which does not enforce the rule that the distance between separates nodes cannot equal LOCAL_DISTANCE. The patch adds the following rules validation: - distance of node to self equals LOCAL_DISTANCE - distance of separate nodes > LOCAL_DISTANCE This change avoids a yet-unresolved crash reported in [2]. A note on dealing with symmetrical distances between nodes: Validating symmetrical distances between nodes is difficult. If it were mandated in the bindings that every distance must be recorded in the table, then it would be easy. However, it isn't. In addition to this, it is also possible to record [b, a] distance only (and not [a, b]). So, when processing the table for [b, a], we cannot assert that current distance of [a, b] != [b, a] as invalid, as [a, b] distance may not be present in the table and current distance would be default at REMOTE_DISTANCE. As such, we maintain the policy that we overwrite distance [a, b] = [b, a] for b > a. This policy is different to kernel ACPI SLIT validation, which allows non-symmetrical distances (ACPI spec SLIT rules allow it). However, the distance debug message is dropped as it may be misleading (for a distance which is later overwritten). Some final notes on semantics: - It is implied that it is the responsibility of the arch NUMA code to reset the NUMA distance map for an error in distance map parsing. - It is the responsibility of the FW NUMA topology parsing (whether OF or ACPI) to enforce NUMA distance rules, and not arch NUMA code. [1] Documents/devicetree/bindings/numa.txt [2] https://www.spinics.net/lists/arm-kernel/msg683304.html Cc: stable@vger.kernel.org # 4.7 Signed-off-by: John Garry <john.garry@huawei.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Rob Herring <robh@kernel.org>
1 parent 6778be4 commit 89c3842

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

drivers/of/of_numa.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,14 @@ static int __init of_numa_parse_distance_map_v1(struct device_node *map)
104104
distance = of_read_number(matrix, 1);
105105
matrix++;
106106

107+
if ((nodea == nodeb && distance != LOCAL_DISTANCE) ||
108+
(nodea != nodeb && distance <= LOCAL_DISTANCE)) {
109+
pr_err("Invalid distance[node%d -> node%d] = %d\n",
110+
nodea, nodeb, distance);
111+
return -EINVAL;
112+
}
113+
107114
numa_set_distance(nodea, nodeb, distance);
108-
pr_debug("distance[node%d -> node%d] = %d\n",
109-
nodea, nodeb, distance);
110115

111116
/* Set default distance of node B->A same as A->B */
112117
if (nodeb > nodea)

0 commit comments

Comments
 (0)