diff options
Diffstat (limited to 'mm/mempolicy.c')
| -rw-r--r-- | mm/mempolicy.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index a683a66599b1..71430d440822 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -976,6 +976,36 @@ static unsigned interleave_nodes(struct mempolicy *policy) | |||
| 976 | return nid; | 976 | return nid; |
| 977 | } | 977 | } |
| 978 | 978 | ||
| 979 | /* | ||
| 980 | * Depending on the memory policy provide a node from which to allocate the | ||
| 981 | * next slab entry. | ||
| 982 | */ | ||
| 983 | unsigned slab_node(struct mempolicy *policy) | ||
| 984 | { | ||
| 985 | if (in_interrupt()) | ||
| 986 | return numa_node_id(); | ||
| 987 | |||
| 988 | switch (policy->policy) { | ||
| 989 | case MPOL_INTERLEAVE: | ||
| 990 | return interleave_nodes(policy); | ||
| 991 | |||
| 992 | case MPOL_BIND: | ||
| 993 | /* | ||
| 994 | * Follow bind policy behavior and start allocation at the | ||
| 995 | * first node. | ||
| 996 | */ | ||
| 997 | return policy->v.zonelist->zones[0]->zone_pgdat->node_id; | ||
| 998 | |||
| 999 | case MPOL_PREFERRED: | ||
| 1000 | if (policy->v.preferred_node >= 0) | ||
| 1001 | return policy->v.preferred_node; | ||
| 1002 | /* Fall through */ | ||
| 1003 | |||
| 1004 | default: | ||
| 1005 | return numa_node_id(); | ||
| 1006 | } | ||
| 1007 | } | ||
| 1008 | |||
| 979 | /* Do static interleaving for a VMA with known offset. */ | 1009 | /* Do static interleaving for a VMA with known offset. */ |
| 980 | static unsigned offset_il_node(struct mempolicy *pol, | 1010 | static unsigned offset_il_node(struct mempolicy *pol, |
| 981 | struct vm_area_struct *vma, unsigned long off) | 1011 | struct vm_area_struct *vma, unsigned long off) |
