On Tue, Sep 10, 2024 at 11:43:35PM +0000, Ackerley Tng wrote:
This was refactored out of huge_node().
huge_node()'s interpretation of vma for order assumes the hugetlb-specific storage of the hstate information in the inode. policy_node_nodemask() does not assume that, and can be used more generically.
This refactoring also enforces that nid default to the current node id, which was not previously enforced.
alloc_pages_mpol_noprof() is the last remaining direct user of policy_nodemask(). All its callers begin with nid being the current node id as well. More refactoring is required for to simplify that.
Signed-off-by: Ackerley Tng ackerleytng@google.com
Reviewed-by: Gregory Price gourry@gourry.net
+/**
- policy_node_nodemask(@mpol, @gfp_flags, @ilx, @nodemask)
- @mpol: the memory policy to interpret. Reference must be taken.
- @gfp_flags: for this request
- @ilx: interleave index, for use only when MPOL_INTERLEAVE or
MPOL_WEIGHTED_INTERLEAVE
- @nodemask: (output) pointer to nodemask pointer for 'bind' and 'prefer-many'
policy
- Returns a nid suitable for a page allocation and a pointer. If the effective
- policy is 'bind' or 'prefer-many', returns a pointer to the mempolicy's
- @nodemask for filtering the zonelist.
Technically it's possible for nid to contain MAX_NUMNODES upon return if weighted interleave is used and the nodemask is somehow invalid (contains no nodes, including the local node). I would expect this to be indicative of a larger problem (i.e. should functionally never happen).
Now that I'm looking at it, it's possible the weighted interleave path should default to returning numa_node_id() if node == MAX_NUMNODES, which would not require any changes to this patch.
- */
+int policy_node_nodemask(struct mempolicy *mpol, gfp_t gfp_flags,
pgoff_t ilx, nodemask_t **nodemask)
+{
- int nid = numa_node_id();
- *nodemask = policy_nodemask(gfp_flags, mpol, ilx, &nid);
- return nid;
+}
#ifdef CONFIG_HUGETLBFS /*
- huge_node(@vma, @addr, @gfp_flags, @mpol)