|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 8/9] xen/x86: add detection of memory interleaves for different nodes
On 11.05.2022 03:46, Wei Chen wrote:
> --- a/xen/arch/x86/srat.c
> +++ b/xen/arch/x86/srat.c
> @@ -42,6 +42,12 @@ static struct node node_memblk_range[NR_NODE_MEMBLKS];
> static nodeid_t memblk_nodeid[NR_NODE_MEMBLKS];
> static __initdata DECLARE_BITMAP(memblk_hotplug, NR_NODE_MEMBLKS);
>
> +enum conflicts {
> + NO_CONFLICT = 0,
No need for the "= 0".
> + ERR_OVERLAP,
While this at least can be an error (the self-overlap case is merely
warned about), ...
> + ERR_INTERLEAVE,
... I don't think this is, and hence I'd recommend to drop "ERR_".
> @@ -119,20 +125,43 @@ int valid_numa_range(paddr_t start, paddr_t end,
> nodeid_t node)
> return 0;
> }
>
> -static __init int conflicting_memblks(paddr_t start, paddr_t end)
> +static enum conflicts __init
> +conflicting_memblks(nodeid_t nid, paddr_t start, paddr_t end,
> + paddr_t nd_start, paddr_t nd_end, int *mblkid)
Why "int"? Can the value passed back be negative?
> {
> int i;
>
> + /*
> + * Scan all recorded nodes' memory blocks to check conflicts:
> + * Overlap or interleave.
> + */
> for (i = 0; i < num_node_memblks; i++) {
> struct node *nd = &node_memblk_range[i];
> + *mblkid = i;
Style: Please maintain a blank line between declaration(s) and
statement(s).
> @@ -310,42 +342,67 @@ acpi_numa_memory_affinity_init(const struct
> acpi_srat_mem_affinity *ma)
> bad_srat();
> return;
> }
> +
> + /*
> + * For the node that already has some memory blocks, we will
> + * expand the node memory range temporarily to check memory
> + * interleaves with other nodes. We will not use this node
> + * temp memory range to check overlaps, because it will mask
> + * the overlaps in same node.
> + *
> + * Node with 0 bytes memory doesn't need this expandsion.
> + */
> + nd_start = start;
> + nd_end = end;
> + nd = &nodes[node];
> + if (nd->start != nd->end) {
> + if (nd_start > nd->start)
> + nd_start = nd->start;
> +
> + if (nd_end < end)
Did you mean nd->end here on the right side of < ? By intentionally
not adding "default:" in the body, you then also allow the compiler
to point out that addition of a new enumerator also needs handling
here.
> + nd_end = nd->end;
> + }
> +
> /* It is fine to add this area to the nodes data it will be used later*/
> - i = conflicting_memblks(start, end);
> - if (i < 0)
> - /* everything fine */;
> - else if (memblk_nodeid[i] == node) {
> - bool mismatch = !(ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) !=
> - !test_bit(i, memblk_hotplug);
> -
> - printk("%sSRAT: PXM %u (%"PRIpaddr"-%"PRIpaddr") overlaps with
> itself (%"PRIpaddr"-%"PRIpaddr")\n",
> - mismatch ? KERN_ERR : KERN_WARNING, pxm, start, end,
> - node_memblk_range[i].start, node_memblk_range[i].end);
> - if (mismatch) {
> + status = conflicting_memblks(node, start, end, nd_start, nd_end, &i);
> + if (status == ERR_OVERLAP) {
Please use switch(status) when checking enumerated values.
> + if (memblk_nodeid[i] == node) {
> + bool mismatch = !(ma->flags &
> + ACPI_SRAT_MEM_HOT_PLUGGABLE) !=
> + !test_bit(i, memblk_hotplug);
Style: The middle line wants indenting by two more characters.
> +
> + printk("%sSRAT: PXM %u (%"PRIpaddr"-%"PRIpaddr")
> overlaps with itself (%"PRIpaddr"-%"PRIpaddr")\n",
> + mismatch ? KERN_ERR : KERN_WARNING, pxm, start,
> + end, node_memblk_range[i].start,
> + node_memblk_range[i].end);
> + if (mismatch) {
> + bad_srat();
> + return;
> + }
> + } else {
> + printk(KERN_ERR
> + "SRAT: PXM %u (%"PRIpaddr"-%"PRIpaddr") overlaps
> with PXM %u (%"PRIpaddr"-%"PRIpaddr")\n",
> + pxm, start, end, node_to_pxm(memblk_nodeid[i]),
> + node_memblk_range[i].start,
> + node_memblk_range[i].end);
> bad_srat();
> return;
> }
> - } else {
> + } else if (status == ERR_INTERLEAVE) {
> printk(KERN_ERR
> - "SRAT: PXM %u (%"PRIpaddr"-%"PRIpaddr") overlaps with
> PXM %u (%"PRIpaddr"-%"PRIpaddr")\n",
> - pxm, start, end, node_to_pxm(memblk_nodeid[i]),
> + "SRAT: Node %u: (%"PRIpaddr"-%"PRIpaddr") interleaves
> with node %u memblk (%"PRIpaddr"-%"PRIpaddr")\n",
> + node, nd_start, nd_end, memblk_nodeid[i],
Please log pxm (not node) here just like is done in the overlap case.
The remote node ID will then require converting to PXM, of course.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |