kernel/resource: make iomem_resource implicit in release_mem_region_adjustable()
[linux-2.6-microblaze.git] / mm / mempolicy.c
index b9e85d4..3fde772 100644 (file)
@@ -129,7 +129,7 @@ static struct mempolicy preferred_node_policy[MAX_NUMNODES];
 
 /**
  * numa_map_to_online_node - Find closest online node
- * @nid: Node id to start the search
+ * @node: Node id to start the search
  *
  * Lookup the next closest node by distance if @nid is not online.
  */
@@ -875,13 +875,12 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags,
                goto out;
        }
 
-       task_lock(current);
        ret = mpol_set_nodemask(new, nodes, scratch);
        if (ret) {
-               task_unlock(current);
                mpol_put(new);
                goto out;
        }
+       task_lock(current);
        old = current->mempolicy;
        current->mempolicy = new;
        if (new && new->mode == MPOL_INTERLEAVE)
@@ -1049,7 +1048,7 @@ static int migrate_page_add(struct page *page, struct list_head *pagelist,
                        list_add_tail(&head->lru, pagelist);
                        mod_node_page_state(page_pgdat(head),
                                NR_ISOLATED_ANON + page_is_file_lru(head),
-                               hpage_nr_pages(head));
+                               thp_nr_pages(head));
                } else if (flags & MPOL_MF_STRICT) {
                        /*
                         * Non-movable page may reach here.  And, there may be
@@ -1065,27 +1064,6 @@ static int migrate_page_add(struct page *page, struct list_head *pagelist,
        return 0;
 }
 
-/* page allocation callback for NUMA node migration */
-struct page *alloc_new_node_page(struct page *page, unsigned long node)
-{
-       if (PageHuge(page))
-               return alloc_huge_page_node(page_hstate(compound_head(page)),
-                                       node);
-       else if (PageTransHuge(page)) {
-               struct page *thp;
-
-               thp = alloc_pages_node(node,
-                       (GFP_TRANSHUGE | __GFP_THISNODE),
-                       HPAGE_PMD_ORDER);
-               if (!thp)
-                       return NULL;
-               prep_transhuge_page(thp);
-               return thp;
-       } else
-               return __alloc_pages_node(node, GFP_HIGHUSER_MOVABLE |
-                                                   __GFP_THISNODE, 0);
-}
-
 /*
  * Migrate pages from one node to a target node.
  * Returns error or the number of pages not migrated.
@@ -1096,6 +1074,10 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest,
        nodemask_t nmask;
        LIST_HEAD(pagelist);
        int err = 0;
+       struct migration_target_control mtc = {
+               .nid = dest,
+               .gfp_mask = GFP_HIGHUSER_MOVABLE | __GFP_THISNODE,
+       };
 
        nodes_clear(nmask);
        node_set(source, nmask);
@@ -1110,8 +1092,8 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest,
                        flags | MPOL_MF_DISCONTIG_OK, &pagelist);
 
        if (!list_empty(&pagelist)) {
-               err = migrate_pages(&pagelist, alloc_new_node_page, NULL, dest,
-                                       MIGRATE_SYNC, MR_SYSCALL);
+               err = migrate_pages(&pagelist, alloc_migration_target, NULL,
+                               (unsigned long)&mtc, MIGRATE_SYNC, MR_SYSCALL);
                if (err)
                        putback_movable_pages(&pagelist);
        }
@@ -1341,9 +1323,7 @@ static long do_mbind(unsigned long start, unsigned long len,
                NODEMASK_SCRATCH(scratch);
                if (scratch) {
                        mmap_write_lock(mm);
-                       task_lock(current);
                        err = mpol_set_nodemask(new, nmask, scratch);
-                       task_unlock(current);
                        if (err)
                                mmap_write_unlock(mm);
                } else
@@ -1632,11 +1612,11 @@ static int kernel_get_mempolicy(int __user *policy,
        int pval;
        nodemask_t nodes;
 
-       addr = untagged_addr(addr);
-
        if (nmask != NULL && maxnode < nr_node_ids)
                return -EINVAL;
 
+       addr = untagged_addr(addr);
+
        err = do_get_mempolicy(&pval, &nodes, addr, flags);
 
        if (err)
@@ -1890,7 +1870,7 @@ static int apply_policy_zone(struct mempolicy *policy, enum zone_type zone)
  * Return a nodemask representing a mempolicy for filtering nodes for
  * page allocation
  */
-static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)
+nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)
 {
        /* Lower zones don't get a nodemask applied for MPOL_BIND */
        if (unlikely(policy->mode == MPOL_BIND) &&
@@ -1902,8 +1882,7 @@ static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)
 }
 
 /* Return the node id preferred by the given mempolicy, or the given id */
-static int policy_node(gfp_t gfp, struct mempolicy *policy,
-                                                               int nd)
+static int policy_node(gfp_t gfp, struct mempolicy *policy, int nd)
 {
        if (policy->mode == MPOL_PREFERRED && !(policy->flags & MPOL_F_LOCAL))
                nd = policy->v.preferred_node;