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@xxxxxxxxxx> Reviewed-by: Gregory Price <gourry@xxxxxxxxxx> > +/** > + * 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)