blob: 1cb200af3828f14569264e5ed89f4c8ec90a0a05 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Simple NUMA memory policy for the Linux kernel.
3 *
4 * Copyright 2003,2004 Andi Kleen, SuSE Labs.
Christoph Lameter8bccd852005-10-29 18:16:59 -07005 * (C) Copyright 2005 Christoph Lameter, Silicon Graphics, Inc.
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 * Subject to the GNU Public License, version 2.
7 *
8 * NUMA policy allows the user to give hints in which node(s) memory should
9 * be allocated.
10 *
11 * Support four policies per VMA and per process:
12 *
13 * The VMA policy has priority over the process policy for a page fault.
14 *
15 * interleave Allocate memory interleaved over a set of nodes,
16 * with normal fallback if it fails.
17 * For VMA based allocations this interleaves based on the
18 * offset into the backing object or offset into the mapping
19 * for anonymous memory. For process policy an process counter
20 * is used.
Christoph Lameter8bccd852005-10-29 18:16:59 -070021 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 * bind Only allocate memory on a specific set of nodes,
23 * no fallback.
Christoph Lameter8bccd852005-10-29 18:16:59 -070024 * FIXME: memory is allocated starting with the first node
25 * to the last. It would be better if bind would truly restrict
26 * the allocation to memory nodes instead
27 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070028 * preferred Try a specific node first before normal fallback.
29 * As a special case node -1 here means do the allocation
30 * on the local CPU. This is normally identical to default,
31 * but useful to set in a VMA when you have a non default
32 * process policy.
Christoph Lameter8bccd852005-10-29 18:16:59 -070033 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070034 * default Allocate on the local node first, or when on a VMA
35 * use the process policy. This is what Linux always did
36 * in a NUMA aware kernel and still does by, ahem, default.
37 *
38 * The process policy is applied for most non interrupt memory allocations
39 * in that process' context. Interrupts ignore the policies and always
40 * try to allocate on the local CPU. The VMA policy is only applied for memory
41 * allocations for a VMA in the VM.
42 *
43 * Currently there are a few corner cases in swapping where the policy
44 * is not applied, but the majority should be handled. When process policy
45 * is used it is not remembered over swap outs/swap ins.
46 *
47 * Only the highest zone in the zone hierarchy gets policied. Allocations
48 * requesting a lower zone just use default policy. This implies that
49 * on systems with highmem kernel lowmem allocation don't get policied.
50 * Same with GFP_DMA allocations.
51 *
52 * For shmfs/tmpfs/hugetlbfs shared memory the policy is shared between
53 * all users and remembered even when nobody has memory mapped.
54 */
55
56/* Notebook:
57 fix mmap readahead to honour policy and enable policy for any page cache
58 object
59 statistics for bigpages
60 global policy for page cache? currently it uses process policy. Requires
61 first item above.
62 handle mremap for shared memory (currently ignored for the policy)
63 grows down?
64 make bind policy root only? It can trigger oom much faster and the
65 kernel is not always grateful with that.
Linus Torvalds1da177e2005-04-16 15:20:36 -070066*/
67
68#include <linux/mempolicy.h>
69#include <linux/mm.h>
70#include <linux/highmem.h>
71#include <linux/hugetlb.h>
72#include <linux/kernel.h>
73#include <linux/sched.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070074#include <linux/nodemask.h>
75#include <linux/cpuset.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070076#include <linux/slab.h>
77#include <linux/string.h>
Paul Gortmakerb95f1b312011-10-16 02:01:52 -040078#include <linux/export.h>
Pavel Emelyanovb4888932007-10-18 23:40:14 -070079#include <linux/nsproxy.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#include <linux/interrupt.h>
81#include <linux/init.h>
82#include <linux/compat.h>
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -080083#include <linux/swap.h>
Christoph Lameter1a75a6c2006-01-08 01:01:02 -080084#include <linux/seq_file.h>
85#include <linux/proc_fs.h>
Christoph Lameterb20a3502006-03-22 00:09:12 -080086#include <linux/migrate.h>
Hugh Dickins62b61f62009-12-14 17:59:33 -080087#include <linux/ksm.h>
Christoph Lameter95a402c2006-06-23 02:03:53 -070088#include <linux/rmap.h>
David Quigley86c3a762006-06-23 02:04:02 -070089#include <linux/security.h>
Adrian Bunkdbcb0f12007-10-16 01:26:26 -070090#include <linux/syscalls.h>
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -070091#include <linux/ctype.h>
KOSAKI Motohiro6d9c2852009-12-14 17:58:11 -080092#include <linux/mm_inline.h>
Lee Schermerhornb24f53a2012-10-25 14:16:32 +020093#include <linux/mmu_notifier.h>
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -080094
Linus Torvalds1da177e2005-04-16 15:20:36 -070095#include <asm/tlbflush.h>
96#include <asm/uaccess.h>
Michal Hocko778d3b02011-07-26 16:08:30 -070097#include <linux/random.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070098
Nick Piggin62695a82008-10-18 20:26:09 -070099#include "internal.h"
100
Christoph Lameter38e35862006-01-08 01:01:01 -0800101/* Internal flags */
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800102#define MPOL_MF_DISCONTIG_OK (MPOL_MF_INTERNAL << 0) /* Skip checks for continuous vmas */
Christoph Lameter38e35862006-01-08 01:01:01 -0800103#define MPOL_MF_INVERT (MPOL_MF_INTERNAL << 1) /* Invert check for nodemask */
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800104
Pekka Enbergfcc234f2006-03-22 00:08:13 -0800105static struct kmem_cache *policy_cache;
106static struct kmem_cache *sn_cache;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108/* Highest zone. An specific allocation for a zone below that is not
109 policied. */
Christoph Lameter62672762007-02-10 01:43:07 -0800110enum zone_type policy_zone = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700112/*
113 * run-time system-wide default policy => local allocation
114 */
H Hartley Sweetene754d792011-10-31 17:09:23 -0700115static struct mempolicy default_policy = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 .refcnt = ATOMIC_INIT(1), /* never free it */
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700117 .mode = MPOL_PREFERRED,
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -0700118 .flags = MPOL_F_LOCAL,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119};
120
Mel Gorman5606e382012-11-02 18:19:13 +0000121static struct mempolicy preferred_node_policy[MAX_NUMNODES];
122
123static struct mempolicy *get_task_policy(struct task_struct *p)
124{
125 struct mempolicy *pol = p->mempolicy;
126 int node;
127
128 if (!pol) {
129 node = numa_node_id();
130 if (node != -1)
131 pol = &preferred_node_policy[node];
132
133 /* preferred_node_policy is not initialised early in boot */
134 if (!pol->mode)
135 pol = NULL;
136 }
137
138 return pol;
139}
140
David Rientjes37012942008-04-28 02:12:33 -0700141static const struct mempolicy_operations {
142 int (*create)(struct mempolicy *pol, const nodemask_t *nodes);
Miao Xie708c1bb2010-05-24 14:32:07 -0700143 /*
144 * If read-side task has no lock to protect task->mempolicy, write-side
145 * task will rebind the task->mempolicy by two step. The first step is
146 * setting all the newly nodes, and the second step is cleaning all the
147 * disallowed nodes. In this way, we can avoid finding no node to alloc
148 * page.
149 * If we have a lock to protect task->mempolicy in read-side, we do
150 * rebind directly.
151 *
152 * step:
153 * MPOL_REBIND_ONCE - do rebind work at once
154 * MPOL_REBIND_STEP1 - set all the newly nodes
155 * MPOL_REBIND_STEP2 - clean all the disallowed nodes
156 */
157 void (*rebind)(struct mempolicy *pol, const nodemask_t *nodes,
158 enum mpol_rebind_step step);
David Rientjes37012942008-04-28 02:12:33 -0700159} mpol_ops[MPOL_MAX];
160
Mel Gorman19770b32008-04-28 02:12:18 -0700161/* Check that the nodemask contains at least one populated zone */
David Rientjes37012942008-04-28 02:12:33 -0700162static int is_valid_nodemask(const nodemask_t *nodemask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163{
Mel Gorman19770b32008-04-28 02:12:18 -0700164 int nd, k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165
Mel Gorman19770b32008-04-28 02:12:18 -0700166 for_each_node_mask(nd, *nodemask) {
167 struct zone *z;
168
169 for (k = 0; k <= policy_zone; k++) {
170 z = &NODE_DATA(nd)->node_zones[k];
171 if (z->present_pages > 0)
172 return 1;
Andi Kleendd942ae2006-02-17 01:39:16 +0100173 }
174 }
Mel Gorman19770b32008-04-28 02:12:18 -0700175
176 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177}
178
David Rientjesf5b087b2008-04-28 02:12:27 -0700179static inline int mpol_store_user_nodemask(const struct mempolicy *pol)
180{
Bob Liu6d556292010-05-24 14:31:59 -0700181 return pol->flags & MPOL_MODE_FLAGS;
David Rientjes4c50bc02008-04-28 02:12:30 -0700182}
183
184static void mpol_relative_nodemask(nodemask_t *ret, const nodemask_t *orig,
185 const nodemask_t *rel)
186{
187 nodemask_t tmp;
188 nodes_fold(tmp, *orig, nodes_weight(*rel));
189 nodes_onto(*ret, tmp, *rel);
David Rientjesf5b087b2008-04-28 02:12:27 -0700190}
191
David Rientjes37012942008-04-28 02:12:33 -0700192static int mpol_new_interleave(struct mempolicy *pol, const nodemask_t *nodes)
193{
194 if (nodes_empty(*nodes))
195 return -EINVAL;
196 pol->v.nodes = *nodes;
197 return 0;
198}
199
200static int mpol_new_preferred(struct mempolicy *pol, const nodemask_t *nodes)
201{
202 if (!nodes)
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -0700203 pol->flags |= MPOL_F_LOCAL; /* local allocation */
David Rientjes37012942008-04-28 02:12:33 -0700204 else if (nodes_empty(*nodes))
205 return -EINVAL; /* no allowed nodes */
206 else
207 pol->v.preferred_node = first_node(*nodes);
208 return 0;
209}
210
211static int mpol_new_bind(struct mempolicy *pol, const nodemask_t *nodes)
212{
213 if (!is_valid_nodemask(nodes))
214 return -EINVAL;
215 pol->v.nodes = *nodes;
216 return 0;
217}
218
Miao Xie58568d22009-06-16 15:31:49 -0700219/*
220 * mpol_set_nodemask is called after mpol_new() to set up the nodemask, if
221 * any, for the new policy. mpol_new() has already validated the nodes
222 * parameter with respect to the policy mode and flags. But, we need to
223 * handle an empty nodemask with MPOL_PREFERRED here.
224 *
225 * Must be called holding task's alloc_lock to protect task's mems_allowed
226 * and mempolicy. May also be called holding the mmap_semaphore for write.
227 */
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700228static int mpol_set_nodemask(struct mempolicy *pol,
229 const nodemask_t *nodes, struct nodemask_scratch *nsc)
Miao Xie58568d22009-06-16 15:31:49 -0700230{
Miao Xie58568d22009-06-16 15:31:49 -0700231 int ret;
232
233 /* if mode is MPOL_DEFAULT, pol is NULL. This is right. */
234 if (pol == NULL)
235 return 0;
Lai Jiangshan01f13bd2012-12-12 13:51:33 -0800236 /* Check N_MEMORY */
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700237 nodes_and(nsc->mask1,
Lai Jiangshan01f13bd2012-12-12 13:51:33 -0800238 cpuset_current_mems_allowed, node_states[N_MEMORY]);
Miao Xie58568d22009-06-16 15:31:49 -0700239
240 VM_BUG_ON(!nodes);
241 if (pol->mode == MPOL_PREFERRED && nodes_empty(*nodes))
242 nodes = NULL; /* explicit local allocation */
243 else {
244 if (pol->flags & MPOL_F_RELATIVE_NODES)
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700245 mpol_relative_nodemask(&nsc->mask2, nodes,&nsc->mask1);
Miao Xie58568d22009-06-16 15:31:49 -0700246 else
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700247 nodes_and(nsc->mask2, *nodes, nsc->mask1);
248
Miao Xie58568d22009-06-16 15:31:49 -0700249 if (mpol_store_user_nodemask(pol))
250 pol->w.user_nodemask = *nodes;
251 else
252 pol->w.cpuset_mems_allowed =
253 cpuset_current_mems_allowed;
254 }
255
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700256 if (nodes)
257 ret = mpol_ops[pol->mode].create(pol, &nsc->mask2);
258 else
259 ret = mpol_ops[pol->mode].create(pol, NULL);
Miao Xie58568d22009-06-16 15:31:49 -0700260 return ret;
261}
262
263/*
264 * This function just creates a new policy, does some check and simple
265 * initialization. You must invoke mpol_set_nodemask() to set nodes.
266 */
David Rientjes028fec42008-04-28 02:12:25 -0700267static struct mempolicy *mpol_new(unsigned short mode, unsigned short flags,
268 nodemask_t *nodes)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269{
270 struct mempolicy *policy;
271
David Rientjes028fec42008-04-28 02:12:25 -0700272 pr_debug("setting mode %d flags %d nodes[0] %lx\n",
273 mode, flags, nodes ? nodes_addr(*nodes)[0] : -1);
Paul Mundt140d5a42007-07-15 23:38:16 -0700274
David Rientjes3e1f0642008-04-28 02:12:34 -0700275 if (mode == MPOL_DEFAULT) {
276 if (nodes && !nodes_empty(*nodes))
David Rientjes37012942008-04-28 02:12:33 -0700277 return ERR_PTR(-EINVAL);
Lee Schermerhornd3a71032012-10-25 14:16:29 +0200278 return NULL;
David Rientjes37012942008-04-28 02:12:33 -0700279 }
David Rientjes3e1f0642008-04-28 02:12:34 -0700280 VM_BUG_ON(!nodes);
281
282 /*
283 * MPOL_PREFERRED cannot be used with MPOL_F_STATIC_NODES or
284 * MPOL_F_RELATIVE_NODES if the nodemask is empty (local allocation).
285 * All other modes require a valid pointer to a non-empty nodemask.
286 */
287 if (mode == MPOL_PREFERRED) {
288 if (nodes_empty(*nodes)) {
289 if (((flags & MPOL_F_STATIC_NODES) ||
290 (flags & MPOL_F_RELATIVE_NODES)))
291 return ERR_PTR(-EINVAL);
David Rientjes3e1f0642008-04-28 02:12:34 -0700292 }
Peter Zijlstra479e2802012-10-25 14:16:28 +0200293 } else if (mode == MPOL_LOCAL) {
294 if (!nodes_empty(*nodes))
295 return ERR_PTR(-EINVAL);
296 mode = MPOL_PREFERRED;
David Rientjes3e1f0642008-04-28 02:12:34 -0700297 } else if (nodes_empty(*nodes))
298 return ERR_PTR(-EINVAL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299 policy = kmem_cache_alloc(policy_cache, GFP_KERNEL);
300 if (!policy)
301 return ERR_PTR(-ENOMEM);
302 atomic_set(&policy->refcnt, 1);
Lee Schermerhorn45c47452008-04-28 02:13:12 -0700303 policy->mode = mode;
David Rientjes3e1f0642008-04-28 02:12:34 -0700304 policy->flags = flags;
David Rientjesf5b087b2008-04-28 02:12:27 -0700305
David Rientjes37012942008-04-28 02:12:33 -0700306 return policy;
307}
308
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -0700309/* Slow path of a mpol destructor. */
310void __mpol_put(struct mempolicy *p)
311{
312 if (!atomic_dec_and_test(&p->refcnt))
313 return;
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -0700314 kmem_cache_free(policy_cache, p);
315}
316
Miao Xie708c1bb2010-05-24 14:32:07 -0700317static void mpol_rebind_default(struct mempolicy *pol, const nodemask_t *nodes,
318 enum mpol_rebind_step step)
David Rientjes37012942008-04-28 02:12:33 -0700319{
320}
321
Miao Xie708c1bb2010-05-24 14:32:07 -0700322/*
323 * step:
324 * MPOL_REBIND_ONCE - do rebind work at once
325 * MPOL_REBIND_STEP1 - set all the newly nodes
326 * MPOL_REBIND_STEP2 - clean all the disallowed nodes
327 */
328static void mpol_rebind_nodemask(struct mempolicy *pol, const nodemask_t *nodes,
329 enum mpol_rebind_step step)
David Rientjes37012942008-04-28 02:12:33 -0700330{
331 nodemask_t tmp;
332
333 if (pol->flags & MPOL_F_STATIC_NODES)
334 nodes_and(tmp, pol->w.user_nodemask, *nodes);
335 else if (pol->flags & MPOL_F_RELATIVE_NODES)
336 mpol_relative_nodemask(&tmp, &pol->w.user_nodemask, nodes);
337 else {
Miao Xie708c1bb2010-05-24 14:32:07 -0700338 /*
339 * if step == 1, we use ->w.cpuset_mems_allowed to cache the
340 * result
341 */
342 if (step == MPOL_REBIND_ONCE || step == MPOL_REBIND_STEP1) {
343 nodes_remap(tmp, pol->v.nodes,
344 pol->w.cpuset_mems_allowed, *nodes);
345 pol->w.cpuset_mems_allowed = step ? tmp : *nodes;
346 } else if (step == MPOL_REBIND_STEP2) {
347 tmp = pol->w.cpuset_mems_allowed;
348 pol->w.cpuset_mems_allowed = *nodes;
349 } else
350 BUG();
David Rientjes37012942008-04-28 02:12:33 -0700351 }
352
Miao Xie708c1bb2010-05-24 14:32:07 -0700353 if (nodes_empty(tmp))
354 tmp = *nodes;
355
356 if (step == MPOL_REBIND_STEP1)
357 nodes_or(pol->v.nodes, pol->v.nodes, tmp);
358 else if (step == MPOL_REBIND_ONCE || step == MPOL_REBIND_STEP2)
359 pol->v.nodes = tmp;
360 else
361 BUG();
362
David Rientjes37012942008-04-28 02:12:33 -0700363 if (!node_isset(current->il_next, tmp)) {
364 current->il_next = next_node(current->il_next, tmp);
365 if (current->il_next >= MAX_NUMNODES)
366 current->il_next = first_node(tmp);
367 if (current->il_next >= MAX_NUMNODES)
368 current->il_next = numa_node_id();
369 }
370}
371
372static void mpol_rebind_preferred(struct mempolicy *pol,
Miao Xie708c1bb2010-05-24 14:32:07 -0700373 const nodemask_t *nodes,
374 enum mpol_rebind_step step)
David Rientjes37012942008-04-28 02:12:33 -0700375{
376 nodemask_t tmp;
377
David Rientjes37012942008-04-28 02:12:33 -0700378 if (pol->flags & MPOL_F_STATIC_NODES) {
379 int node = first_node(pol->w.user_nodemask);
380
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -0700381 if (node_isset(node, *nodes)) {
David Rientjes37012942008-04-28 02:12:33 -0700382 pol->v.preferred_node = node;
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -0700383 pol->flags &= ~MPOL_F_LOCAL;
384 } else
385 pol->flags |= MPOL_F_LOCAL;
David Rientjes37012942008-04-28 02:12:33 -0700386 } else if (pol->flags & MPOL_F_RELATIVE_NODES) {
387 mpol_relative_nodemask(&tmp, &pol->w.user_nodemask, nodes);
388 pol->v.preferred_node = first_node(tmp);
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -0700389 } else if (!(pol->flags & MPOL_F_LOCAL)) {
David Rientjes37012942008-04-28 02:12:33 -0700390 pol->v.preferred_node = node_remap(pol->v.preferred_node,
391 pol->w.cpuset_mems_allowed,
392 *nodes);
393 pol->w.cpuset_mems_allowed = *nodes;
394 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395}
396
Miao Xie708c1bb2010-05-24 14:32:07 -0700397/*
398 * mpol_rebind_policy - Migrate a policy to a different set of nodes
399 *
400 * If read-side task has no lock to protect task->mempolicy, write-side
401 * task will rebind the task->mempolicy by two step. The first step is
402 * setting all the newly nodes, and the second step is cleaning all the
403 * disallowed nodes. In this way, we can avoid finding no node to alloc
404 * page.
405 * If we have a lock to protect task->mempolicy in read-side, we do
406 * rebind directly.
407 *
408 * step:
409 * MPOL_REBIND_ONCE - do rebind work at once
410 * MPOL_REBIND_STEP1 - set all the newly nodes
411 * MPOL_REBIND_STEP2 - clean all the disallowed nodes
412 */
413static void mpol_rebind_policy(struct mempolicy *pol, const nodemask_t *newmask,
414 enum mpol_rebind_step step)
David Rientjes1d0d2682008-04-28 02:12:32 -0700415{
David Rientjes1d0d2682008-04-28 02:12:32 -0700416 if (!pol)
417 return;
Wang Sheng-Hui89c522c2012-05-29 15:06:16 -0700418 if (!mpol_store_user_nodemask(pol) && step == MPOL_REBIND_ONCE &&
David Rientjes1d0d2682008-04-28 02:12:32 -0700419 nodes_equal(pol->w.cpuset_mems_allowed, *newmask))
420 return;
Miao Xie708c1bb2010-05-24 14:32:07 -0700421
422 if (step == MPOL_REBIND_STEP1 && (pol->flags & MPOL_F_REBINDING))
423 return;
424
425 if (step == MPOL_REBIND_STEP2 && !(pol->flags & MPOL_F_REBINDING))
426 BUG();
427
428 if (step == MPOL_REBIND_STEP1)
429 pol->flags |= MPOL_F_REBINDING;
430 else if (step == MPOL_REBIND_STEP2)
431 pol->flags &= ~MPOL_F_REBINDING;
432 else if (step >= MPOL_REBIND_NSTEP)
433 BUG();
434
435 mpol_ops[pol->mode].rebind(pol, newmask, step);
David Rientjes1d0d2682008-04-28 02:12:32 -0700436}
437
438/*
439 * Wrapper for mpol_rebind_policy() that just requires task
440 * pointer, and updates task mempolicy.
Miao Xie58568d22009-06-16 15:31:49 -0700441 *
442 * Called with task's alloc_lock held.
David Rientjes1d0d2682008-04-28 02:12:32 -0700443 */
444
Miao Xie708c1bb2010-05-24 14:32:07 -0700445void mpol_rebind_task(struct task_struct *tsk, const nodemask_t *new,
446 enum mpol_rebind_step step)
David Rientjes1d0d2682008-04-28 02:12:32 -0700447{
Miao Xie708c1bb2010-05-24 14:32:07 -0700448 mpol_rebind_policy(tsk->mempolicy, new, step);
David Rientjes1d0d2682008-04-28 02:12:32 -0700449}
450
451/*
452 * Rebind each vma in mm to new nodemask.
453 *
454 * Call holding a reference to mm. Takes mm->mmap_sem during call.
455 */
456
457void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)
458{
459 struct vm_area_struct *vma;
460
461 down_write(&mm->mmap_sem);
462 for (vma = mm->mmap; vma; vma = vma->vm_next)
Miao Xie708c1bb2010-05-24 14:32:07 -0700463 mpol_rebind_policy(vma->vm_policy, new, MPOL_REBIND_ONCE);
David Rientjes1d0d2682008-04-28 02:12:32 -0700464 up_write(&mm->mmap_sem);
465}
466
David Rientjes37012942008-04-28 02:12:33 -0700467static const struct mempolicy_operations mpol_ops[MPOL_MAX] = {
468 [MPOL_DEFAULT] = {
469 .rebind = mpol_rebind_default,
470 },
471 [MPOL_INTERLEAVE] = {
472 .create = mpol_new_interleave,
473 .rebind = mpol_rebind_nodemask,
474 },
475 [MPOL_PREFERRED] = {
476 .create = mpol_new_preferred,
477 .rebind = mpol_rebind_preferred,
478 },
479 [MPOL_BIND] = {
480 .create = mpol_new_bind,
481 .rebind = mpol_rebind_nodemask,
482 },
483};
484
Christoph Lameterfc301282006-01-18 17:42:29 -0800485static void migrate_page_add(struct page *page, struct list_head *pagelist,
486 unsigned long flags);
Christoph Lameter1a75a6c2006-01-08 01:01:02 -0800487
Christoph Lameter38e35862006-01-08 01:01:01 -0800488/* Scan through pages checking if pages follow certain conditions. */
Nick Pigginb5810032005-10-29 18:16:12 -0700489static int check_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800490 unsigned long addr, unsigned long end,
491 const nodemask_t *nodes, unsigned long flags,
Christoph Lameter38e35862006-01-08 01:01:01 -0800492 void *private)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493{
Hugh Dickins91612e02005-06-21 17:15:07 -0700494 pte_t *orig_pte;
495 pte_t *pte;
Hugh Dickins705e87c2005-10-29 18:16:27 -0700496 spinlock_t *ptl;
Hugh Dickins941150a2005-06-21 17:15:06 -0700497
Hugh Dickins705e87c2005-10-29 18:16:27 -0700498 orig_pte = pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
Hugh Dickins91612e02005-06-21 17:15:07 -0700499 do {
Linus Torvalds6aab3412005-11-28 14:34:23 -0800500 struct page *page;
Andy Whitcroft25ba77c2006-12-06 20:33:03 -0800501 int nid;
Hugh Dickins91612e02005-06-21 17:15:07 -0700502
503 if (!pte_present(*pte))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504 continue;
Linus Torvalds6aab3412005-11-28 14:34:23 -0800505 page = vm_normal_page(vma, addr, *pte);
506 if (!page)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507 continue;
Nick Piggin053837f2006-01-18 17:42:27 -0800508 /*
Hugh Dickins62b61f62009-12-14 17:59:33 -0800509 * vm_normal_page() filters out zero pages, but there might
510 * still be PageReserved pages to skip, perhaps in a VDSO.
511 * And we cannot move PageKsm pages sensibly or safely yet.
Nick Piggin053837f2006-01-18 17:42:27 -0800512 */
Hugh Dickins62b61f62009-12-14 17:59:33 -0800513 if (PageReserved(page) || PageKsm(page))
Christoph Lameterf4598c82006-01-12 01:05:20 -0800514 continue;
Linus Torvalds6aab3412005-11-28 14:34:23 -0800515 nid = page_to_nid(page);
Christoph Lameter38e35862006-01-08 01:01:01 -0800516 if (node_isset(nid, *nodes) == !!(flags & MPOL_MF_INVERT))
517 continue;
518
Stephen Wilsonb1f72d12011-05-24 17:12:43 -0700519 if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL))
Christoph Lameterfc301282006-01-18 17:42:29 -0800520 migrate_page_add(page, private, flags);
Christoph Lameter38e35862006-01-08 01:01:01 -0800521 else
522 break;
Hugh Dickins91612e02005-06-21 17:15:07 -0700523 } while (pte++, addr += PAGE_SIZE, addr != end);
Hugh Dickins705e87c2005-10-29 18:16:27 -0700524 pte_unmap_unlock(orig_pte, ptl);
Hugh Dickins91612e02005-06-21 17:15:07 -0700525 return addr != end;
526}
527
Nick Pigginb5810032005-10-29 18:16:12 -0700528static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud,
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800529 unsigned long addr, unsigned long end,
530 const nodemask_t *nodes, unsigned long flags,
Christoph Lameter38e35862006-01-08 01:01:01 -0800531 void *private)
Hugh Dickins91612e02005-06-21 17:15:07 -0700532{
533 pmd_t *pmd;
534 unsigned long next;
535
536 pmd = pmd_offset(pud, addr);
537 do {
538 next = pmd_addr_end(addr, end);
Kirill A. Shutemove1803772012-12-12 13:50:59 -0800539 split_huge_page_pmd(vma, addr, pmd);
Andrea Arcangeli1a5a9902012-03-21 16:33:42 -0700540 if (pmd_none_or_trans_huge_or_clear_bad(pmd))
Hugh Dickins91612e02005-06-21 17:15:07 -0700541 continue;
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800542 if (check_pte_range(vma, pmd, addr, next, nodes,
Christoph Lameter38e35862006-01-08 01:01:01 -0800543 flags, private))
Hugh Dickins91612e02005-06-21 17:15:07 -0700544 return -EIO;
545 } while (pmd++, addr = next, addr != end);
546 return 0;
547}
548
Nick Pigginb5810032005-10-29 18:16:12 -0700549static inline int check_pud_range(struct vm_area_struct *vma, pgd_t *pgd,
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800550 unsigned long addr, unsigned long end,
551 const nodemask_t *nodes, unsigned long flags,
Christoph Lameter38e35862006-01-08 01:01:01 -0800552 void *private)
Hugh Dickins91612e02005-06-21 17:15:07 -0700553{
554 pud_t *pud;
555 unsigned long next;
556
557 pud = pud_offset(pgd, addr);
558 do {
559 next = pud_addr_end(addr, end);
560 if (pud_none_or_clear_bad(pud))
561 continue;
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800562 if (check_pmd_range(vma, pud, addr, next, nodes,
Christoph Lameter38e35862006-01-08 01:01:01 -0800563 flags, private))
Hugh Dickins91612e02005-06-21 17:15:07 -0700564 return -EIO;
565 } while (pud++, addr = next, addr != end);
566 return 0;
567}
568
Nick Pigginb5810032005-10-29 18:16:12 -0700569static inline int check_pgd_range(struct vm_area_struct *vma,
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800570 unsigned long addr, unsigned long end,
571 const nodemask_t *nodes, unsigned long flags,
Christoph Lameter38e35862006-01-08 01:01:01 -0800572 void *private)
Hugh Dickins91612e02005-06-21 17:15:07 -0700573{
574 pgd_t *pgd;
575 unsigned long next;
576
Nick Pigginb5810032005-10-29 18:16:12 -0700577 pgd = pgd_offset(vma->vm_mm, addr);
Hugh Dickins91612e02005-06-21 17:15:07 -0700578 do {
579 next = pgd_addr_end(addr, end);
580 if (pgd_none_or_clear_bad(pgd))
581 continue;
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800582 if (check_pud_range(vma, pgd, addr, next, nodes,
Christoph Lameter38e35862006-01-08 01:01:01 -0800583 flags, private))
Hugh Dickins91612e02005-06-21 17:15:07 -0700584 return -EIO;
585 } while (pgd++, addr = next, addr != end);
586 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587}
588
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200589#ifdef CONFIG_ARCH_USES_NUMA_PROT_NONE
590/*
Mel Gorman4b10e7d2012-10-25 14:16:32 +0200591 * This is used to mark a range of virtual addresses to be inaccessible.
592 * These are later cleared by a NUMA hinting fault. Depending on these
593 * faults, pages may be migrated for better NUMA placement.
594 *
595 * This is assuming that NUMA faults are handled using PROT_NONE. If
596 * an architecture makes a different choice, it will need further
597 * changes to the core.
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200598 */
Mel Gorman4b10e7d2012-10-25 14:16:32 +0200599unsigned long change_prot_numa(struct vm_area_struct *vma,
600 unsigned long addr, unsigned long end)
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200601{
Mel Gorman4b10e7d2012-10-25 14:16:32 +0200602 int nr_updated;
603 BUILD_BUG_ON(_PAGE_NUMA != _PAGE_PROTNONE);
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200604
Mel Gorman4b10e7d2012-10-25 14:16:32 +0200605 nr_updated = change_protection(vma, addr, end, vma->vm_page_prot, 0, 1);
Mel Gorman03c5a6e2012-11-02 14:52:48 +0000606 if (nr_updated)
607 count_vm_numa_events(NUMA_PTE_UPDATES, nr_updated);
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200608
Mel Gorman4b10e7d2012-10-25 14:16:32 +0200609 return nr_updated;
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200610}
611#else
612static unsigned long change_prot_numa(struct vm_area_struct *vma,
613 unsigned long addr, unsigned long end)
614{
615 return 0;
616}
617#endif /* CONFIG_ARCH_USES_NUMA_PROT_NONE */
618
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800619/*
620 * Check if all pages in a range are on a set of nodes.
621 * If pagelist != NULL then isolate pages from the LRU and
622 * put them on the pagelist.
623 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624static struct vm_area_struct *
625check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
Christoph Lameter38e35862006-01-08 01:01:01 -0800626 const nodemask_t *nodes, unsigned long flags, void *private)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627{
628 int err;
629 struct vm_area_struct *first, *vma, *prev;
630
Nick Piggin053837f2006-01-18 17:42:27 -0800631
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 first = find_vma(mm, start);
633 if (!first)
634 return ERR_PTR(-EFAULT);
635 prev = NULL;
636 for (vma = first; vma && vma->vm_start < end; vma = vma->vm_next) {
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200637 unsigned long endvma = vma->vm_end;
638
639 if (endvma > end)
640 endvma = end;
641 if (vma->vm_start > start)
642 start = vma->vm_start;
643
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800644 if (!(flags & MPOL_MF_DISCONTIG_OK)) {
645 if (!vma->vm_next && vma->vm_end < end)
646 return ERR_PTR(-EFAULT);
647 if (prev && prev->vm_end < vma->vm_start)
648 return ERR_PTR(-EFAULT);
649 }
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800650
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200651 if (is_vm_hugetlb_page(vma))
652 goto next;
653
654 if (flags & MPOL_MF_LAZY) {
655 change_prot_numa(vma, start, endvma);
656 goto next;
657 }
658
659 if ((flags & MPOL_MF_STRICT) ||
660 ((flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) &&
661 vma_migratable(vma))) {
662
Christoph Lameterdc9aa5b2006-01-08 01:00:50 -0800663 err = check_pgd_range(vma, start, endvma, nodes,
Christoph Lameter38e35862006-01-08 01:01:01 -0800664 flags, private);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665 if (err) {
666 first = ERR_PTR(err);
667 break;
668 }
669 }
Lee Schermerhornb24f53a2012-10-25 14:16:32 +0200670next:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 prev = vma;
672 }
673 return first;
674}
675
KOSAKI Motohiro869833f22012-10-08 16:29:16 -0700676/*
677 * Apply policy to a single VMA
678 * This must be called with the mmap_sem held for writing.
679 */
680static int vma_replace_policy(struct vm_area_struct *vma,
681 struct mempolicy *pol)
KOSAKI Motohiro8d34694c12012-10-08 16:29:14 -0700682{
KOSAKI Motohiro869833f22012-10-08 16:29:16 -0700683 int err;
684 struct mempolicy *old;
685 struct mempolicy *new;
KOSAKI Motohiro8d34694c12012-10-08 16:29:14 -0700686
687 pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
688 vma->vm_start, vma->vm_end, vma->vm_pgoff,
689 vma->vm_ops, vma->vm_file,
690 vma->vm_ops ? vma->vm_ops->set_policy : NULL);
691
KOSAKI Motohiro869833f22012-10-08 16:29:16 -0700692 new = mpol_dup(pol);
693 if (IS_ERR(new))
694 return PTR_ERR(new);
695
696 if (vma->vm_ops && vma->vm_ops->set_policy) {
KOSAKI Motohiro8d34694c12012-10-08 16:29:14 -0700697 err = vma->vm_ops->set_policy(vma, new);
KOSAKI Motohiro869833f22012-10-08 16:29:16 -0700698 if (err)
699 goto err_out;
KOSAKI Motohiro8d34694c12012-10-08 16:29:14 -0700700 }
KOSAKI Motohiro869833f22012-10-08 16:29:16 -0700701
702 old = vma->vm_policy;
703 vma->vm_policy = new; /* protected by mmap_sem */
704 mpol_put(old);
705
706 return 0;
707 err_out:
708 mpol_put(new);
KOSAKI Motohiro8d34694c12012-10-08 16:29:14 -0700709 return err;
710}
711
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712/* Step 2: apply policy to a range and do splits. */
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800713static int mbind_range(struct mm_struct *mm, unsigned long start,
714 unsigned long end, struct mempolicy *new_pol)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715{
716 struct vm_area_struct *next;
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800717 struct vm_area_struct *prev;
718 struct vm_area_struct *vma;
719 int err = 0;
KOSAKI Motohiroe26a5112011-12-28 15:57:11 -0800720 pgoff_t pgoff;
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800721 unsigned long vmstart;
722 unsigned long vmend;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723
Linus Torvalds097d5912012-03-06 18:23:36 -0800724 vma = find_vma(mm, start);
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800725 if (!vma || vma->vm_start > start)
726 return -EFAULT;
727
Linus Torvalds097d5912012-03-06 18:23:36 -0800728 prev = vma->vm_prev;
KOSAKI Motohiroe26a5112011-12-28 15:57:11 -0800729 if (start > vma->vm_start)
730 prev = vma;
731
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800732 for (; vma && vma->vm_start < end; prev = vma, vma = next) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733 next = vma->vm_next;
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800734 vmstart = max(start, vma->vm_start);
735 vmend = min(end, vma->vm_end);
736
KOSAKI Motohiroe26a5112011-12-28 15:57:11 -0800737 if (mpol_equal(vma_policy(vma), new_pol))
738 continue;
739
740 pgoff = vma->vm_pgoff +
741 ((vmstart - vma->vm_start) >> PAGE_SHIFT);
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800742 prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags,
KOSAKI Motohiroe26a5112011-12-28 15:57:11 -0800743 vma->anon_vma, vma->vm_file, pgoff,
Caspar Zhang8aacc9f2011-09-14 16:20:58 -0700744 new_pol);
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800745 if (prev) {
746 vma = prev;
747 next = vma->vm_next;
748 continue;
749 }
750 if (vma->vm_start != vmstart) {
751 err = split_vma(vma->vm_mm, vma, vmstart, 1);
752 if (err)
753 goto out;
754 }
755 if (vma->vm_end != vmend) {
756 err = split_vma(vma->vm_mm, vma, vmend, 0);
757 if (err)
758 goto out;
759 }
KOSAKI Motohiro869833f22012-10-08 16:29:16 -0700760 err = vma_replace_policy(vma, new_pol);
KOSAKI Motohiro8d34694c12012-10-08 16:29:14 -0700761 if (err)
762 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763 }
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -0800764
765 out:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766 return err;
767}
768
Paul Jacksonc61afb12006-03-24 03:16:08 -0800769/*
770 * Update task->flags PF_MEMPOLICY bit: set iff non-default
771 * mempolicy. Allows more rapid checking of this (combined perhaps
772 * with other PF_* flag bits) on memory allocation hot code paths.
773 *
774 * If called from outside this file, the task 'p' should -only- be
775 * a newly forked child not yet visible on the task list, because
776 * manipulating the task flags of a visible task is not safe.
777 *
778 * The above limitation is why this routine has the funny name
779 * mpol_fix_fork_child_flag().
780 *
781 * It is also safe to call this with a task pointer of current,
782 * which the static wrapper mpol_set_task_struct_flag() does,
783 * for use within this file.
784 */
785
786void mpol_fix_fork_child_flag(struct task_struct *p)
787{
788 if (p->mempolicy)
789 p->flags |= PF_MEMPOLICY;
790 else
791 p->flags &= ~PF_MEMPOLICY;
792}
793
794static void mpol_set_task_struct_flag(void)
795{
796 mpol_fix_fork_child_flag(current);
797}
798
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799/* Set the process memory policy */
David Rientjes028fec42008-04-28 02:12:25 -0700800static long do_set_mempolicy(unsigned short mode, unsigned short flags,
801 nodemask_t *nodes)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802{
Miao Xie58568d22009-06-16 15:31:49 -0700803 struct mempolicy *new, *old;
Lee Schermerhornf4e53d92008-04-28 02:13:10 -0700804 struct mm_struct *mm = current->mm;
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700805 NODEMASK_SCRATCH(scratch);
Miao Xie58568d22009-06-16 15:31:49 -0700806 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700808 if (!scratch)
809 return -ENOMEM;
Lee Schermerhornf4e53d92008-04-28 02:13:10 -0700810
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700811 new = mpol_new(mode, flags, nodes);
812 if (IS_ERR(new)) {
813 ret = PTR_ERR(new);
814 goto out;
815 }
Lee Schermerhornf4e53d92008-04-28 02:13:10 -0700816 /*
817 * prevent changing our mempolicy while show_numa_maps()
818 * is using it.
819 * Note: do_set_mempolicy() can be called at init time
820 * with no 'mm'.
821 */
822 if (mm)
823 down_write(&mm->mmap_sem);
Miao Xie58568d22009-06-16 15:31:49 -0700824 task_lock(current);
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700825 ret = mpol_set_nodemask(new, nodes, scratch);
Miao Xie58568d22009-06-16 15:31:49 -0700826 if (ret) {
827 task_unlock(current);
828 if (mm)
829 up_write(&mm->mmap_sem);
830 mpol_put(new);
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700831 goto out;
Miao Xie58568d22009-06-16 15:31:49 -0700832 }
833 old = current->mempolicy;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834 current->mempolicy = new;
Paul Jacksonc61afb12006-03-24 03:16:08 -0800835 mpol_set_task_struct_flag();
Lee Schermerhorn45c47452008-04-28 02:13:12 -0700836 if (new && new->mode == MPOL_INTERLEAVE &&
David Rientjesf5b087b2008-04-28 02:12:27 -0700837 nodes_weight(new->v.nodes))
Andi Kleendfcd3c02005-10-29 18:15:48 -0700838 current->il_next = first_node(new->v.nodes);
Miao Xie58568d22009-06-16 15:31:49 -0700839 task_unlock(current);
Lee Schermerhornf4e53d92008-04-28 02:13:10 -0700840 if (mm)
841 up_write(&mm->mmap_sem);
842
Miao Xie58568d22009-06-16 15:31:49 -0700843 mpol_put(old);
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -0700844 ret = 0;
845out:
846 NODEMASK_SCRATCH_FREE(scratch);
847 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848}
849
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700850/*
851 * Return nodemask for policy for get_mempolicy() query
Miao Xie58568d22009-06-16 15:31:49 -0700852 *
853 * Called with task's alloc_lock held
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700854 */
855static void get_policy_nodemask(struct mempolicy *p, nodemask_t *nodes)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856{
Andi Kleendfcd3c02005-10-29 18:15:48 -0700857 nodes_clear(*nodes);
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700858 if (p == &default_policy)
859 return;
860
Lee Schermerhorn45c47452008-04-28 02:13:12 -0700861 switch (p->mode) {
Mel Gorman19770b32008-04-28 02:12:18 -0700862 case MPOL_BIND:
863 /* Fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 case MPOL_INTERLEAVE:
Andi Kleendfcd3c02005-10-29 18:15:48 -0700865 *nodes = p->v.nodes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866 break;
867 case MPOL_PREFERRED:
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -0700868 if (!(p->flags & MPOL_F_LOCAL))
Andi Kleendfcd3c02005-10-29 18:15:48 -0700869 node_set(p->v.preferred_node, *nodes);
Lee Schermerhorn53f25562008-04-28 02:13:20 -0700870 /* else return empty node mask for local allocation */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871 break;
872 default:
873 BUG();
874 }
875}
876
877static int lookup_node(struct mm_struct *mm, unsigned long addr)
878{
879 struct page *p;
880 int err;
881
882 err = get_user_pages(current, mm, addr & PAGE_MASK, 1, 0, 0, &p, NULL);
883 if (err >= 0) {
884 err = page_to_nid(p);
885 put_page(p);
886 }
887 return err;
888}
889
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890/* Retrieve NUMA policy */
Adrian Bunkdbcb0f12007-10-16 01:26:26 -0700891static long do_get_mempolicy(int *policy, nodemask_t *nmask,
892 unsigned long addr, unsigned long flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893{
Christoph Lameter8bccd852005-10-29 18:16:59 -0700894 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 struct mm_struct *mm = current->mm;
896 struct vm_area_struct *vma = NULL;
897 struct mempolicy *pol = current->mempolicy;
898
Lee Schermerhorn754af6f2007-10-16 01:24:51 -0700899 if (flags &
900 ~(unsigned long)(MPOL_F_NODE|MPOL_F_ADDR|MPOL_F_MEMS_ALLOWED))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 return -EINVAL;
Lee Schermerhorn754af6f2007-10-16 01:24:51 -0700902
903 if (flags & MPOL_F_MEMS_ALLOWED) {
904 if (flags & (MPOL_F_NODE|MPOL_F_ADDR))
905 return -EINVAL;
906 *policy = 0; /* just so it's initialized */
Miao Xie58568d22009-06-16 15:31:49 -0700907 task_lock(current);
Lee Schermerhorn754af6f2007-10-16 01:24:51 -0700908 *nmask = cpuset_current_mems_allowed;
Miao Xie58568d22009-06-16 15:31:49 -0700909 task_unlock(current);
Lee Schermerhorn754af6f2007-10-16 01:24:51 -0700910 return 0;
911 }
912
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913 if (flags & MPOL_F_ADDR) {
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700914 /*
915 * Do NOT fall back to task policy if the
916 * vma/shared policy at addr is NULL. We
917 * want to return MPOL_DEFAULT in this case.
918 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 down_read(&mm->mmap_sem);
920 vma = find_vma_intersection(mm, addr, addr+1);
921 if (!vma) {
922 up_read(&mm->mmap_sem);
923 return -EFAULT;
924 }
925 if (vma->vm_ops && vma->vm_ops->get_policy)
926 pol = vma->vm_ops->get_policy(vma, addr);
927 else
928 pol = vma->vm_policy;
929 } else if (addr)
930 return -EINVAL;
931
932 if (!pol)
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700933 pol = &default_policy; /* indicates default behavior */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934
935 if (flags & MPOL_F_NODE) {
936 if (flags & MPOL_F_ADDR) {
937 err = lookup_node(mm, addr);
938 if (err < 0)
939 goto out;
Christoph Lameter8bccd852005-10-29 18:16:59 -0700940 *policy = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 } else if (pol == current->mempolicy &&
Lee Schermerhorn45c47452008-04-28 02:13:12 -0700942 pol->mode == MPOL_INTERLEAVE) {
Christoph Lameter8bccd852005-10-29 18:16:59 -0700943 *policy = current->il_next;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700944 } else {
945 err = -EINVAL;
946 goto out;
947 }
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700948 } else {
949 *policy = pol == &default_policy ? MPOL_DEFAULT :
950 pol->mode;
David Rientjesd79df632008-07-04 12:24:13 -0700951 /*
952 * Internal mempolicy flags must be masked off before exposing
953 * the policy to userspace.
954 */
955 *policy |= (pol->flags & MPOL_MODE_FLAGS);
Lee Schermerhornbea904d2008-04-28 02:13:18 -0700956 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957
958 if (vma) {
959 up_read(&current->mm->mmap_sem);
960 vma = NULL;
961 }
962
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 err = 0;
Miao Xie58568d22009-06-16 15:31:49 -0700964 if (nmask) {
Lee Schermerhornc6b6ef82010-03-23 13:35:41 -0700965 if (mpol_store_user_nodemask(pol)) {
966 *nmask = pol->w.user_nodemask;
967 } else {
968 task_lock(current);
969 get_policy_nodemask(pol, nmask);
970 task_unlock(current);
971 }
Miao Xie58568d22009-06-16 15:31:49 -0700972 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973
974 out:
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -0700975 mpol_cond_put(pol);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 if (vma)
977 up_read(&current->mm->mmap_sem);
978 return err;
979}
980
Christoph Lameterb20a3502006-03-22 00:09:12 -0800981#ifdef CONFIG_MIGRATION
Christoph Lameter8bccd852005-10-29 18:16:59 -0700982/*
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -0800983 * page migration
984 */
Christoph Lameterfc301282006-01-18 17:42:29 -0800985static void migrate_page_add(struct page *page, struct list_head *pagelist,
986 unsigned long flags)
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -0800987{
988 /*
Christoph Lameterfc301282006-01-18 17:42:29 -0800989 * Avoid migrating a page that is shared with others.
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -0800990 */
Nick Piggin62695a82008-10-18 20:26:09 -0700991 if ((flags & MPOL_MF_MOVE_ALL) || page_mapcount(page) == 1) {
992 if (!isolate_lru_page(page)) {
993 list_add_tail(&page->lru, pagelist);
KOSAKI Motohiro6d9c2852009-12-14 17:58:11 -0800994 inc_zone_page_state(page, NR_ISOLATED_ANON +
995 page_is_file_cache(page));
Nick Piggin62695a82008-10-18 20:26:09 -0700996 }
997 }
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -0800998}
999
Christoph Lameter742755a2006-06-23 02:03:55 -07001000static struct page *new_node_page(struct page *page, unsigned long node, int **x)
Christoph Lameter95a402c2006-06-23 02:03:53 -07001001{
Mel Gorman6484eb32009-06-16 15:31:54 -07001002 return alloc_pages_exact_node(node, GFP_HIGHUSER_MOVABLE, 0);
Christoph Lameter95a402c2006-06-23 02:03:53 -07001003}
1004
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001005/*
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001006 * Migrate pages from one node to a target node.
1007 * Returns error or the number of pages not migrated.
1008 */
Adrian Bunkdbcb0f12007-10-16 01:26:26 -07001009static int migrate_to_node(struct mm_struct *mm, int source, int dest,
1010 int flags)
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001011{
1012 nodemask_t nmask;
1013 LIST_HEAD(pagelist);
1014 int err = 0;
1015
1016 nodes_clear(nmask);
1017 node_set(source, nmask);
1018
Minchan Kim08270802012-10-08 16:33:38 -07001019 /*
1020 * This does not "check" the range but isolates all pages that
1021 * need migration. Between passing in the full user address
1022 * space range and MPOL_MF_DISCONTIG_OK, this call can not fail.
1023 */
1024 VM_BUG_ON(!(flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)));
1025 check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask,
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001026 flags | MPOL_MF_DISCONTIG_OK, &pagelist);
1027
Minchan Kimcf608ac2010-10-26 14:21:29 -07001028 if (!list_empty(&pagelist)) {
Mel Gorman7f0f2492011-01-13 15:45:58 -08001029 err = migrate_pages(&pagelist, new_node_page, dest,
Mel Gorman7b2a2d42012-10-19 14:07:31 +01001030 false, MIGRATE_SYNC,
1031 MR_SYSCALL);
Minchan Kimcf608ac2010-10-26 14:21:29 -07001032 if (err)
1033 putback_lru_pages(&pagelist);
1034 }
Christoph Lameter95a402c2006-06-23 02:03:53 -07001035
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001036 return err;
1037}
1038
1039/*
1040 * Move pages between the two nodesets so as to preserve the physical
1041 * layout as much as possible.
Christoph Lameter39743882006-01-08 01:00:51 -08001042 *
1043 * Returns the number of page that could not be moved.
1044 */
Andrew Morton0ce72d42012-05-29 15:06:24 -07001045int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
1046 const nodemask_t *to, int flags)
Christoph Lameter39743882006-01-08 01:00:51 -08001047{
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001048 int busy = 0;
Christoph Lameter0aedadf2008-11-06 12:53:30 -08001049 int err;
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001050 nodemask_t tmp;
Christoph Lameter39743882006-01-08 01:00:51 -08001051
Christoph Lameter0aedadf2008-11-06 12:53:30 -08001052 err = migrate_prep();
1053 if (err)
1054 return err;
1055
Lee Schermerhorn53f25562008-04-28 02:13:20 -07001056 down_read(&mm->mmap_sem);
Christoph Lameter39743882006-01-08 01:00:51 -08001057
Andrew Morton0ce72d42012-05-29 15:06:24 -07001058 err = migrate_vmas(mm, from, to, flags);
Christoph Lameter7b2259b2006-06-25 05:46:48 -07001059 if (err)
1060 goto out;
1061
KOSAKI Motohiroda0aa132010-03-05 13:41:59 -08001062 /*
1063 * Find a 'source' bit set in 'tmp' whose corresponding 'dest'
1064 * bit in 'to' is not also set in 'tmp'. Clear the found 'source'
1065 * bit in 'tmp', and return that <source, dest> pair for migration.
1066 * The pair of nodemasks 'to' and 'from' define the map.
1067 *
1068 * If no pair of bits is found that way, fallback to picking some
1069 * pair of 'source' and 'dest' bits that are not the same. If the
1070 * 'source' and 'dest' bits are the same, this represents a node
1071 * that will be migrating to itself, so no pages need move.
1072 *
1073 * If no bits are left in 'tmp', or if all remaining bits left
1074 * in 'tmp' correspond to the same bit in 'to', return false
1075 * (nothing left to migrate).
1076 *
1077 * This lets us pick a pair of nodes to migrate between, such that
1078 * if possible the dest node is not already occupied by some other
1079 * source node, minimizing the risk of overloading the memory on a
1080 * node that would happen if we migrated incoming memory to a node
1081 * before migrating outgoing memory source that same node.
1082 *
1083 * A single scan of tmp is sufficient. As we go, we remember the
1084 * most recent <s, d> pair that moved (s != d). If we find a pair
1085 * that not only moved, but what's better, moved to an empty slot
1086 * (d is not set in tmp), then we break out then, with that pair.
Justin P. Mattockae0e47f2011-03-01 15:06:02 +01001087 * Otherwise when we finish scanning from_tmp, we at least have the
KOSAKI Motohiroda0aa132010-03-05 13:41:59 -08001088 * most recent <s, d> pair that moved. If we get all the way through
1089 * the scan of tmp without finding any node that moved, much less
1090 * moved to an empty node, then there is nothing left worth migrating.
1091 */
Christoph Lameterd4984712006-01-08 01:00:55 -08001092
Andrew Morton0ce72d42012-05-29 15:06:24 -07001093 tmp = *from;
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001094 while (!nodes_empty(tmp)) {
1095 int s,d;
1096 int source = -1;
1097 int dest = 0;
1098
1099 for_each_node_mask(s, tmp) {
Larry Woodman4a5b18c2012-05-29 15:06:24 -07001100
1101 /*
1102 * do_migrate_pages() tries to maintain the relative
1103 * node relationship of the pages established between
1104 * threads and memory areas.
1105 *
1106 * However if the number of source nodes is not equal to
1107 * the number of destination nodes we can not preserve
1108 * this node relative relationship. In that case, skip
1109 * copying memory from a node that is in the destination
1110 * mask.
1111 *
1112 * Example: [2,3,4] -> [3,4,5] moves everything.
1113 * [0-7] - > [3,4,5] moves only 0,1,2,6,7.
1114 */
1115
Andrew Morton0ce72d42012-05-29 15:06:24 -07001116 if ((nodes_weight(*from) != nodes_weight(*to)) &&
1117 (node_isset(s, *to)))
Larry Woodman4a5b18c2012-05-29 15:06:24 -07001118 continue;
1119
Andrew Morton0ce72d42012-05-29 15:06:24 -07001120 d = node_remap(s, *from, *to);
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001121 if (s == d)
1122 continue;
1123
1124 source = s; /* Node moved. Memorize */
1125 dest = d;
1126
1127 /* dest not in remaining from nodes? */
1128 if (!node_isset(dest, tmp))
1129 break;
1130 }
1131 if (source == -1)
1132 break;
1133
1134 node_clear(source, tmp);
1135 err = migrate_to_node(mm, source, dest, flags);
1136 if (err > 0)
1137 busy += err;
1138 if (err < 0)
1139 break;
Christoph Lameter39743882006-01-08 01:00:51 -08001140 }
Christoph Lameter7b2259b2006-06-25 05:46:48 -07001141out:
Christoph Lameter39743882006-01-08 01:00:51 -08001142 up_read(&mm->mmap_sem);
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001143 if (err < 0)
1144 return err;
1145 return busy;
Christoph Lameterb20a3502006-03-22 00:09:12 -08001146
Christoph Lameter39743882006-01-08 01:00:51 -08001147}
1148
Lee Schermerhorn3ad33b22007-11-14 16:59:10 -08001149/*
1150 * Allocate a new page for page migration based on vma policy.
1151 * Start assuming that page is mapped by vma pointed to by @private.
1152 * Search forward from there, if not. N.B., this assumes that the
1153 * list of pages handed to migrate_pages()--which is how we get here--
1154 * is in virtual address order.
1155 */
Christoph Lameter742755a2006-06-23 02:03:55 -07001156static struct page *new_vma_page(struct page *page, unsigned long private, int **x)
Christoph Lameter95a402c2006-06-23 02:03:53 -07001157{
1158 struct vm_area_struct *vma = (struct vm_area_struct *)private;
Lee Schermerhorn3ad33b22007-11-14 16:59:10 -08001159 unsigned long uninitialized_var(address);
Christoph Lameter95a402c2006-06-23 02:03:53 -07001160
Lee Schermerhorn3ad33b22007-11-14 16:59:10 -08001161 while (vma) {
1162 address = page_address_in_vma(page, vma);
1163 if (address != -EFAULT)
1164 break;
1165 vma = vma->vm_next;
1166 }
1167
1168 /*
1169 * if !vma, alloc_page_vma() will use task or system default policy
1170 */
1171 return alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address);
Christoph Lameter95a402c2006-06-23 02:03:53 -07001172}
Christoph Lameterb20a3502006-03-22 00:09:12 -08001173#else
1174
1175static void migrate_page_add(struct page *page, struct list_head *pagelist,
1176 unsigned long flags)
1177{
1178}
1179
Andrew Morton0ce72d42012-05-29 15:06:24 -07001180int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
1181 const nodemask_t *to, int flags)
Christoph Lameterb20a3502006-03-22 00:09:12 -08001182{
1183 return -ENOSYS;
1184}
Christoph Lameter95a402c2006-06-23 02:03:53 -07001185
Keith Owens69939742006-10-11 01:21:28 -07001186static struct page *new_vma_page(struct page *page, unsigned long private, int **x)
Christoph Lameter95a402c2006-06-23 02:03:53 -07001187{
1188 return NULL;
1189}
Christoph Lameterb20a3502006-03-22 00:09:12 -08001190#endif
1191
Adrian Bunkdbcb0f12007-10-16 01:26:26 -07001192static long do_mbind(unsigned long start, unsigned long len,
David Rientjes028fec42008-04-28 02:12:25 -07001193 unsigned short mode, unsigned short mode_flags,
1194 nodemask_t *nmask, unsigned long flags)
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001195{
1196 struct vm_area_struct *vma;
1197 struct mm_struct *mm = current->mm;
1198 struct mempolicy *new;
1199 unsigned long end;
1200 int err;
1201 LIST_HEAD(pagelist);
1202
Lee Schermerhornb24f53a2012-10-25 14:16:32 +02001203 if (flags & ~(unsigned long)MPOL_MF_VALID)
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001204 return -EINVAL;
Christoph Lameter74c00242006-03-14 19:50:21 -08001205 if ((flags & MPOL_MF_MOVE_ALL) && !capable(CAP_SYS_NICE))
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001206 return -EPERM;
1207
1208 if (start & ~PAGE_MASK)
1209 return -EINVAL;
1210
1211 if (mode == MPOL_DEFAULT)
1212 flags &= ~MPOL_MF_STRICT;
1213
1214 len = (len + PAGE_SIZE - 1) & PAGE_MASK;
1215 end = start + len;
1216
1217 if (end < start)
1218 return -EINVAL;
1219 if (end == start)
1220 return 0;
1221
David Rientjes028fec42008-04-28 02:12:25 -07001222 new = mpol_new(mode, mode_flags, nmask);
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001223 if (IS_ERR(new))
1224 return PTR_ERR(new);
1225
Lee Schermerhornb24f53a2012-10-25 14:16:32 +02001226 if (flags & MPOL_MF_LAZY)
1227 new->flags |= MPOL_F_MOF;
1228
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001229 /*
1230 * If we are using the default policy then operation
1231 * on discontinuous address spaces is okay after all
1232 */
1233 if (!new)
1234 flags |= MPOL_MF_DISCONTIG_OK;
1235
David Rientjes028fec42008-04-28 02:12:25 -07001236 pr_debug("mbind %lx-%lx mode:%d flags:%d nodes:%lx\n",
1237 start, start + len, mode, mode_flags,
1238 nmask ? nodes_addr(*nmask)[0] : -1);
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001239
Christoph Lameter0aedadf2008-11-06 12:53:30 -08001240 if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) {
1241
1242 err = migrate_prep();
1243 if (err)
KOSAKI Motohirob05ca732009-10-26 16:49:59 -07001244 goto mpol_out;
Christoph Lameter0aedadf2008-11-06 12:53:30 -08001245 }
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -07001246 {
1247 NODEMASK_SCRATCH(scratch);
1248 if (scratch) {
1249 down_write(&mm->mmap_sem);
1250 task_lock(current);
1251 err = mpol_set_nodemask(new, nmask, scratch);
1252 task_unlock(current);
1253 if (err)
1254 up_write(&mm->mmap_sem);
1255 } else
1256 err = -ENOMEM;
1257 NODEMASK_SCRATCH_FREE(scratch);
1258 }
KOSAKI Motohirob05ca732009-10-26 16:49:59 -07001259 if (err)
1260 goto mpol_out;
1261
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001262 vma = check_range(mm, start, end, nmask,
1263 flags | MPOL_MF_INVERT, &pagelist);
1264
Lee Schermerhornb24f53a2012-10-25 14:16:32 +02001265 err = PTR_ERR(vma); /* maybe ... */
Mel Gormana7200942012-11-16 09:37:58 +00001266 if (!IS_ERR(vma))
KOSAKI Motohiro9d8cebd2010-03-05 13:41:57 -08001267 err = mbind_range(mm, start, end, new);
Christoph Lameter7e2ab152006-02-01 03:05:40 -08001268
Lee Schermerhornb24f53a2012-10-25 14:16:32 +02001269 if (!err) {
1270 int nr_failed = 0;
1271
Minchan Kimcf608ac2010-10-26 14:21:29 -07001272 if (!list_empty(&pagelist)) {
Lee Schermerhornb24f53a2012-10-25 14:16:32 +02001273 WARN_ON_ONCE(flags & MPOL_MF_LAZY);
Christoph Lameter95a402c2006-06-23 02:03:53 -07001274 nr_failed = migrate_pages(&pagelist, new_vma_page,
Mel Gorman7f0f2492011-01-13 15:45:58 -08001275 (unsigned long)vma,
Mel Gorman7b2a2d42012-10-19 14:07:31 +01001276 false, MIGRATE_SYNC,
1277 MR_MEMPOLICY_MBIND);
Minchan Kimcf608ac2010-10-26 14:21:29 -07001278 if (nr_failed)
1279 putback_lru_pages(&pagelist);
1280 }
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001281
Lee Schermerhornb24f53a2012-10-25 14:16:32 +02001282 if (nr_failed && (flags & MPOL_MF_STRICT))
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001283 err = -EIO;
KOSAKI Motohiroab8a3e12009-10-26 16:49:58 -07001284 } else
1285 putback_lru_pages(&pagelist);
Christoph Lameterb20a3502006-03-22 00:09:12 -08001286
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001287 up_write(&mm->mmap_sem);
KOSAKI Motohirob05ca732009-10-26 16:49:59 -07001288 mpol_out:
Lee Schermerhornf0be3d32008-04-28 02:13:08 -07001289 mpol_put(new);
Christoph Lameter6ce3c4c2006-01-08 01:01:04 -08001290 return err;
1291}
1292
Christoph Lameter39743882006-01-08 01:00:51 -08001293/*
Christoph Lameter8bccd852005-10-29 18:16:59 -07001294 * User space interface with variable sized bitmaps for nodelists.
1295 */
1296
1297/* Copy a node mask from user space. */
Christoph Lameter39743882006-01-08 01:00:51 -08001298static int get_nodes(nodemask_t *nodes, const unsigned long __user *nmask,
Christoph Lameter8bccd852005-10-29 18:16:59 -07001299 unsigned long maxnode)
1300{
1301 unsigned long k;
1302 unsigned long nlongs;
1303 unsigned long endmask;
1304
1305 --maxnode;
1306 nodes_clear(*nodes);
1307 if (maxnode == 0 || !nmask)
1308 return 0;
Andi Kleena9c930b2006-02-20 18:27:59 -08001309 if (maxnode > PAGE_SIZE*BITS_PER_BYTE)
Chris Wright636f13c2006-02-17 13:59:36 -08001310 return -EINVAL;
Christoph Lameter8bccd852005-10-29 18:16:59 -07001311
1312 nlongs = BITS_TO_LONGS(maxnode);
1313 if ((maxnode % BITS_PER_LONG) == 0)
1314 endmask = ~0UL;
1315 else
1316 endmask = (1UL << (maxnode % BITS_PER_LONG)) - 1;
1317
1318 /* When the user specified more nodes than supported just check
1319 if the non supported part is all zero. */
1320 if (nlongs > BITS_TO_LONGS(MAX_NUMNODES)) {
1321 if (nlongs > PAGE_SIZE/sizeof(long))
1322 return -EINVAL;
1323 for (k = BITS_TO_LONGS(MAX_NUMNODES); k < nlongs; k++) {
1324 unsigned long t;
1325 if (get_user(t, nmask + k))
1326 return -EFAULT;
1327 if (k == nlongs - 1) {
1328 if (t & endmask)
1329 return -EINVAL;
1330 } else if (t)
1331 return -EINVAL;
1332 }
1333 nlongs = BITS_TO_LONGS(MAX_NUMNODES);
1334 endmask = ~0UL;
1335 }
1336
1337 if (copy_from_user(nodes_addr(*nodes), nmask, nlongs*sizeof(unsigned long)))
1338 return -EFAULT;
1339 nodes_addr(*nodes)[nlongs-1] &= endmask;
1340 return 0;
1341}
1342
1343/* Copy a kernel node mask to user space */
1344static int copy_nodes_to_user(unsigned long __user *mask, unsigned long maxnode,
1345 nodemask_t *nodes)
1346{
1347 unsigned long copy = ALIGN(maxnode-1, 64) / 8;
1348 const int nbytes = BITS_TO_LONGS(MAX_NUMNODES) * sizeof(long);
1349
1350 if (copy > nbytes) {
1351 if (copy > PAGE_SIZE)
1352 return -EINVAL;
1353 if (clear_user((char __user *)mask + nbytes, copy - nbytes))
1354 return -EFAULT;
1355 copy = nbytes;
1356 }
1357 return copy_to_user(mask, nodes_addr(*nodes), copy) ? -EFAULT : 0;
1358}
1359
Heiko Carstens938bb9f2009-01-14 14:14:30 +01001360SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
1361 unsigned long, mode, unsigned long __user *, nmask,
1362 unsigned long, maxnode, unsigned, flags)
Christoph Lameter8bccd852005-10-29 18:16:59 -07001363{
1364 nodemask_t nodes;
1365 int err;
David Rientjes028fec42008-04-28 02:12:25 -07001366 unsigned short mode_flags;
Christoph Lameter8bccd852005-10-29 18:16:59 -07001367
David Rientjes028fec42008-04-28 02:12:25 -07001368 mode_flags = mode & MPOL_MODE_FLAGS;
1369 mode &= ~MPOL_MODE_FLAGS;
David Rientjesa3b51e02008-04-28 02:12:23 -07001370 if (mode >= MPOL_MAX)
1371 return -EINVAL;
David Rientjes4c50bc02008-04-28 02:12:30 -07001372 if ((mode_flags & MPOL_F_STATIC_NODES) &&
1373 (mode_flags & MPOL_F_RELATIVE_NODES))
1374 return -EINVAL;
Christoph Lameter8bccd852005-10-29 18:16:59 -07001375 err = get_nodes(&nodes, nmask, maxnode);
1376 if (err)
1377 return err;
David Rientjes028fec42008-04-28 02:12:25 -07001378 return do_mbind(start, len, mode, mode_flags, &nodes, flags);
Christoph Lameter8bccd852005-10-29 18:16:59 -07001379}
1380
1381/* Set the process memory policy */
Heiko Carstens938bb9f2009-01-14 14:14:30 +01001382SYSCALL_DEFINE3(set_mempolicy, int, mode, unsigned long __user *, nmask,
1383 unsigned long, maxnode)
Christoph Lameter8bccd852005-10-29 18:16:59 -07001384{
1385 int err;
1386 nodemask_t nodes;
David Rientjes028fec42008-04-28 02:12:25 -07001387 unsigned short flags;
Christoph Lameter8bccd852005-10-29 18:16:59 -07001388
David Rientjes028fec42008-04-28 02:12:25 -07001389 flags = mode & MPOL_MODE_FLAGS;
1390 mode &= ~MPOL_MODE_FLAGS;
1391 if ((unsigned int)mode >= MPOL_MAX)
Christoph Lameter8bccd852005-10-29 18:16:59 -07001392 return -EINVAL;
David Rientjes4c50bc02008-04-28 02:12:30 -07001393 if ((flags & MPOL_F_STATIC_NODES) && (flags & MPOL_F_RELATIVE_NODES))
1394 return -EINVAL;
Christoph Lameter8bccd852005-10-29 18:16:59 -07001395 err = get_nodes(&nodes, nmask, maxnode);
1396 if (err)
1397 return err;
David Rientjes028fec42008-04-28 02:12:25 -07001398 return do_set_mempolicy(mode, flags, &nodes);
Christoph Lameter8bccd852005-10-29 18:16:59 -07001399}
1400
Heiko Carstens938bb9f2009-01-14 14:14:30 +01001401SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
1402 const unsigned long __user *, old_nodes,
1403 const unsigned long __user *, new_nodes)
Christoph Lameter39743882006-01-08 01:00:51 -08001404{
David Howellsc69e8d92008-11-14 10:39:19 +11001405 const struct cred *cred = current_cred(), *tcred;
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001406 struct mm_struct *mm = NULL;
Christoph Lameter39743882006-01-08 01:00:51 -08001407 struct task_struct *task;
Christoph Lameter39743882006-01-08 01:00:51 -08001408 nodemask_t task_nodes;
1409 int err;
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001410 nodemask_t *old;
1411 nodemask_t *new;
1412 NODEMASK_SCRATCH(scratch);
Christoph Lameter39743882006-01-08 01:00:51 -08001413
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001414 if (!scratch)
1415 return -ENOMEM;
Christoph Lameter39743882006-01-08 01:00:51 -08001416
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001417 old = &scratch->mask1;
1418 new = &scratch->mask2;
1419
1420 err = get_nodes(old, old_nodes, maxnode);
Christoph Lameter39743882006-01-08 01:00:51 -08001421 if (err)
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001422 goto out;
1423
1424 err = get_nodes(new, new_nodes, maxnode);
1425 if (err)
1426 goto out;
Christoph Lameter39743882006-01-08 01:00:51 -08001427
1428 /* Find the mm_struct */
Zeng Zhaoming55cfaa32010-12-02 14:31:13 -08001429 rcu_read_lock();
Pavel Emelyanov228ebcb2007-10-18 23:40:16 -07001430 task = pid ? find_task_by_vpid(pid) : current;
Christoph Lameter39743882006-01-08 01:00:51 -08001431 if (!task) {
Zeng Zhaoming55cfaa32010-12-02 14:31:13 -08001432 rcu_read_unlock();
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001433 err = -ESRCH;
1434 goto out;
Christoph Lameter39743882006-01-08 01:00:51 -08001435 }
Christoph Lameter3268c632012-03-21 16:34:06 -07001436 get_task_struct(task);
Christoph Lameter39743882006-01-08 01:00:51 -08001437
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001438 err = -EINVAL;
Christoph Lameter39743882006-01-08 01:00:51 -08001439
1440 /*
1441 * Check if this process has the right to modify the specified
1442 * process. The right exists if the process has administrative
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08001443 * capabilities, superuser privileges or the same
Christoph Lameter39743882006-01-08 01:00:51 -08001444 * userid as the target process.
1445 */
David Howellsc69e8d92008-11-14 10:39:19 +11001446 tcred = __task_cred(task);
Eric W. Biedermanb38a86e2012-03-12 15:48:24 -07001447 if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) &&
1448 !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) &&
Christoph Lameter74c00242006-03-14 19:50:21 -08001449 !capable(CAP_SYS_NICE)) {
David Howellsc69e8d92008-11-14 10:39:19 +11001450 rcu_read_unlock();
Christoph Lameter39743882006-01-08 01:00:51 -08001451 err = -EPERM;
Christoph Lameter3268c632012-03-21 16:34:06 -07001452 goto out_put;
Christoph Lameter39743882006-01-08 01:00:51 -08001453 }
David Howellsc69e8d92008-11-14 10:39:19 +11001454 rcu_read_unlock();
Christoph Lameter39743882006-01-08 01:00:51 -08001455
1456 task_nodes = cpuset_mems_allowed(task);
1457 /* Is the user allowed to access the target nodes? */
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001458 if (!nodes_subset(*new, task_nodes) && !capable(CAP_SYS_NICE)) {
Christoph Lameter39743882006-01-08 01:00:51 -08001459 err = -EPERM;
Christoph Lameter3268c632012-03-21 16:34:06 -07001460 goto out_put;
Christoph Lameter39743882006-01-08 01:00:51 -08001461 }
1462
Lai Jiangshan01f13bd2012-12-12 13:51:33 -08001463 if (!nodes_subset(*new, node_states[N_MEMORY])) {
Christoph Lameter3b42d282007-08-31 00:12:08 -07001464 err = -EINVAL;
Christoph Lameter3268c632012-03-21 16:34:06 -07001465 goto out_put;
Christoph Lameter3b42d282007-08-31 00:12:08 -07001466 }
1467
David Quigley86c3a762006-06-23 02:04:02 -07001468 err = security_task_movememory(task);
1469 if (err)
Christoph Lameter3268c632012-03-21 16:34:06 -07001470 goto out_put;
David Quigley86c3a762006-06-23 02:04:02 -07001471
Christoph Lameter3268c632012-03-21 16:34:06 -07001472 mm = get_task_mm(task);
1473 put_task_struct(task);
Sasha Levinf2a9ef82012-04-25 16:01:52 -07001474
1475 if (!mm) {
Christoph Lameter3268c632012-03-21 16:34:06 -07001476 err = -EINVAL;
Sasha Levinf2a9ef82012-04-25 16:01:52 -07001477 goto out;
1478 }
1479
1480 err = do_migrate_pages(mm, old, new,
1481 capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE);
Christoph Lameter3268c632012-03-21 16:34:06 -07001482
1483 mmput(mm);
1484out:
KOSAKI Motohiro596d7cf2010-08-09 17:19:01 -07001485 NODEMASK_SCRATCH_FREE(scratch);
1486
Christoph Lameter39743882006-01-08 01:00:51 -08001487 return err;
Christoph Lameter3268c632012-03-21 16:34:06 -07001488
1489out_put:
1490 put_task_struct(task);
1491 goto out;
1492
Christoph Lameter39743882006-01-08 01:00:51 -08001493}
1494
1495
Christoph Lameter8bccd852005-10-29 18:16:59 -07001496/* Retrieve NUMA policy */
Heiko Carstens938bb9f2009-01-14 14:14:30 +01001497SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
1498 unsigned long __user *, nmask, unsigned long, maxnode,
1499 unsigned long, addr, unsigned long, flags)
Christoph Lameter8bccd852005-10-29 18:16:59 -07001500{
Adrian Bunkdbcb0f12007-10-16 01:26:26 -07001501 int err;
1502 int uninitialized_var(pval);
Christoph Lameter8bccd852005-10-29 18:16:59 -07001503 nodemask_t nodes;
1504
1505 if (nmask != NULL && maxnode < MAX_NUMNODES)
1506 return -EINVAL;
1507
1508 err = do_get_mempolicy(&pval, &nodes, addr, flags);
1509
1510 if (err)
1511 return err;
1512
1513 if (policy && put_user(pval, policy))
1514 return -EFAULT;
1515
1516 if (nmask)
1517 err = copy_nodes_to_user(nmask, maxnode, &nodes);
1518
1519 return err;
1520}
1521
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522#ifdef CONFIG_COMPAT
1523
1524asmlinkage long compat_sys_get_mempolicy(int __user *policy,
1525 compat_ulong_t __user *nmask,
1526 compat_ulong_t maxnode,
1527 compat_ulong_t addr, compat_ulong_t flags)
1528{
1529 long err;
1530 unsigned long __user *nm = NULL;
1531 unsigned long nr_bits, alloc_size;
1532 DECLARE_BITMAP(bm, MAX_NUMNODES);
1533
1534 nr_bits = min_t(unsigned long, maxnode-1, MAX_NUMNODES);
1535 alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
1536
1537 if (nmask)
1538 nm = compat_alloc_user_space(alloc_size);
1539
1540 err = sys_get_mempolicy(policy, nm, nr_bits+1, addr, flags);
1541
1542 if (!err && nmask) {
KAMEZAWA Hiroyuki2bbff6c2011-09-14 16:21:02 -07001543 unsigned long copy_size;
1544 copy_size = min_t(unsigned long, sizeof(bm), alloc_size);
1545 err = copy_from_user(bm, nm, copy_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546 /* ensure entire bitmap is zeroed */
1547 err |= clear_user(nmask, ALIGN(maxnode-1, 8) / 8);
1548 err |= compat_put_bitmap(nmask, bm, nr_bits);
1549 }
1550
1551 return err;
1552}
1553
1554asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
1555 compat_ulong_t maxnode)
1556{
1557 long err = 0;
1558 unsigned long __user *nm = NULL;
1559 unsigned long nr_bits, alloc_size;
1560 DECLARE_BITMAP(bm, MAX_NUMNODES);
1561
1562 nr_bits = min_t(unsigned long, maxnode-1, MAX_NUMNODES);
1563 alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
1564
1565 if (nmask) {
1566 err = compat_get_bitmap(bm, nmask, nr_bits);
1567 nm = compat_alloc_user_space(alloc_size);
1568 err |= copy_to_user(nm, bm, alloc_size);
1569 }
1570
1571 if (err)
1572 return -EFAULT;
1573
1574 return sys_set_mempolicy(mode, nm, nr_bits+1);
1575}
1576
1577asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len,
1578 compat_ulong_t mode, compat_ulong_t __user *nmask,
1579 compat_ulong_t maxnode, compat_ulong_t flags)
1580{
1581 long err = 0;
1582 unsigned long __user *nm = NULL;
1583 unsigned long nr_bits, alloc_size;
Andi Kleendfcd3c02005-10-29 18:15:48 -07001584 nodemask_t bm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585
1586 nr_bits = min_t(unsigned long, maxnode-1, MAX_NUMNODES);
1587 alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
1588
1589 if (nmask) {
Andi Kleendfcd3c02005-10-29 18:15:48 -07001590 err = compat_get_bitmap(nodes_addr(bm), nmask, nr_bits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 nm = compat_alloc_user_space(alloc_size);
Andi Kleendfcd3c02005-10-29 18:15:48 -07001592 err |= copy_to_user(nm, nodes_addr(bm), alloc_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 }
1594
1595 if (err)
1596 return -EFAULT;
1597
1598 return sys_mbind(start, len, mode, nm, nr_bits+1, flags);
1599}
1600
1601#endif
1602
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001603/*
1604 * get_vma_policy(@task, @vma, @addr)
1605 * @task - task for fallback if vma policy == default
1606 * @vma - virtual memory area whose policy is sought
1607 * @addr - address in @vma for shared policy lookup
1608 *
1609 * Returns effective policy for a VMA at specified address.
1610 * Falls back to @task or system default policy, as necessary.
David Rientjes32f85162012-10-16 17:31:23 -07001611 * Current or other task's task mempolicy and non-shared vma policies must be
1612 * protected by task_lock(task) by the caller.
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001613 * Shared policies [those marked as MPOL_F_SHARED] require an extra reference
1614 * count--added by the get_policy() vm_op, as appropriate--to protect against
1615 * freeing by another task. It is the caller's responsibility to free the
1616 * extra reference for shared policies.
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001617 */
Stephen Wilsond98f6cb2011-05-24 17:12:41 -07001618struct mempolicy *get_vma_policy(struct task_struct *task,
Christoph Lameter48fce342006-01-08 01:01:03 -08001619 struct vm_area_struct *vma, unsigned long addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620{
Mel Gorman5606e382012-11-02 18:19:13 +00001621 struct mempolicy *pol = get_task_policy(task);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622
1623 if (vma) {
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001624 if (vma->vm_ops && vma->vm_ops->get_policy) {
Lee Schermerhornae4d8c12008-04-28 02:13:11 -07001625 struct mempolicy *vpol = vma->vm_ops->get_policy(vma,
1626 addr);
1627 if (vpol)
1628 pol = vpol;
Mel Gorman00442ad2012-10-08 16:29:20 -07001629 } else if (vma->vm_policy) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630 pol = vma->vm_policy;
Mel Gorman00442ad2012-10-08 16:29:20 -07001631
1632 /*
1633 * shmem_alloc_page() passes MPOL_F_SHARED policy with
1634 * a pseudo vma whose vma->vm_ops=NULL. Take a reference
1635 * count on these policies which will be dropped by
1636 * mpol_cond_put() later
1637 */
1638 if (mpol_needs_cond_ref(pol))
1639 mpol_get(pol);
1640 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641 }
1642 if (!pol)
1643 pol = &default_policy;
1644 return pol;
1645}
1646
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001647/*
1648 * Return a nodemask representing a mempolicy for filtering nodes for
1649 * page allocation
1650 */
1651static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)
Mel Gorman19770b32008-04-28 02:12:18 -07001652{
1653 /* Lower zones don't get a nodemask applied for MPOL_BIND */
Lee Schermerhorn45c47452008-04-28 02:13:12 -07001654 if (unlikely(policy->mode == MPOL_BIND) &&
Mel Gorman19770b32008-04-28 02:12:18 -07001655 gfp_zone(gfp) >= policy_zone &&
1656 cpuset_nodemask_valid_mems_allowed(&policy->v.nodes))
1657 return &policy->v.nodes;
1658
1659 return NULL;
1660}
1661
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001662/* Return a zonelist indicated by gfp for node representing a mempolicy */
Andi Kleen2f5f9482011-03-04 17:36:29 -08001663static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy,
1664 int nd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665{
Lee Schermerhorn45c47452008-04-28 02:13:12 -07001666 switch (policy->mode) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001667 case MPOL_PREFERRED:
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -07001668 if (!(policy->flags & MPOL_F_LOCAL))
1669 nd = policy->v.preferred_node;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670 break;
1671 case MPOL_BIND:
Mel Gorman19770b32008-04-28 02:12:18 -07001672 /*
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001673 * Normally, MPOL_BIND allocations are node-local within the
1674 * allowed nodemask. However, if __GFP_THISNODE is set and the
Bob Liu6eb27e12010-05-24 14:32:00 -07001675 * current node isn't part of the mask, we use the zonelist for
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001676 * the first node in the mask instead.
Mel Gorman19770b32008-04-28 02:12:18 -07001677 */
Mel Gorman19770b32008-04-28 02:12:18 -07001678 if (unlikely(gfp & __GFP_THISNODE) &&
1679 unlikely(!node_isset(nd, policy->v.nodes)))
1680 nd = first_node(policy->v.nodes);
1681 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 BUG();
1684 }
Mel Gorman0e884602008-04-28 02:12:14 -07001685 return node_zonelist(nd, gfp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686}
1687
1688/* Do dynamic interleaving for a process */
1689static unsigned interleave_nodes(struct mempolicy *policy)
1690{
1691 unsigned nid, next;
1692 struct task_struct *me = current;
1693
1694 nid = me->il_next;
Andi Kleendfcd3c02005-10-29 18:15:48 -07001695 next = next_node(nid, policy->v.nodes);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696 if (next >= MAX_NUMNODES)
Andi Kleendfcd3c02005-10-29 18:15:48 -07001697 next = first_node(policy->v.nodes);
David Rientjesf5b087b2008-04-28 02:12:27 -07001698 if (next < MAX_NUMNODES)
1699 me->il_next = next;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 return nid;
1701}
1702
Christoph Lameterdc85da12006-01-18 17:42:36 -08001703/*
1704 * Depending on the memory policy provide a node from which to allocate the
1705 * next slab entry.
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001706 * @policy must be protected by freeing by the caller. If @policy is
1707 * the current task's mempolicy, this protection is implicit, as only the
1708 * task can change it's policy. The system default policy requires no
1709 * such protection.
Christoph Lameterdc85da12006-01-18 17:42:36 -08001710 */
Andi Kleene7b691b2012-06-09 02:40:03 -07001711unsigned slab_node(void)
Christoph Lameterdc85da12006-01-18 17:42:36 -08001712{
Andi Kleene7b691b2012-06-09 02:40:03 -07001713 struct mempolicy *policy;
1714
1715 if (in_interrupt())
1716 return numa_node_id();
1717
1718 policy = current->mempolicy;
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -07001719 if (!policy || policy->flags & MPOL_F_LOCAL)
Lee Schermerhornbea904d2008-04-28 02:13:18 -07001720 return numa_node_id();
Christoph Lameter765c4502006-09-27 01:50:08 -07001721
Lee Schermerhornbea904d2008-04-28 02:13:18 -07001722 switch (policy->mode) {
1723 case MPOL_PREFERRED:
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -07001724 /*
1725 * handled MPOL_F_LOCAL above
1726 */
1727 return policy->v.preferred_node;
Lee Schermerhornbea904d2008-04-28 02:13:18 -07001728
Christoph Lameterdc85da12006-01-18 17:42:36 -08001729 case MPOL_INTERLEAVE:
1730 return interleave_nodes(policy);
1731
Mel Gormandd1a2392008-04-28 02:12:17 -07001732 case MPOL_BIND: {
Christoph Lameterdc85da12006-01-18 17:42:36 -08001733 /*
1734 * Follow bind policy behavior and start allocation at the
1735 * first node.
1736 */
Mel Gorman19770b32008-04-28 02:12:18 -07001737 struct zonelist *zonelist;
1738 struct zone *zone;
1739 enum zone_type highest_zoneidx = gfp_zone(GFP_KERNEL);
1740 zonelist = &NODE_DATA(numa_node_id())->node_zonelists[0];
1741 (void)first_zones_zonelist(zonelist, highest_zoneidx,
1742 &policy->v.nodes,
1743 &zone);
Eric Dumazet800416f2010-10-27 19:33:43 +02001744 return zone ? zone->node : numa_node_id();
Mel Gormandd1a2392008-04-28 02:12:17 -07001745 }
Christoph Lameterdc85da12006-01-18 17:42:36 -08001746
Christoph Lameterdc85da12006-01-18 17:42:36 -08001747 default:
Lee Schermerhornbea904d2008-04-28 02:13:18 -07001748 BUG();
Christoph Lameterdc85da12006-01-18 17:42:36 -08001749 }
1750}
1751
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752/* Do static interleaving for a VMA with known offset. */
1753static unsigned offset_il_node(struct mempolicy *pol,
1754 struct vm_area_struct *vma, unsigned long off)
1755{
Andi Kleendfcd3c02005-10-29 18:15:48 -07001756 unsigned nnodes = nodes_weight(pol->v.nodes);
David Rientjesf5b087b2008-04-28 02:12:27 -07001757 unsigned target;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758 int c;
1759 int nid = -1;
1760
David Rientjesf5b087b2008-04-28 02:12:27 -07001761 if (!nnodes)
1762 return numa_node_id();
1763 target = (unsigned int)off % nnodes;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764 c = 0;
1765 do {
Andi Kleendfcd3c02005-10-29 18:15:48 -07001766 nid = next_node(nid, pol->v.nodes);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767 c++;
1768 } while (c <= target);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 return nid;
1770}
1771
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001772/* Determine a node number for interleave */
1773static inline unsigned interleave_nid(struct mempolicy *pol,
1774 struct vm_area_struct *vma, unsigned long addr, int shift)
1775{
1776 if (vma) {
1777 unsigned long off;
1778
Nishanth Aravamudan3b98b082006-08-31 21:27:53 -07001779 /*
1780 * for small pages, there is no difference between
1781 * shift and PAGE_SHIFT, so the bit-shift is safe.
1782 * for huge pages, since vm_pgoff is in units of small
1783 * pages, we need to shift off the always 0 bits to get
1784 * a useful offset.
1785 */
1786 BUG_ON(shift < PAGE_SHIFT);
1787 off = vma->vm_pgoff >> (shift - PAGE_SHIFT);
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001788 off += (addr - vma->vm_start) >> shift;
1789 return offset_il_node(pol, vma, off);
1790 } else
1791 return interleave_nodes(pol);
1792}
1793
Michal Hocko778d3b02011-07-26 16:08:30 -07001794/*
1795 * Return the bit number of a random bit set in the nodemask.
1796 * (returns -1 if nodemask is empty)
1797 */
1798int node_random(const nodemask_t *maskp)
1799{
1800 int w, bit = -1;
1801
1802 w = nodes_weight(*maskp);
1803 if (w)
1804 bit = bitmap_ord_to_pos(maskp->bits,
1805 get_random_int() % w, MAX_NUMNODES);
1806 return bit;
1807}
1808
Chen, Kenneth W00ac59a2006-02-03 21:51:14 +01001809#ifdef CONFIG_HUGETLBFS
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001810/*
1811 * huge_zonelist(@vma, @addr, @gfp_flags, @mpol)
1812 * @vma = virtual memory area whose policy is sought
1813 * @addr = address in @vma for shared policy lookup and interleave policy
1814 * @gfp_flags = for requested zone
Mel Gorman19770b32008-04-28 02:12:18 -07001815 * @mpol = pointer to mempolicy pointer for reference counted mempolicy
1816 * @nodemask = pointer to nodemask pointer for MPOL_BIND nodemask
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001817 *
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001818 * Returns a zonelist suitable for a huge page allocation and a pointer
1819 * to the struct mempolicy for conditional unref after allocation.
1820 * If the effective policy is 'BIND, returns a pointer to the mempolicy's
1821 * @nodemask for filtering the zonelist.
Miao Xiec0ff7452010-05-24 14:32:08 -07001822 *
1823 * Must be protected by get_mems_allowed()
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001824 */
Mel Gorman396faf02007-07-17 04:03:13 -07001825struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr,
Mel Gorman19770b32008-04-28 02:12:18 -07001826 gfp_t gfp_flags, struct mempolicy **mpol,
1827 nodemask_t **nodemask)
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001828{
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001829 struct zonelist *zl;
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001830
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001831 *mpol = get_vma_policy(current, vma, addr);
Mel Gorman19770b32008-04-28 02:12:18 -07001832 *nodemask = NULL; /* assume !MPOL_BIND */
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001833
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001834 if (unlikely((*mpol)->mode == MPOL_INTERLEAVE)) {
1835 zl = node_zonelist(interleave_nid(*mpol, vma, addr,
Andi Kleena5516432008-07-23 21:27:41 -07001836 huge_page_shift(hstate_vma(vma))), gfp_flags);
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001837 } else {
Andi Kleen2f5f9482011-03-04 17:36:29 -08001838 zl = policy_zonelist(gfp_flags, *mpol, numa_node_id());
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001839 if ((*mpol)->mode == MPOL_BIND)
1840 *nodemask = &(*mpol)->v.nodes;
Lee Schermerhorn480eccf2007-09-18 22:46:47 -07001841 }
1842 return zl;
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001843}
Lee Schermerhorn06808b02009-12-14 17:58:21 -08001844
1845/*
1846 * init_nodemask_of_mempolicy
1847 *
1848 * If the current task's mempolicy is "default" [NULL], return 'false'
1849 * to indicate default policy. Otherwise, extract the policy nodemask
1850 * for 'bind' or 'interleave' policy into the argument nodemask, or
1851 * initialize the argument nodemask to contain the single node for
1852 * 'preferred' or 'local' policy and return 'true' to indicate presence
1853 * of non-default mempolicy.
1854 *
1855 * We don't bother with reference counting the mempolicy [mpol_get/put]
1856 * because the current task is examining it's own mempolicy and a task's
1857 * mempolicy is only ever changed by the task itself.
1858 *
1859 * N.B., it is the caller's responsibility to free a returned nodemask.
1860 */
1861bool init_nodemask_of_mempolicy(nodemask_t *mask)
1862{
1863 struct mempolicy *mempolicy;
1864 int nid;
1865
1866 if (!(mask && current->mempolicy))
1867 return false;
1868
Miao Xiec0ff7452010-05-24 14:32:08 -07001869 task_lock(current);
Lee Schermerhorn06808b02009-12-14 17:58:21 -08001870 mempolicy = current->mempolicy;
1871 switch (mempolicy->mode) {
1872 case MPOL_PREFERRED:
1873 if (mempolicy->flags & MPOL_F_LOCAL)
1874 nid = numa_node_id();
1875 else
1876 nid = mempolicy->v.preferred_node;
1877 init_nodemask_of_node(mask, nid);
1878 break;
1879
1880 case MPOL_BIND:
1881 /* Fall through */
1882 case MPOL_INTERLEAVE:
1883 *mask = mempolicy->v.nodes;
1884 break;
1885
1886 default:
1887 BUG();
1888 }
Miao Xiec0ff7452010-05-24 14:32:08 -07001889 task_unlock(current);
Lee Schermerhorn06808b02009-12-14 17:58:21 -08001890
1891 return true;
1892}
Chen, Kenneth W00ac59a2006-02-03 21:51:14 +01001893#endif
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001894
David Rientjes6f48d0eb2010-08-09 17:18:52 -07001895/*
1896 * mempolicy_nodemask_intersects
1897 *
1898 * If tsk's mempolicy is "default" [NULL], return 'true' to indicate default
1899 * policy. Otherwise, check for intersection between mask and the policy
1900 * nodemask for 'bind' or 'interleave' policy. For 'perferred' or 'local'
1901 * policy, always return true since it may allocate elsewhere on fallback.
1902 *
1903 * Takes task_lock(tsk) to prevent freeing of its mempolicy.
1904 */
1905bool mempolicy_nodemask_intersects(struct task_struct *tsk,
1906 const nodemask_t *mask)
1907{
1908 struct mempolicy *mempolicy;
1909 bool ret = true;
1910
1911 if (!mask)
1912 return ret;
1913 task_lock(tsk);
1914 mempolicy = tsk->mempolicy;
1915 if (!mempolicy)
1916 goto out;
1917
1918 switch (mempolicy->mode) {
1919 case MPOL_PREFERRED:
1920 /*
1921 * MPOL_PREFERRED and MPOL_F_LOCAL are only preferred nodes to
1922 * allocate from, they may fallback to other nodes when oom.
1923 * Thus, it's possible for tsk to have allocated memory from
1924 * nodes in mask.
1925 */
1926 break;
1927 case MPOL_BIND:
1928 case MPOL_INTERLEAVE:
1929 ret = nodes_intersects(mempolicy->v.nodes, *mask);
1930 break;
1931 default:
1932 BUG();
1933 }
1934out:
1935 task_unlock(tsk);
1936 return ret;
1937}
1938
Linus Torvalds1da177e2005-04-16 15:20:36 -07001939/* Allocate a page in interleaved policy.
1940 Own path because it needs to do special accounting. */
Andi Kleen662f3a02005-10-29 18:15:49 -07001941static struct page *alloc_page_interleave(gfp_t gfp, unsigned order,
1942 unsigned nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943{
1944 struct zonelist *zl;
1945 struct page *page;
1946
Mel Gorman0e884602008-04-28 02:12:14 -07001947 zl = node_zonelist(nid, gfp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 page = __alloc_pages(gfp, order, zl);
Mel Gormandd1a2392008-04-28 02:12:17 -07001949 if (page && page_zone(page) == zonelist_zone(&zl->_zonerefs[0]))
Christoph Lameterca889e62006-06-30 01:55:44 -07001950 inc_zone_page_state(page, NUMA_INTERLEAVE_HIT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 return page;
1952}
1953
1954/**
Andrea Arcangeli0bbbc0b2011-01-13 15:47:05 -08001955 * alloc_pages_vma - Allocate a page for a VMA.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001956 *
1957 * @gfp:
1958 * %GFP_USER user allocation.
1959 * %GFP_KERNEL kernel allocations,
1960 * %GFP_HIGHMEM highmem/user allocations,
1961 * %GFP_FS allocation should not call back into a file system.
1962 * %GFP_ATOMIC don't sleep.
1963 *
Andrea Arcangeli0bbbc0b2011-01-13 15:47:05 -08001964 * @order:Order of the GFP allocation.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 * @vma: Pointer to VMA or NULL if not available.
1966 * @addr: Virtual Address of the allocation. Must be inside the VMA.
1967 *
1968 * This function allocates a page from the kernel page pool and applies
1969 * a NUMA policy associated with the VMA or the current process.
1970 * When VMA is not NULL caller must hold down_read on the mmap_sem of the
1971 * mm_struct of the VMA to prevent it from going away. Should be used for
1972 * all allocations for pages that will be mapped into
1973 * user space. Returns NULL when no page can be allocated.
1974 *
1975 * Should be called with the mm_sem of the vma hold.
1976 */
1977struct page *
Andrea Arcangeli0bbbc0b2011-01-13 15:47:05 -08001978alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,
Andi Kleen2f5f9482011-03-04 17:36:29 -08001979 unsigned long addr, int node)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980{
Mel Gormancc9a6c82012-03-21 16:34:11 -07001981 struct mempolicy *pol;
Miao Xiec0ff7452010-05-24 14:32:08 -07001982 struct page *page;
Mel Gormancc9a6c82012-03-21 16:34:11 -07001983 unsigned int cpuset_mems_cookie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984
Mel Gormancc9a6c82012-03-21 16:34:11 -07001985retry_cpuset:
1986 pol = get_vma_policy(current, vma, addr);
1987 cpuset_mems_cookie = get_mems_allowed();
1988
Lee Schermerhorn45c47452008-04-28 02:13:12 -07001989 if (unlikely(pol->mode == MPOL_INTERLEAVE)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001990 unsigned nid;
Christoph Lameter5da7ca82006-01-06 00:10:46 -08001991
Andi Kleen8eac5632011-02-25 14:44:28 -08001992 nid = interleave_nid(pol, vma, addr, PAGE_SHIFT + order);
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07001993 mpol_cond_put(pol);
Andrea Arcangeli0bbbc0b2011-01-13 15:47:05 -08001994 page = alloc_page_interleave(gfp, order, nid);
Mel Gormancc9a6c82012-03-21 16:34:11 -07001995 if (unlikely(!put_mems_allowed(cpuset_mems_cookie) && !page))
1996 goto retry_cpuset;
1997
Miao Xiec0ff7452010-05-24 14:32:08 -07001998 return page;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 }
David Rientjes212a0a62012-12-11 16:02:51 -08002000 page = __alloc_pages_nodemask(gfp, order,
2001 policy_zonelist(gfp, pol, node),
Andrea Arcangeli0bbbc0b2011-01-13 15:47:05 -08002002 policy_nodemask(gfp, pol));
David Rientjes212a0a62012-12-11 16:02:51 -08002003 if (unlikely(mpol_needs_cond_ref(pol)))
2004 __mpol_put(pol);
Mel Gormancc9a6c82012-03-21 16:34:11 -07002005 if (unlikely(!put_mems_allowed(cpuset_mems_cookie) && !page))
2006 goto retry_cpuset;
Miao Xiec0ff7452010-05-24 14:32:08 -07002007 return page;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008}
2009
2010/**
2011 * alloc_pages_current - Allocate pages.
2012 *
2013 * @gfp:
2014 * %GFP_USER user allocation,
2015 * %GFP_KERNEL kernel allocation,
2016 * %GFP_HIGHMEM highmem allocation,
2017 * %GFP_FS don't call back into a file system.
2018 * %GFP_ATOMIC don't sleep.
2019 * @order: Power of two of allocation size in pages. 0 is a single page.
2020 *
2021 * Allocate a page from the kernel page pool. When not in
2022 * interrupt context and apply the current process NUMA policy.
2023 * Returns NULL when no page can be allocated.
2024 *
Paul Jacksoncf2a473c2006-01-08 01:01:54 -08002025 * Don't call cpuset_update_task_memory_state() unless
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026 * 1) it's ok to take cpuset_sem (can WAIT), and
2027 * 2) allocating for current task (not interrupt).
2028 */
Al Virodd0fc662005-10-07 07:46:04 +01002029struct page *alloc_pages_current(gfp_t gfp, unsigned order)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030{
Mel Gorman5606e382012-11-02 18:19:13 +00002031 struct mempolicy *pol = get_task_policy(current);
Miao Xiec0ff7452010-05-24 14:32:08 -07002032 struct page *page;
Mel Gormancc9a6c82012-03-21 16:34:11 -07002033 unsigned int cpuset_mems_cookie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002034
Christoph Lameter9b819d22006-09-25 23:31:40 -07002035 if (!pol || in_interrupt() || (gfp & __GFP_THISNODE))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 pol = &default_policy;
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07002037
Mel Gormancc9a6c82012-03-21 16:34:11 -07002038retry_cpuset:
2039 cpuset_mems_cookie = get_mems_allowed();
2040
Lee Schermerhorn52cd3b02008-04-28 02:13:16 -07002041 /*
2042 * No reference counting needed for current->mempolicy
2043 * nor system default_policy
2044 */
Lee Schermerhorn45c47452008-04-28 02:13:12 -07002045 if (pol->mode == MPOL_INTERLEAVE)
Miao Xiec0ff7452010-05-24 14:32:08 -07002046 page = alloc_page_interleave(gfp, order, interleave_nodes(pol));
2047 else
2048 page = __alloc_pages_nodemask(gfp, order,
Andi Kleen5c4b4be2011-03-04 17:36:32 -08002049 policy_zonelist(gfp, pol, numa_node_id()),
2050 policy_nodemask(gfp, pol));
Mel Gormancc9a6c82012-03-21 16:34:11 -07002051
2052 if (unlikely(!put_mems_allowed(cpuset_mems_cookie) && !page))
2053 goto retry_cpuset;
2054
Miao Xiec0ff7452010-05-24 14:32:08 -07002055 return page;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056}
2057EXPORT_SYMBOL(alloc_pages_current);
2058
Paul Jackson42253992006-01-08 01:01:59 -08002059/*
Lee Schermerhorn846a16b2008-04-28 02:13:09 -07002060 * If mpol_dup() sees current->cpuset == cpuset_being_rebound, then it
Paul Jackson42253992006-01-08 01:01:59 -08002061 * rebinds the mempolicy its copying by calling mpol_rebind_policy()
2062 * with the mems_allowed returned by cpuset_mems_allowed(). This
2063 * keeps mempolicies cpuset relative after its cpuset moves. See
2064 * further kernel/cpuset.c update_nodemask().
Miao Xie708c1bb2010-05-24 14:32:07 -07002065 *
2066 * current's mempolicy may be rebinded by the other task(the task that changes
2067 * cpuset's mems), so we needn't do rebind work for current task.
Paul Jackson42253992006-01-08 01:01:59 -08002068 */
Paul Jackson42253992006-01-08 01:01:59 -08002069
Lee Schermerhorn846a16b2008-04-28 02:13:09 -07002070/* Slow path of a mempolicy duplicate */
2071struct mempolicy *__mpol_dup(struct mempolicy *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072{
2073 struct mempolicy *new = kmem_cache_alloc(policy_cache, GFP_KERNEL);
2074
2075 if (!new)
2076 return ERR_PTR(-ENOMEM);
Miao Xie708c1bb2010-05-24 14:32:07 -07002077
2078 /* task's mempolicy is protected by alloc_lock */
2079 if (old == current->mempolicy) {
2080 task_lock(current);
2081 *new = *old;
2082 task_unlock(current);
2083 } else
2084 *new = *old;
2085
Paul E. McKenney99ee4ca2010-03-03 17:50:17 -08002086 rcu_read_lock();
Paul Jackson42253992006-01-08 01:01:59 -08002087 if (current_cpuset_is_being_rebound()) {
2088 nodemask_t mems = cpuset_mems_allowed(current);
Miao Xie708c1bb2010-05-24 14:32:07 -07002089 if (new->flags & MPOL_F_REBINDING)
2090 mpol_rebind_policy(new, &mems, MPOL_REBIND_STEP2);
2091 else
2092 mpol_rebind_policy(new, &mems, MPOL_REBIND_ONCE);
Paul Jackson42253992006-01-08 01:01:59 -08002093 }
Paul E. McKenney99ee4ca2010-03-03 17:50:17 -08002094 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095 atomic_set(&new->refcnt, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096 return new;
2097}
2098
2099/* Slow path of a mempolicy comparison */
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002100bool __mpol_equal(struct mempolicy *a, struct mempolicy *b)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002101{
2102 if (!a || !b)
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002103 return false;
Lee Schermerhorn45c47452008-04-28 02:13:12 -07002104 if (a->mode != b->mode)
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002105 return false;
Bob Liu19800502010-05-24 14:32:01 -07002106 if (a->flags != b->flags)
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002107 return false;
Bob Liu19800502010-05-24 14:32:01 -07002108 if (mpol_store_user_nodemask(a))
2109 if (!nodes_equal(a->w.user_nodemask, b->w.user_nodemask))
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002110 return false;
Bob Liu19800502010-05-24 14:32:01 -07002111
Lee Schermerhorn45c47452008-04-28 02:13:12 -07002112 switch (a->mode) {
Mel Gorman19770b32008-04-28 02:12:18 -07002113 case MPOL_BIND:
2114 /* Fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115 case MPOL_INTERLEAVE:
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002116 return !!nodes_equal(a->v.nodes, b->v.nodes);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 case MPOL_PREFERRED:
Namhyung Kim75719662011-03-22 16:33:02 -07002118 return a->v.preferred_node == b->v.preferred_node;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119 default:
2120 BUG();
KOSAKI Motohirofcfb4dc2012-01-10 15:08:21 -08002121 return false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122 }
2123}
2124
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126 * Shared memory backing store policy support.
2127 *
2128 * Remember policies even when nobody has shared memory mapped.
2129 * The policies are kept in Red-Black tree linked from the inode.
2130 * They are protected by the sp->lock spinlock, which should be held
2131 * for any accesses to the tree.
2132 */
2133
2134/* lookup first element intersecting start-end */
Mel Gormanb22d1272012-10-08 16:29:17 -07002135/* Caller holds sp->mutex */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136static struct sp_node *
2137sp_lookup(struct shared_policy *sp, unsigned long start, unsigned long end)
2138{
2139 struct rb_node *n = sp->root.rb_node;
2140
2141 while (n) {
2142 struct sp_node *p = rb_entry(n, struct sp_node, nd);
2143
2144 if (start >= p->end)
2145 n = n->rb_right;
2146 else if (end <= p->start)
2147 n = n->rb_left;
2148 else
2149 break;
2150 }
2151 if (!n)
2152 return NULL;
2153 for (;;) {
2154 struct sp_node *w = NULL;
2155 struct rb_node *prev = rb_prev(n);
2156 if (!prev)
2157 break;
2158 w = rb_entry(prev, struct sp_node, nd);
2159 if (w->end <= start)
2160 break;
2161 n = prev;
2162 }
2163 return rb_entry(n, struct sp_node, nd);
2164}
2165
2166/* Insert a new shared policy into the list. */
2167/* Caller holds sp->lock */
2168static void sp_insert(struct shared_policy *sp, struct sp_node *new)
2169{
2170 struct rb_node **p = &sp->root.rb_node;
2171 struct rb_node *parent = NULL;
2172 struct sp_node *nd;
2173
2174 while (*p) {
2175 parent = *p;
2176 nd = rb_entry(parent, struct sp_node, nd);
2177 if (new->start < nd->start)
2178 p = &(*p)->rb_left;
2179 else if (new->end > nd->end)
2180 p = &(*p)->rb_right;
2181 else
2182 BUG();
2183 }
2184 rb_link_node(&new->nd, parent, p);
2185 rb_insert_color(&new->nd, &sp->root);
Paul Mundt140d5a42007-07-15 23:38:16 -07002186 pr_debug("inserting %lx-%lx: %d\n", new->start, new->end,
Lee Schermerhorn45c47452008-04-28 02:13:12 -07002187 new->policy ? new->policy->mode : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188}
2189
2190/* Find shared policy intersecting idx */
2191struct mempolicy *
2192mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx)
2193{
2194 struct mempolicy *pol = NULL;
2195 struct sp_node *sn;
2196
2197 if (!sp->root.rb_node)
2198 return NULL;
Mel Gormanb22d1272012-10-08 16:29:17 -07002199 mutex_lock(&sp->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002200 sn = sp_lookup(sp, idx, idx+1);
2201 if (sn) {
2202 mpol_get(sn->policy);
2203 pol = sn->policy;
2204 }
Mel Gormanb22d1272012-10-08 16:29:17 -07002205 mutex_unlock(&sp->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 return pol;
2207}
2208
KOSAKI Motohiro63f74ca2012-10-08 16:29:19 -07002209static void sp_free(struct sp_node *n)
2210{
2211 mpol_put(n->policy);
2212 kmem_cache_free(sn_cache, n);
2213}
2214
Lee Schermerhorn771fb4d2012-10-25 14:16:30 +02002215/**
2216 * mpol_misplaced - check whether current page node is valid in policy
2217 *
2218 * @page - page to be checked
2219 * @vma - vm area where page mapped
2220 * @addr - virtual address where page mapped
2221 *
2222 * Lookup current policy node id for vma,addr and "compare to" page's
2223 * node id.
2224 *
2225 * Returns:
2226 * -1 - not misplaced, page is in the right node
2227 * node - node id where the page should be
2228 *
2229 * Policy determination "mimics" alloc_page_vma().
2230 * Called from fault path where we know the vma and faulting address.
2231 */
2232int mpol_misplaced(struct page *page, struct vm_area_struct *vma, unsigned long addr)
2233{
2234 struct mempolicy *pol;
2235 struct zone *zone;
2236 int curnid = page_to_nid(page);
2237 unsigned long pgoff;
2238 int polnid = -1;
2239 int ret = -1;
2240
2241 BUG_ON(!vma);
2242
2243 pol = get_vma_policy(current, vma, addr);
2244 if (!(pol->flags & MPOL_F_MOF))
2245 goto out;
2246
2247 switch (pol->mode) {
2248 case MPOL_INTERLEAVE:
2249 BUG_ON(addr >= vma->vm_end);
2250 BUG_ON(addr < vma->vm_start);
2251
2252 pgoff = vma->vm_pgoff;
2253 pgoff += (addr - vma->vm_start) >> PAGE_SHIFT;
2254 polnid = offset_il_node(pol, vma, pgoff);
2255 break;
2256
2257 case MPOL_PREFERRED:
2258 if (pol->flags & MPOL_F_LOCAL)
2259 polnid = numa_node_id();
2260 else
2261 polnid = pol->v.preferred_node;
2262 break;
2263
2264 case MPOL_BIND:
2265 /*
2266 * allows binding to multiple nodes.
2267 * use current page if in policy nodemask,
2268 * else select nearest allowed node, if any.
2269 * If no allowed nodes, use current [!misplaced].
2270 */
2271 if (node_isset(curnid, pol->v.nodes))
2272 goto out;
2273 (void)first_zones_zonelist(
2274 node_zonelist(numa_node_id(), GFP_HIGHUSER),
2275 gfp_zone(GFP_HIGHUSER),
2276 &pol->v.nodes, &zone);
2277 polnid = zone->node;
2278 break;
2279
2280 default:
2281 BUG();
2282 }
Mel Gorman5606e382012-11-02 18:19:13 +00002283
2284 /* Migrate the page towards the node whose CPU is referencing it */
Mel Gormane42c8ff2012-11-12 09:17:07 +00002285 if (pol->flags & MPOL_F_MORON) {
2286 int last_nid;
2287
Mel Gorman5606e382012-11-02 18:19:13 +00002288 polnid = numa_node_id();
2289
Mel Gormane42c8ff2012-11-12 09:17:07 +00002290 /*
2291 * Multi-stage node selection is used in conjunction
2292 * with a periodic migration fault to build a temporal
2293 * task<->page relation. By using a two-stage filter we
2294 * remove short/unlikely relations.
2295 *
2296 * Using P(p) ~ n_p / n_t as per frequentist
2297 * probability, we can equate a task's usage of a
2298 * particular page (n_p) per total usage of this
2299 * page (n_t) (in a given time-span) to a probability.
2300 *
2301 * Our periodic faults will sample this probability and
2302 * getting the same result twice in a row, given these
2303 * samples are fully independent, is then given by
2304 * P(n)^2, provided our sample period is sufficiently
2305 * short compared to the usage pattern.
2306 *
2307 * This quadric squishes small probabilities, making
2308 * it less likely we act on an unlikely task<->page
2309 * relation.
2310 */
2311 last_nid = page_xchg_last_nid(page, polnid);
2312 if (last_nid != polnid)
2313 goto out;
2314 }
2315
Lee Schermerhorn771fb4d2012-10-25 14:16:30 +02002316 if (curnid != polnid)
2317 ret = polnid;
2318out:
2319 mpol_cond_put(pol);
2320
2321 return ret;
2322}
2323
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324static void sp_delete(struct shared_policy *sp, struct sp_node *n)
2325{
Paul Mundt140d5a42007-07-15 23:38:16 -07002326 pr_debug("deleting %lx-l%lx\n", n->start, n->end);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327 rb_erase(&n->nd, &sp->root);
KOSAKI Motohiro63f74ca2012-10-08 16:29:19 -07002328 sp_free(n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329}
2330
Adrian Bunkdbcb0f12007-10-16 01:26:26 -07002331static struct sp_node *sp_alloc(unsigned long start, unsigned long end,
2332 struct mempolicy *pol)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333{
KOSAKI Motohiro869833f22012-10-08 16:29:16 -07002334 struct sp_node *n;
2335 struct mempolicy *newpol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002336
KOSAKI Motohiro869833f22012-10-08 16:29:16 -07002337 n = kmem_cache_alloc(sn_cache, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 if (!n)
2339 return NULL;
KOSAKI Motohiro869833f22012-10-08 16:29:16 -07002340
2341 newpol = mpol_dup(pol);
2342 if (IS_ERR(newpol)) {
2343 kmem_cache_free(sn_cache, n);
2344 return NULL;
2345 }
2346 newpol->flags |= MPOL_F_SHARED;
2347
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348 n->start = start;
2349 n->end = end;
KOSAKI Motohiro869833f22012-10-08 16:29:16 -07002350 n->policy = newpol;
2351
Linus Torvalds1da177e2005-04-16 15:20:36 -07002352 return n;
2353}
2354
2355/* Replace a policy range. */
2356static int shared_policy_replace(struct shared_policy *sp, unsigned long start,
2357 unsigned long end, struct sp_node *new)
2358{
Mel Gormanb22d1272012-10-08 16:29:17 -07002359 struct sp_node *n;
2360 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361
Mel Gormanb22d1272012-10-08 16:29:17 -07002362 mutex_lock(&sp->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002363 n = sp_lookup(sp, start, end);
2364 /* Take care of old policies in the same range. */
2365 while (n && n->start < end) {
2366 struct rb_node *next = rb_next(&n->nd);
2367 if (n->start >= start) {
2368 if (n->end <= end)
2369 sp_delete(sp, n);
2370 else
2371 n->start = end;
2372 } else {
2373 /* Old policy spanning whole new range. */
2374 if (n->end > end) {
Mel Gormanb22d1272012-10-08 16:29:17 -07002375 struct sp_node *new2;
2376 new2 = sp_alloc(end, n->end, n->policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002377 if (!new2) {
Mel Gormanb22d1272012-10-08 16:29:17 -07002378 ret = -ENOMEM;
2379 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380 }
2381 n->end = start;
2382 sp_insert(sp, new2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002383 break;
2384 } else
2385 n->end = start;
2386 }
2387 if (!next)
2388 break;
2389 n = rb_entry(next, struct sp_node, nd);
2390 }
2391 if (new)
2392 sp_insert(sp, new);
Mel Gormanb22d1272012-10-08 16:29:17 -07002393out:
2394 mutex_unlock(&sp->mutex);
2395 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396}
2397
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002398/**
2399 * mpol_shared_policy_init - initialize shared policy for inode
2400 * @sp: pointer to inode shared policy
2401 * @mpol: struct mempolicy to install
2402 *
2403 * Install non-NULL @mpol in inode's shared policy rb-tree.
2404 * On entry, the current task has a reference on a non-NULL @mpol.
2405 * This must be released on exit.
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -07002406 * This is called at get_inode() calls and we can use GFP_KERNEL.
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002407 */
2408void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol)
Robin Holt7339ff82006-01-14 13:20:48 -08002409{
Miao Xie58568d22009-06-16 15:31:49 -07002410 int ret;
2411
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002412 sp->root = RB_ROOT; /* empty tree == default mempolicy */
Mel Gormanb22d1272012-10-08 16:29:17 -07002413 mutex_init(&sp->mutex);
Robin Holt7339ff82006-01-14 13:20:48 -08002414
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002415 if (mpol) {
2416 struct vm_area_struct pvma;
2417 struct mempolicy *new;
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -07002418 NODEMASK_SCRATCH(scratch);
Robin Holt7339ff82006-01-14 13:20:48 -08002419
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -07002420 if (!scratch)
Lee Schermerhorn5c0c1652010-06-29 15:05:30 -07002421 goto put_mpol;
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002422 /* contextualize the tmpfs mount point mempolicy */
2423 new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask);
Lee Schermerhorn15d77832010-05-24 14:32:04 -07002424 if (IS_ERR(new))
Dan Carpenter0cae3452010-05-25 23:42:58 -07002425 goto free_scratch; /* no valid nodemask intersection */
Miao Xie58568d22009-06-16 15:31:49 -07002426
2427 task_lock(current);
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -07002428 ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch);
Miao Xie58568d22009-06-16 15:31:49 -07002429 task_unlock(current);
Lee Schermerhorn15d77832010-05-24 14:32:04 -07002430 if (ret)
Lee Schermerhorn5c0c1652010-06-29 15:05:30 -07002431 goto put_new;
Robin Holt7339ff82006-01-14 13:20:48 -08002432
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002433 /* Create pseudo-vma that contains just the policy */
2434 memset(&pvma, 0, sizeof(struct vm_area_struct));
2435 pvma.vm_end = TASK_SIZE; /* policy covers entire file */
2436 mpol_set_shared_policy(sp, &pvma, new); /* adds ref */
Lee Schermerhorn15d77832010-05-24 14:32:04 -07002437
Lee Schermerhorn5c0c1652010-06-29 15:05:30 -07002438put_new:
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002439 mpol_put(new); /* drop initial ref */
Dan Carpenter0cae3452010-05-25 23:42:58 -07002440free_scratch:
KAMEZAWA Hiroyuki4bfc4492009-08-06 15:07:33 -07002441 NODEMASK_SCRATCH_FREE(scratch);
Lee Schermerhorn5c0c1652010-06-29 15:05:30 -07002442put_mpol:
2443 mpol_put(mpol); /* drop our incoming ref on sb mpol */
Robin Holt7339ff82006-01-14 13:20:48 -08002444 }
2445}
2446
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447int mpol_set_shared_policy(struct shared_policy *info,
2448 struct vm_area_struct *vma, struct mempolicy *npol)
2449{
2450 int err;
2451 struct sp_node *new = NULL;
2452 unsigned long sz = vma_pages(vma);
2453
David Rientjes028fec42008-04-28 02:12:25 -07002454 pr_debug("set_shared_policy %lx sz %lu %d %d %lx\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455 vma->vm_pgoff,
Lee Schermerhorn45c47452008-04-28 02:13:12 -07002456 sz, npol ? npol->mode : -1,
David Rientjes028fec42008-04-28 02:12:25 -07002457 npol ? npol->flags : -1,
Paul Mundt140d5a42007-07-15 23:38:16 -07002458 npol ? nodes_addr(npol->v.nodes)[0] : -1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459
2460 if (npol) {
2461 new = sp_alloc(vma->vm_pgoff, vma->vm_pgoff + sz, npol);
2462 if (!new)
2463 return -ENOMEM;
2464 }
2465 err = shared_policy_replace(info, vma->vm_pgoff, vma->vm_pgoff+sz, new);
2466 if (err && new)
KOSAKI Motohiro63f74ca2012-10-08 16:29:19 -07002467 sp_free(new);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002468 return err;
2469}
2470
2471/* Free a backing policy store on inode delete. */
2472void mpol_free_shared_policy(struct shared_policy *p)
2473{
2474 struct sp_node *n;
2475 struct rb_node *next;
2476
2477 if (!p->root.rb_node)
2478 return;
Mel Gormanb22d1272012-10-08 16:29:17 -07002479 mutex_lock(&p->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002480 next = rb_first(&p->root);
2481 while (next) {
2482 n = rb_entry(next, struct sp_node, nd);
2483 next = rb_next(&n->nd);
KOSAKI Motohiro63f74ca2012-10-08 16:29:19 -07002484 sp_delete(p, n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002485 }
Mel Gormanb22d1272012-10-08 16:29:17 -07002486 mutex_unlock(&p->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487}
2488
Mel Gorman1a687c22012-11-22 11:16:36 +00002489#ifdef CONFIG_NUMA_BALANCING
2490static bool __initdata numabalancing_override;
2491
2492static void __init check_numabalancing_enable(void)
2493{
2494 bool numabalancing_default = false;
2495
2496 if (IS_ENABLED(CONFIG_NUMA_BALANCING_DEFAULT_ENABLED))
2497 numabalancing_default = true;
2498
2499 if (nr_node_ids > 1 && !numabalancing_override) {
2500 printk(KERN_INFO "Enabling automatic NUMA balancing. "
2501 "Configure with numa_balancing= or sysctl");
2502 set_numabalancing_state(numabalancing_default);
2503 }
2504}
2505
2506static int __init setup_numabalancing(char *str)
2507{
2508 int ret = 0;
2509 if (!str)
2510 goto out;
2511 numabalancing_override = true;
2512
2513 if (!strcmp(str, "enable")) {
2514 set_numabalancing_state(true);
2515 ret = 1;
2516 } else if (!strcmp(str, "disable")) {
2517 set_numabalancing_state(false);
2518 ret = 1;
2519 }
2520out:
2521 if (!ret)
2522 printk(KERN_WARNING "Unable to parse numa_balancing=\n");
2523
2524 return ret;
2525}
2526__setup("numa_balancing=", setup_numabalancing);
2527#else
2528static inline void __init check_numabalancing_enable(void)
2529{
2530}
2531#endif /* CONFIG_NUMA_BALANCING */
2532
Linus Torvalds1da177e2005-04-16 15:20:36 -07002533/* assumes fs == KERNEL_DS */
2534void __init numa_policy_init(void)
2535{
Paul Mundtb71636e2007-07-15 23:38:15 -07002536 nodemask_t interleave_nodes;
2537 unsigned long largest = 0;
2538 int nid, prefer = 0;
2539
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540 policy_cache = kmem_cache_create("numa_policy",
2541 sizeof(struct mempolicy),
Paul Mundt20c2df82007-07-20 10:11:58 +09002542 0, SLAB_PANIC, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002543
2544 sn_cache = kmem_cache_create("shared_policy_node",
2545 sizeof(struct sp_node),
Paul Mundt20c2df82007-07-20 10:11:58 +09002546 0, SLAB_PANIC, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002547
Mel Gorman5606e382012-11-02 18:19:13 +00002548 for_each_node(nid) {
2549 preferred_node_policy[nid] = (struct mempolicy) {
2550 .refcnt = ATOMIC_INIT(1),
2551 .mode = MPOL_PREFERRED,
2552 .flags = MPOL_F_MOF | MPOL_F_MORON,
2553 .v = { .preferred_node = nid, },
2554 };
2555 }
2556
Paul Mundtb71636e2007-07-15 23:38:15 -07002557 /*
2558 * Set interleaving policy for system init. Interleaving is only
2559 * enabled across suitably sized nodes (default is >= 16MB), or
2560 * fall back to the largest node if they're all smaller.
2561 */
2562 nodes_clear(interleave_nodes);
Lai Jiangshan01f13bd2012-12-12 13:51:33 -08002563 for_each_node_state(nid, N_MEMORY) {
Paul Mundtb71636e2007-07-15 23:38:15 -07002564 unsigned long total_pages = node_present_pages(nid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002565
Paul Mundtb71636e2007-07-15 23:38:15 -07002566 /* Preserve the largest node */
2567 if (largest < total_pages) {
2568 largest = total_pages;
2569 prefer = nid;
2570 }
2571
2572 /* Interleave this node? */
2573 if ((total_pages << PAGE_SHIFT) >= (16 << 20))
2574 node_set(nid, interleave_nodes);
2575 }
2576
2577 /* All too small, use the largest */
2578 if (unlikely(nodes_empty(interleave_nodes)))
2579 node_set(prefer, interleave_nodes);
2580
David Rientjes028fec42008-04-28 02:12:25 -07002581 if (do_set_mempolicy(MPOL_INTERLEAVE, 0, &interleave_nodes))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582 printk("numa_policy_init: interleaving failed\n");
Mel Gorman1a687c22012-11-22 11:16:36 +00002583
2584 check_numabalancing_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002585}
2586
Christoph Lameter8bccd852005-10-29 18:16:59 -07002587/* Reset policy of current process to default */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002588void numa_default_policy(void)
2589{
David Rientjes028fec42008-04-28 02:12:25 -07002590 do_set_mempolicy(MPOL_DEFAULT, 0, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002591}
Paul Jackson68860ec2005-10-30 15:02:36 -08002592
Paul Jackson42253992006-01-08 01:01:59 -08002593/*
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002594 * Parse and format mempolicy from/to strings
2595 */
2596
2597/*
Hugh Dickinsf2a07f42013-01-02 02:01:33 -08002598 * "local" is implemented internally by MPOL_PREFERRED with MPOL_F_LOCAL flag.
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002599 */
Lee Schermerhorn345ace92010-05-24 14:32:04 -07002600static const char * const policy_modes[] =
2601{
2602 [MPOL_DEFAULT] = "default",
2603 [MPOL_PREFERRED] = "prefer",
2604 [MPOL_BIND] = "bind",
2605 [MPOL_INTERLEAVE] = "interleave",
Lee Schermerhornd3a71032012-10-25 14:16:29 +02002606 [MPOL_LOCAL] = "local",
Lee Schermerhorn345ace92010-05-24 14:32:04 -07002607};
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002608
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002609
2610#ifdef CONFIG_TMPFS
2611/**
Hugh Dickinsf2a07f42013-01-02 02:01:33 -08002612 * mpol_parse_str - parse string to mempolicy, for tmpfs mpol mount option.
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002613 * @str: string containing mempolicy to parse
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002614 * @mpol: pointer to struct mempolicy pointer, returned on success.
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002615 *
2616 * Format of input:
2617 * <mode>[=<flags>][:<nodelist>]
2618 *
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002619 * On success, returns 0, else 1
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002620 */
Hugh Dickinsa7a88b22013-01-02 02:04:23 -08002621int mpol_parse_str(char *str, struct mempolicy **mpol)
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002622{
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002623 struct mempolicy *new = NULL;
Lee Schermerhornb4652e82010-05-24 14:32:03 -07002624 unsigned short mode;
Hugh Dickinsf2a07f42013-01-02 02:01:33 -08002625 unsigned short mode_flags;
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002626 nodemask_t nodes;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002627 char *nodelist = strchr(str, ':');
2628 char *flags = strchr(str, '=');
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002629 int err = 1;
2630
2631 if (nodelist) {
2632 /* NUL-terminate mode or flags string */
2633 *nodelist++ = '\0';
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002634 if (nodelist_parse(nodelist, nodes))
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002635 goto out;
Lai Jiangshan01f13bd2012-12-12 13:51:33 -08002636 if (!nodes_subset(nodes, node_states[N_MEMORY]))
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002637 goto out;
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002638 } else
2639 nodes_clear(nodes);
2640
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002641 if (flags)
2642 *flags++ = '\0'; /* terminate mode string */
2643
Peter Zijlstra479e2802012-10-25 14:16:28 +02002644 for (mode = 0; mode < MPOL_MAX; mode++) {
Lee Schermerhorn345ace92010-05-24 14:32:04 -07002645 if (!strcmp(str, policy_modes[mode])) {
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002646 break;
2647 }
2648 }
Mel Gormana7200942012-11-16 09:37:58 +00002649 if (mode >= MPOL_MAX)
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002650 goto out;
2651
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002652 switch (mode) {
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002653 case MPOL_PREFERRED:
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002654 /*
2655 * Insist on a nodelist of one node only
2656 */
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002657 if (nodelist) {
2658 char *rest = nodelist;
2659 while (isdigit(*rest))
2660 rest++;
KOSAKI Motohiro926f2ae2010-03-23 13:35:32 -07002661 if (*rest)
2662 goto out;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002663 }
2664 break;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002665 case MPOL_INTERLEAVE:
2666 /*
2667 * Default to online nodes with memory if no nodelist
2668 */
2669 if (!nodelist)
Lai Jiangshan01f13bd2012-12-12 13:51:33 -08002670 nodes = node_states[N_MEMORY];
Lee Schermerhorn3f226aa2008-04-28 02:13:24 -07002671 break;
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002672 case MPOL_LOCAL:
Lee Schermerhorn3f226aa2008-04-28 02:13:24 -07002673 /*
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002674 * Don't allow a nodelist; mpol_new() checks flags
Lee Schermerhorn3f226aa2008-04-28 02:13:24 -07002675 */
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002676 if (nodelist)
Lee Schermerhorn3f226aa2008-04-28 02:13:24 -07002677 goto out;
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002678 mode = MPOL_PREFERRED;
Lee Schermerhorn3f226aa2008-04-28 02:13:24 -07002679 break;
Ravikiran G Thirumalai413b43d2010-03-23 13:35:28 -07002680 case MPOL_DEFAULT:
2681 /*
2682 * Insist on a empty nodelist
2683 */
2684 if (!nodelist)
2685 err = 0;
2686 goto out;
KOSAKI Motohirod69b2e62010-03-23 13:35:30 -07002687 case MPOL_BIND:
2688 /*
2689 * Insist on a nodelist
2690 */
2691 if (!nodelist)
2692 goto out;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002693 }
2694
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002695 mode_flags = 0;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002696 if (flags) {
2697 /*
2698 * Currently, we only support two mutually exclusive
2699 * mode flags.
2700 */
2701 if (!strcmp(flags, "static"))
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002702 mode_flags |= MPOL_F_STATIC_NODES;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002703 else if (!strcmp(flags, "relative"))
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002704 mode_flags |= MPOL_F_RELATIVE_NODES;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002705 else
KOSAKI Motohiro926f2ae2010-03-23 13:35:32 -07002706 goto out;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002707 }
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002708
2709 new = mpol_new(mode, mode_flags, &nodes);
2710 if (IS_ERR(new))
KOSAKI Motohiro926f2ae2010-03-23 13:35:32 -07002711 goto out;
2712
Hugh Dickinsf2a07f42013-01-02 02:01:33 -08002713 /*
2714 * Save nodes for mpol_to_str() to show the tmpfs mount options
2715 * for /proc/mounts, /proc/pid/mounts and /proc/pid/mountinfo.
2716 */
2717 if (mode != MPOL_PREFERRED)
2718 new->v.nodes = nodes;
2719 else if (nodelist)
2720 new->v.preferred_node = first_node(nodes);
2721 else
2722 new->flags |= MPOL_F_LOCAL;
2723
2724 /*
2725 * Save nodes for contextualization: this will be used to "clone"
2726 * the mempolicy in a specific context [cpuset] at a later time.
2727 */
2728 new->w.user_nodemask = nodes;
2729
KOSAKI Motohiro926f2ae2010-03-23 13:35:32 -07002730 err = 0;
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002731
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002732out:
2733 /* Restore string for error message */
2734 if (nodelist)
2735 *--nodelist = ':';
2736 if (flags)
2737 *--flags = '=';
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002738 if (!err)
2739 *mpol = new;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002740 return err;
2741}
2742#endif /* CONFIG_TMPFS */
2743
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002744/**
2745 * mpol_to_str - format a mempolicy structure for printing
2746 * @buffer: to contain formatted mempolicy string
2747 * @maxlen: length of @buffer
2748 * @pol: pointer to mempolicy to be formatted
Lee Schermerhorn71fe8042008-04-28 02:13:26 -07002749 *
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002750 * Convert a mempolicy into a string.
2751 * Returns the number of characters in buffer (if positive)
2752 * or an error (negative)
2753 */
Hugh Dickinsa7a88b22013-01-02 02:04:23 -08002754int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002755{
2756 char *p = buffer;
2757 int l;
2758 nodemask_t nodes;
Lee Schermerhornbea904d2008-04-28 02:13:18 -07002759 unsigned short mode;
David Rientjesf5b087b2008-04-28 02:12:27 -07002760 unsigned short flags = pol ? pol->flags : 0;
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002761
Lee Schermerhorn22919902008-04-28 02:13:22 -07002762 /*
2763 * Sanity check: room for longest mode, flag and some nodes
2764 */
2765 VM_BUG_ON(maxlen < strlen("interleave") + strlen("relative") + 16);
2766
Lee Schermerhornbea904d2008-04-28 02:13:18 -07002767 if (!pol || pol == &default_policy)
2768 mode = MPOL_DEFAULT;
2769 else
2770 mode = pol->mode;
2771
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002772 switch (mode) {
2773 case MPOL_DEFAULT:
2774 nodes_clear(nodes);
2775 break;
2776
2777 case MPOL_PREFERRED:
2778 nodes_clear(nodes);
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -07002779 if (flags & MPOL_F_LOCAL)
Hugh Dickinsf2a07f42013-01-02 02:01:33 -08002780 mode = MPOL_LOCAL;
Lee Schermerhorn53f25562008-04-28 02:13:20 -07002781 else
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -07002782 node_set(pol->v.preferred_node, nodes);
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002783 break;
2784
2785 case MPOL_BIND:
Mel Gorman19770b32008-04-28 02:12:18 -07002786 /* Fall through */
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002787 case MPOL_INTERLEAVE:
Hugh Dickinsf2a07f42013-01-02 02:01:33 -08002788 nodes = pol->v.nodes;
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002789 break;
2790
2791 default:
Dave Jones80de7c32012-09-06 12:01:00 -04002792 return -EINVAL;
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002793 }
2794
Lee Schermerhorn345ace92010-05-24 14:32:04 -07002795 l = strlen(policy_modes[mode]);
Lee Schermerhorn53f25562008-04-28 02:13:20 -07002796 if (buffer + maxlen < p + l + 1)
2797 return -ENOSPC;
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002798
Lee Schermerhorn345ace92010-05-24 14:32:04 -07002799 strcpy(p, policy_modes[mode]);
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002800 p += l;
2801
Lee Schermerhornfc36b8d2008-04-28 02:13:21 -07002802 if (flags & MPOL_MODE_FLAGS) {
David Rientjesf5b087b2008-04-28 02:12:27 -07002803 if (buffer + maxlen < p + 2)
2804 return -ENOSPC;
2805 *p++ = '=';
2806
Lee Schermerhorn22919902008-04-28 02:13:22 -07002807 /*
2808 * Currently, the only defined flags are mutually exclusive
2809 */
David Rientjesf5b087b2008-04-28 02:12:27 -07002810 if (flags & MPOL_F_STATIC_NODES)
Lee Schermerhorn22919902008-04-28 02:13:22 -07002811 p += snprintf(p, buffer + maxlen - p, "static");
2812 else if (flags & MPOL_F_RELATIVE_NODES)
2813 p += snprintf(p, buffer + maxlen - p, "relative");
David Rientjesf5b087b2008-04-28 02:12:27 -07002814 }
2815
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002816 if (!nodes_empty(nodes)) {
2817 if (buffer + maxlen < p + 2)
2818 return -ENOSPC;
Lee Schermerhorn095f1fc2008-04-28 02:13:23 -07002819 *p++ = ':';
Christoph Lameter1a75a6c2006-01-08 01:01:02 -08002820 p += nodelist_scnprintf(p, buffer + maxlen - p, nodes);
2821 }
2822 return p - buffer;
2823}