[PATCH 02/18] mm/mempolicy: Use node_mem_id() instead of node_id()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Calling out some distinctions first as I understand it, and the
reasoning of the patch:
numa_node_id() - The node id for the currently running CPU.
numa_mem_id() - The node id for the closest memory node.

The case where they are not the same is CONFIG_HAVE_MEMORYLESS_NODES.
Only ia64 and powerpc support this option, so it is perhaps not a very
interesting situation to most.

The question is, when you do want which? numa_node_id() is definitely
what's desired if MPOL_PREFERRED, or MPOL_LOCAL were used, since the ABI
states "This mode specifies "local allocation"; the memory is allocated
on the node of the CPU that triggered the allocation (the "local
node")." It would be weird, though not impossible to set this policy on
a CPU that has memoryless nodes. A more likely way to hit this is with
interleaving. The current interfaces will return some equally weird
thing, but at least it's symmetric. Therefore, in cases where the node
is being queried for the currently running process, it probably makes
sense to use numa_node_id(). For other cases however, when CPU is trying
to obtain the "local" memory, numa_mem_id() already contains this and
should be used instead.

This really should only effect configurations where
CONFIG_HAVE_MEMORYLESS_NODES=y, and even on those machines it's quite
possible the ultimate behavior would be identical.

Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Cc: Lee Schermerhorn <lee.schermerhorn@xxxxxx>
Signed-off-by: Ben Widawsky <ben.widawsky@xxxxxxxxx>
---
 mm/mempolicy.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 36ee3267c25f..99e0f3f9c4a6 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1991,7 +1991,7 @@ static unsigned offset_il_node(struct mempolicy *pol, unsigned long n)
 	int nid;
 
 	if (!nnodes)
-		return numa_node_id();
+		return numa_mem_id();
 	target = (unsigned int)n % nnodes;
 	nid = first_node(pol->v.nodes);
 	for (i = 0; i < target; i++)
@@ -2049,7 +2049,7 @@ int huge_node(struct vm_area_struct *vma, unsigned long addr, gfp_t gfp_flags,
 		nid = interleave_nid(*mpol, vma, addr,
 					huge_page_shift(hstate_vma(vma)));
 	} else {
-		nid = policy_node(gfp_flags, *mpol, numa_node_id());
+		nid = policy_node(gfp_flags, *mpol, numa_mem_id());
 		if ((*mpol)->mode == MPOL_BIND)
 			*nodemask = &(*mpol)->v.nodes;
 	}
-- 
2.27.0





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux