Commit 3a9180b0 authored by Ma Wupeng's avatar Ma Wupeng Committed by Wupeng Ma
Browse files

mm/mempolicy: Add and export get_vma_policy_node

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9UDJX



--------------------------------

Function get_vma_policy_node is used to return a suitable nid for order-0
page allocation.

Signed-off-by: default avatarMa Wupeng <mawupeng1@huawei.com>
parent 39a8198a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -161,6 +161,10 @@ extern nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy);

extern unsigned int mempolicy_slab_node(void);

int get_vma_policy_node(struct vm_area_struct *vma, unsigned long addr,
			gfp_t gfp_flags, struct mempolicy **mpol,
			nodemask_t **nodemask);

extern enum zone_type policy_zone;

static inline void check_highest_zone(enum zone_type k)
+23 −0
Original line number Diff line number Diff line
@@ -2198,6 +2198,29 @@ static inline unsigned interleave_nid(struct mempolicy *pol,
		return interleave_nodes(pol);
}

/* get policy node for order-0 page */
int get_vma_policy_node(struct vm_area_struct *vma, unsigned long addr,
			gfp_t gfp_flags, struct mempolicy **mpol,
			nodemask_t **nodemask)
{
	int nid, mode;

	*mpol = get_vma_policy(vma, addr);
	*nodemask = NULL;
	mode = (*mpol)->mode;

	if (unlikely(mode == MPOL_INTERLEAVE)) {
		nid = interleave_nid(*mpol, vma, addr, PAGE_SHIFT);
	} else {
		nid = policy_node(gfp_flags, *mpol, numa_node_id());
		if ((*mpol)->mode == MPOL_BIND || mode == MPOL_PREFERRED_MANY)
			*nodemask = &(*mpol)->v.nodes;
	}

	return nid;
}
EXPORT_SYMBOL_GPL(get_vma_policy_node);

#ifdef CONFIG_HUGETLBFS
/*
 * huge_node(@vma, @addr, @gfp_flags, @mpol)