diff options
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/hugetlb.c | 2 | ||||
| -rw-r--r-- | mm/kmemleak.c | 4 | ||||
| -rw-r--r-- | mm/memcontrol.c | 23 | ||||
| -rw-r--r-- | mm/memory.c | 11 | ||||
| -rw-r--r-- | mm/mempolicy.c | 84 | ||||
| -rw-r--r-- | mm/mempool.c | 4 | ||||
| -rw-r--r-- | mm/page_alloc.c | 21 | ||||
| -rw-r--r-- | mm/swapfile.c | 4 |
8 files changed, 106 insertions, 47 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index d0351e31f474..cafdcee154e8 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -2370,7 +2370,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) | |||
| 2370 | long chg = region_truncate(&inode->i_mapping->private_list, offset); | 2370 | long chg = region_truncate(&inode->i_mapping->private_list, offset); |
| 2371 | 2371 | ||
| 2372 | spin_lock(&inode->i_lock); | 2372 | spin_lock(&inode->i_lock); |
| 2373 | inode->i_blocks -= blocks_per_huge_page(h); | 2373 | inode->i_blocks -= (blocks_per_huge_page(h) * freed); |
| 2374 | spin_unlock(&inode->i_lock); | 2374 | spin_unlock(&inode->i_lock); |
| 2375 | 2375 | ||
| 2376 | hugetlb_put_quota(inode->i_mapping, (chg - freed)); | 2376 | hugetlb_put_quota(inode->i_mapping, (chg - freed)); |
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 5aabd41ffb8f..487267310a84 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c | |||
| @@ -1217,7 +1217,6 @@ static void *kmemleak_seq_start(struct seq_file *seq, loff_t *pos) | |||
| 1217 | } | 1217 | } |
| 1218 | object = NULL; | 1218 | object = NULL; |
| 1219 | out: | 1219 | out: |
| 1220 | rcu_read_unlock(); | ||
| 1221 | return object; | 1220 | return object; |
| 1222 | } | 1221 | } |
| 1223 | 1222 | ||
| @@ -1233,13 +1232,11 @@ static void *kmemleak_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
| 1233 | 1232 | ||
| 1234 | ++(*pos); | 1233 | ++(*pos); |
| 1235 | 1234 | ||
| 1236 | rcu_read_lock(); | ||
| 1237 | list_for_each_continue_rcu(n, &object_list) { | 1235 | list_for_each_continue_rcu(n, &object_list) { |
| 1238 | next_obj = list_entry(n, struct kmemleak_object, object_list); | 1236 | next_obj = list_entry(n, struct kmemleak_object, object_list); |
| 1239 | if (get_object(next_obj)) | 1237 | if (get_object(next_obj)) |
| 1240 | break; | 1238 | break; |
| 1241 | } | 1239 | } |
| 1242 | rcu_read_unlock(); | ||
| 1243 | 1240 | ||
| 1244 | put_object(prev_obj); | 1241 | put_object(prev_obj); |
| 1245 | return next_obj; | 1242 | return next_obj; |
| @@ -1255,6 +1252,7 @@ static void kmemleak_seq_stop(struct seq_file *seq, void *v) | |||
| 1255 | * kmemleak_seq_start may return ERR_PTR if the scan_mutex | 1252 | * kmemleak_seq_start may return ERR_PTR if the scan_mutex |
| 1256 | * waiting was interrupted, so only release it if !IS_ERR. | 1253 | * waiting was interrupted, so only release it if !IS_ERR. |
| 1257 | */ | 1254 | */ |
| 1255 | rcu_read_unlock(); | ||
| 1258 | mutex_unlock(&scan_mutex); | 1256 | mutex_unlock(&scan_mutex); |
| 1259 | if (v) | 1257 | if (v) |
| 1260 | put_object(v); | 1258 | put_object(v); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e717964cb5a0..fd4529d86de5 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1207,6 +1207,12 @@ static int mem_cgroup_move_account(struct page_cgroup *pc, | |||
| 1207 | ret = 0; | 1207 | ret = 0; |
| 1208 | out: | 1208 | out: |
| 1209 | unlock_page_cgroup(pc); | 1209 | unlock_page_cgroup(pc); |
| 1210 | /* | ||
| 1211 | * We charges against "to" which may not have any tasks. Then, "to" | ||
| 1212 | * can be under rmdir(). But in current implementation, caller of | ||
| 1213 | * this function is just force_empty() and it's garanteed that | ||
| 1214 | * "to" is never removed. So, we don't check rmdir status here. | ||
| 1215 | */ | ||
| 1210 | return ret; | 1216 | return ret; |
| 1211 | } | 1217 | } |
| 1212 | 1218 | ||
| @@ -1428,6 +1434,7 @@ __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr, | |||
| 1428 | return; | 1434 | return; |
| 1429 | if (!ptr) | 1435 | if (!ptr) |
| 1430 | return; | 1436 | return; |
| 1437 | cgroup_exclude_rmdir(&ptr->css); | ||
| 1431 | pc = lookup_page_cgroup(page); | 1438 | pc = lookup_page_cgroup(page); |
| 1432 | mem_cgroup_lru_del_before_commit_swapcache(page); | 1439 | mem_cgroup_lru_del_before_commit_swapcache(page); |
| 1433 | __mem_cgroup_commit_charge(ptr, pc, ctype); | 1440 | __mem_cgroup_commit_charge(ptr, pc, ctype); |
| @@ -1457,8 +1464,12 @@ __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr, | |||
| 1457 | } | 1464 | } |
| 1458 | rcu_read_unlock(); | 1465 | rcu_read_unlock(); |
| 1459 | } | 1466 | } |
| 1460 | /* add this page(page_cgroup) to the LRU we want. */ | 1467 | /* |
| 1461 | 1468 | * At swapin, we may charge account against cgroup which has no tasks. | |
| 1469 | * So, rmdir()->pre_destroy() can be called while we do this charge. | ||
| 1470 | * In that case, we need to call pre_destroy() again. check it here. | ||
| 1471 | */ | ||
| 1472 | cgroup_release_and_wakeup_rmdir(&ptr->css); | ||
| 1462 | } | 1473 | } |
| 1463 | 1474 | ||
| 1464 | void mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr) | 1475 | void mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr) |
| @@ -1664,7 +1675,7 @@ void mem_cgroup_end_migration(struct mem_cgroup *mem, | |||
| 1664 | 1675 | ||
| 1665 | if (!mem) | 1676 | if (!mem) |
| 1666 | return; | 1677 | return; |
| 1667 | 1678 | cgroup_exclude_rmdir(&mem->css); | |
| 1668 | /* at migration success, oldpage->mapping is NULL. */ | 1679 | /* at migration success, oldpage->mapping is NULL. */ |
| 1669 | if (oldpage->mapping) { | 1680 | if (oldpage->mapping) { |
| 1670 | target = oldpage; | 1681 | target = oldpage; |
| @@ -1704,6 +1715,12 @@ void mem_cgroup_end_migration(struct mem_cgroup *mem, | |||
| 1704 | */ | 1715 | */ |
| 1705 | if (ctype == MEM_CGROUP_CHARGE_TYPE_MAPPED) | 1716 | if (ctype == MEM_CGROUP_CHARGE_TYPE_MAPPED) |
| 1706 | mem_cgroup_uncharge_page(target); | 1717 | mem_cgroup_uncharge_page(target); |
| 1718 | /* | ||
| 1719 | * At migration, we may charge account against cgroup which has no tasks | ||
| 1720 | * So, rmdir()->pre_destroy() can be called while we do this charge. | ||
| 1721 | * In that case, we need to call pre_destroy() again. check it here. | ||
| 1722 | */ | ||
| 1723 | cgroup_release_and_wakeup_rmdir(&mem->css); | ||
| 1707 | } | 1724 | } |
| 1708 | 1725 | ||
| 1709 | /* | 1726 | /* |
diff --git a/mm/memory.c b/mm/memory.c index 65216194eb8d..aede2ce3aba4 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -135,11 +135,12 @@ void pmd_clear_bad(pmd_t *pmd) | |||
| 135 | * Note: this doesn't free the actual pages themselves. That | 135 | * Note: this doesn't free the actual pages themselves. That |
| 136 | * has been handled earlier when unmapping all the memory regions. | 136 | * has been handled earlier when unmapping all the memory regions. |
| 137 | */ | 137 | */ |
| 138 | static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd) | 138 | static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd, |
| 139 | unsigned long addr) | ||
| 139 | { | 140 | { |
| 140 | pgtable_t token = pmd_pgtable(*pmd); | 141 | pgtable_t token = pmd_pgtable(*pmd); |
| 141 | pmd_clear(pmd); | 142 | pmd_clear(pmd); |
| 142 | pte_free_tlb(tlb, token); | 143 | pte_free_tlb(tlb, token, addr); |
| 143 | tlb->mm->nr_ptes--; | 144 | tlb->mm->nr_ptes--; |
| 144 | } | 145 | } |
| 145 | 146 | ||
| @@ -157,7 +158,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | |||
| 157 | next = pmd_addr_end(addr, end); | 158 | next = pmd_addr_end(addr, end); |
| 158 | if (pmd_none_or_clear_bad(pmd)) | 159 | if (pmd_none_or_clear_bad(pmd)) |
| 159 | continue; | 160 | continue; |
| 160 | free_pte_range(tlb, pmd); | 161 | free_pte_range(tlb, pmd, addr); |
| 161 | } while (pmd++, addr = next, addr != end); | 162 | } while (pmd++, addr = next, addr != end); |
| 162 | 163 | ||
| 163 | start &= PUD_MASK; | 164 | start &= PUD_MASK; |
| @@ -173,7 +174,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | |||
| 173 | 174 | ||
| 174 | pmd = pmd_offset(pud, start); | 175 | pmd = pmd_offset(pud, start); |
| 175 | pud_clear(pud); | 176 | pud_clear(pud); |
| 176 | pmd_free_tlb(tlb, pmd); | 177 | pmd_free_tlb(tlb, pmd, start); |
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, | 180 | static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, |
| @@ -206,7 +207,7 @@ static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, | |||
| 206 | 207 | ||
| 207 | pud = pud_offset(pgd, start); | 208 | pud = pud_offset(pgd, start); |
| 208 | pgd_clear(pgd); | 209 | pgd_clear(pgd); |
| 209 | pud_free_tlb(tlb, pud); | 210 | pud_free_tlb(tlb, pud, start); |
| 210 | } | 211 | } |
| 211 | 212 | ||
| 212 | /* | 213 | /* |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index e08e2c4da63a..7dd9d9f80694 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -191,25 +191,27 @@ static int mpol_new_bind(struct mempolicy *pol, const nodemask_t *nodes) | |||
| 191 | * Must be called holding task's alloc_lock to protect task's mems_allowed | 191 | * Must be called holding task's alloc_lock to protect task's mems_allowed |
| 192 | * and mempolicy. May also be called holding the mmap_semaphore for write. | 192 | * and mempolicy. May also be called holding the mmap_semaphore for write. |
| 193 | */ | 193 | */ |
| 194 | static int mpol_set_nodemask(struct mempolicy *pol, const nodemask_t *nodes) | 194 | static int mpol_set_nodemask(struct mempolicy *pol, |
| 195 | const nodemask_t *nodes, struct nodemask_scratch *nsc) | ||
| 195 | { | 196 | { |
| 196 | nodemask_t cpuset_context_nmask; | ||
| 197 | int ret; | 197 | int ret; |
| 198 | 198 | ||
| 199 | /* if mode is MPOL_DEFAULT, pol is NULL. This is right. */ | 199 | /* if mode is MPOL_DEFAULT, pol is NULL. This is right. */ |
| 200 | if (pol == NULL) | 200 | if (pol == NULL) |
| 201 | return 0; | 201 | return 0; |
| 202 | /* Check N_HIGH_MEMORY */ | ||
| 203 | nodes_and(nsc->mask1, | ||
| 204 | cpuset_current_mems_allowed, node_states[N_HIGH_MEMORY]); | ||
| 202 | 205 | ||
| 203 | VM_BUG_ON(!nodes); | 206 | VM_BUG_ON(!nodes); |
| 204 | if (pol->mode == MPOL_PREFERRED && nodes_empty(*nodes)) | 207 | if (pol->mode == MPOL_PREFERRED && nodes_empty(*nodes)) |
| 205 | nodes = NULL; /* explicit local allocation */ | 208 | nodes = NULL; /* explicit local allocation */ |
| 206 | else { | 209 | else { |
| 207 | if (pol->flags & MPOL_F_RELATIVE_NODES) | 210 | if (pol->flags & MPOL_F_RELATIVE_NODES) |
| 208 | mpol_relative_nodemask(&cpuset_context_nmask, nodes, | 211 | mpol_relative_nodemask(&nsc->mask2, nodes,&nsc->mask1); |
| 209 | &cpuset_current_mems_allowed); | ||
| 210 | else | 212 | else |
| 211 | nodes_and(cpuset_context_nmask, *nodes, | 213 | nodes_and(nsc->mask2, *nodes, nsc->mask1); |
| 212 | cpuset_current_mems_allowed); | 214 | |
| 213 | if (mpol_store_user_nodemask(pol)) | 215 | if (mpol_store_user_nodemask(pol)) |
| 214 | pol->w.user_nodemask = *nodes; | 216 | pol->w.user_nodemask = *nodes; |
| 215 | else | 217 | else |
| @@ -217,8 +219,10 @@ static int mpol_set_nodemask(struct mempolicy *pol, const nodemask_t *nodes) | |||
| 217 | cpuset_current_mems_allowed; | 219 | cpuset_current_mems_allowed; |
| 218 | } | 220 | } |
| 219 | 221 | ||
| 220 | ret = mpol_ops[pol->mode].create(pol, | 222 | if (nodes) |
| 221 | nodes ? &cpuset_context_nmask : NULL); | 223 | ret = mpol_ops[pol->mode].create(pol, &nsc->mask2); |
| 224 | else | ||
| 225 | ret = mpol_ops[pol->mode].create(pol, NULL); | ||
| 222 | return ret; | 226 | return ret; |
| 223 | } | 227 | } |
| 224 | 228 | ||
| @@ -620,12 +624,17 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, | |||
| 620 | { | 624 | { |
| 621 | struct mempolicy *new, *old; | 625 | struct mempolicy *new, *old; |
| 622 | struct mm_struct *mm = current->mm; | 626 | struct mm_struct *mm = current->mm; |
| 627 | NODEMASK_SCRATCH(scratch); | ||
| 623 | int ret; | 628 | int ret; |
| 624 | 629 | ||
| 625 | new = mpol_new(mode, flags, nodes); | 630 | if (!scratch) |
| 626 | if (IS_ERR(new)) | 631 | return -ENOMEM; |
| 627 | return PTR_ERR(new); | ||
| 628 | 632 | ||
| 633 | new = mpol_new(mode, flags, nodes); | ||
| 634 | if (IS_ERR(new)) { | ||
| 635 | ret = PTR_ERR(new); | ||
| 636 | goto out; | ||
| 637 | } | ||
| 629 | /* | 638 | /* |
| 630 | * prevent changing our mempolicy while show_numa_maps() | 639 | * prevent changing our mempolicy while show_numa_maps() |
| 631 | * is using it. | 640 | * is using it. |
| @@ -635,13 +644,13 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, | |||
| 635 | if (mm) | 644 | if (mm) |
| 636 | down_write(&mm->mmap_sem); | 645 | down_write(&mm->mmap_sem); |
| 637 | task_lock(current); | 646 | task_lock(current); |
| 638 | ret = mpol_set_nodemask(new, nodes); | 647 | ret = mpol_set_nodemask(new, nodes, scratch); |
| 639 | if (ret) { | 648 | if (ret) { |
| 640 | task_unlock(current); | 649 | task_unlock(current); |
| 641 | if (mm) | 650 | if (mm) |
| 642 | up_write(&mm->mmap_sem); | 651 | up_write(&mm->mmap_sem); |
| 643 | mpol_put(new); | 652 | mpol_put(new); |
| 644 | return ret; | 653 | goto out; |
| 645 | } | 654 | } |
| 646 | old = current->mempolicy; | 655 | old = current->mempolicy; |
| 647 | current->mempolicy = new; | 656 | current->mempolicy = new; |
| @@ -654,7 +663,10 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, | |||
| 654 | up_write(&mm->mmap_sem); | 663 | up_write(&mm->mmap_sem); |
| 655 | 664 | ||
| 656 | mpol_put(old); | 665 | mpol_put(old); |
| 657 | return 0; | 666 | ret = 0; |
| 667 | out: | ||
| 668 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 669 | return ret; | ||
| 658 | } | 670 | } |
| 659 | 671 | ||
| 660 | /* | 672 | /* |
| @@ -1014,12 +1026,20 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
| 1014 | if (err) | 1026 | if (err) |
| 1015 | return err; | 1027 | return err; |
| 1016 | } | 1028 | } |
| 1017 | down_write(&mm->mmap_sem); | 1029 | { |
| 1018 | task_lock(current); | 1030 | NODEMASK_SCRATCH(scratch); |
| 1019 | err = mpol_set_nodemask(new, nmask); | 1031 | if (scratch) { |
| 1020 | task_unlock(current); | 1032 | down_write(&mm->mmap_sem); |
| 1033 | task_lock(current); | ||
| 1034 | err = mpol_set_nodemask(new, nmask, scratch); | ||
| 1035 | task_unlock(current); | ||
| 1036 | if (err) | ||
| 1037 | up_write(&mm->mmap_sem); | ||
| 1038 | } else | ||
| 1039 | err = -ENOMEM; | ||
| 1040 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1041 | } | ||
| 1021 | if (err) { | 1042 | if (err) { |
| 1022 | up_write(&mm->mmap_sem); | ||
| 1023 | mpol_put(new); | 1043 | mpol_put(new); |
| 1024 | return err; | 1044 | return err; |
| 1025 | } | 1045 | } |
| @@ -1891,6 +1911,7 @@ restart: | |||
| 1891 | * Install non-NULL @mpol in inode's shared policy rb-tree. | 1911 | * Install non-NULL @mpol in inode's shared policy rb-tree. |
| 1892 | * On entry, the current task has a reference on a non-NULL @mpol. | 1912 | * On entry, the current task has a reference on a non-NULL @mpol. |
| 1893 | * This must be released on exit. | 1913 | * This must be released on exit. |
| 1914 | * This is called at get_inode() calls and we can use GFP_KERNEL. | ||
| 1894 | */ | 1915 | */ |
| 1895 | void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | 1916 | void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) |
| 1896 | { | 1917 | { |
| @@ -1902,19 +1923,24 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 1902 | if (mpol) { | 1923 | if (mpol) { |
| 1903 | struct vm_area_struct pvma; | 1924 | struct vm_area_struct pvma; |
| 1904 | struct mempolicy *new; | 1925 | struct mempolicy *new; |
| 1926 | NODEMASK_SCRATCH(scratch); | ||
| 1905 | 1927 | ||
| 1928 | if (!scratch) | ||
| 1929 | return; | ||
| 1906 | /* contextualize the tmpfs mount point mempolicy */ | 1930 | /* contextualize the tmpfs mount point mempolicy */ |
| 1907 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); | 1931 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); |
| 1908 | if (IS_ERR(new)) { | 1932 | if (IS_ERR(new)) { |
| 1909 | mpol_put(mpol); /* drop our ref on sb mpol */ | 1933 | mpol_put(mpol); /* drop our ref on sb mpol */ |
| 1934 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1910 | return; /* no valid nodemask intersection */ | 1935 | return; /* no valid nodemask intersection */ |
| 1911 | } | 1936 | } |
| 1912 | 1937 | ||
| 1913 | task_lock(current); | 1938 | task_lock(current); |
| 1914 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask); | 1939 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch); |
| 1915 | task_unlock(current); | 1940 | task_unlock(current); |
| 1916 | mpol_put(mpol); /* drop our ref on sb mpol */ | 1941 | mpol_put(mpol); /* drop our ref on sb mpol */ |
| 1917 | if (ret) { | 1942 | if (ret) { |
| 1943 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1918 | mpol_put(new); | 1944 | mpol_put(new); |
| 1919 | return; | 1945 | return; |
| 1920 | } | 1946 | } |
| @@ -1924,6 +1950,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 1924 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ | 1950 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ |
| 1925 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ | 1951 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ |
| 1926 | mpol_put(new); /* drop initial ref */ | 1952 | mpol_put(new); /* drop initial ref */ |
| 1953 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 1927 | } | 1954 | } |
| 1928 | } | 1955 | } |
| 1929 | 1956 | ||
| @@ -2140,13 +2167,18 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) | |||
| 2140 | err = 1; | 2167 | err = 1; |
| 2141 | else { | 2168 | else { |
| 2142 | int ret; | 2169 | int ret; |
| 2143 | 2170 | NODEMASK_SCRATCH(scratch); | |
| 2144 | task_lock(current); | 2171 | if (scratch) { |
| 2145 | ret = mpol_set_nodemask(new, &nodes); | 2172 | task_lock(current); |
| 2146 | task_unlock(current); | 2173 | ret = mpol_set_nodemask(new, &nodes, scratch); |
| 2147 | if (ret) | 2174 | task_unlock(current); |
| 2175 | } else | ||
| 2176 | ret = -ENOMEM; | ||
| 2177 | NODEMASK_SCRATCH_FREE(scratch); | ||
| 2178 | if (ret) { | ||
| 2148 | err = 1; | 2179 | err = 1; |
| 2149 | else if (no_context) { | 2180 | mpol_put(new); |
| 2181 | } else if (no_context) { | ||
| 2150 | /* save for contextualization */ | 2182 | /* save for contextualization */ |
| 2151 | new->w.user_nodemask = nodes; | 2183 | new->w.user_nodemask = nodes; |
| 2152 | } | 2184 | } |
diff --git a/mm/mempool.c b/mm/mempool.c index a46eb1b4bb66..32e75d400503 100644 --- a/mm/mempool.c +++ b/mm/mempool.c | |||
| @@ -303,14 +303,14 @@ EXPORT_SYMBOL(mempool_free_slab); | |||
| 303 | */ | 303 | */ |
| 304 | void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data) | 304 | void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data) |
| 305 | { | 305 | { |
| 306 | size_t size = (size_t)(long)pool_data; | 306 | size_t size = (size_t)pool_data; |
| 307 | return kmalloc(size, gfp_mask); | 307 | return kmalloc(size, gfp_mask); |
| 308 | } | 308 | } |
| 309 | EXPORT_SYMBOL(mempool_kmalloc); | 309 | EXPORT_SYMBOL(mempool_kmalloc); |
| 310 | 310 | ||
| 311 | void *mempool_kzalloc(gfp_t gfp_mask, void *pool_data) | 311 | void *mempool_kzalloc(gfp_t gfp_mask, void *pool_data) |
| 312 | { | 312 | { |
| 313 | size_t size = (size_t) pool_data; | 313 | size_t size = (size_t)pool_data; |
| 314 | return kzalloc(size, gfp_mask); | 314 | return kzalloc(size, gfp_mask); |
| 315 | } | 315 | } |
| 316 | EXPORT_SYMBOL(mempool_kzalloc); | 316 | EXPORT_SYMBOL(mempool_kzalloc); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index caa92689aac9..d052abbe3063 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -882,7 +882,7 @@ retry_reserve: | |||
| 882 | */ | 882 | */ |
| 883 | static int rmqueue_bulk(struct zone *zone, unsigned int order, | 883 | static int rmqueue_bulk(struct zone *zone, unsigned int order, |
| 884 | unsigned long count, struct list_head *list, | 884 | unsigned long count, struct list_head *list, |
| 885 | int migratetype) | 885 | int migratetype, int cold) |
| 886 | { | 886 | { |
| 887 | int i; | 887 | int i; |
| 888 | 888 | ||
| @@ -901,7 +901,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, | |||
| 901 | * merge IO requests if the physical pages are ordered | 901 | * merge IO requests if the physical pages are ordered |
| 902 | * properly. | 902 | * properly. |
| 903 | */ | 903 | */ |
| 904 | list_add(&page->lru, list); | 904 | if (likely(cold == 0)) |
| 905 | list_add(&page->lru, list); | ||
| 906 | else | ||
| 907 | list_add_tail(&page->lru, list); | ||
| 905 | set_page_private(page, migratetype); | 908 | set_page_private(page, migratetype); |
| 906 | list = &page->lru; | 909 | list = &page->lru; |
| 907 | } | 910 | } |
| @@ -1119,7 +1122,8 @@ again: | |||
| 1119 | local_irq_save(flags); | 1122 | local_irq_save(flags); |
| 1120 | if (!pcp->count) { | 1123 | if (!pcp->count) { |
| 1121 | pcp->count = rmqueue_bulk(zone, 0, | 1124 | pcp->count = rmqueue_bulk(zone, 0, |
| 1122 | pcp->batch, &pcp->list, migratetype); | 1125 | pcp->batch, &pcp->list, |
| 1126 | migratetype, cold); | ||
| 1123 | if (unlikely(!pcp->count)) | 1127 | if (unlikely(!pcp->count)) |
| 1124 | goto failed; | 1128 | goto failed; |
| 1125 | } | 1129 | } |
| @@ -1138,7 +1142,8 @@ again: | |||
| 1138 | /* Allocate more to the pcp list if necessary */ | 1142 | /* Allocate more to the pcp list if necessary */ |
| 1139 | if (unlikely(&page->lru == &pcp->list)) { | 1143 | if (unlikely(&page->lru == &pcp->list)) { |
| 1140 | pcp->count += rmqueue_bulk(zone, 0, | 1144 | pcp->count += rmqueue_bulk(zone, 0, |
| 1141 | pcp->batch, &pcp->list, migratetype); | 1145 | pcp->batch, &pcp->list, |
| 1146 | migratetype, cold); | ||
| 1142 | page = list_entry(pcp->list.next, struct page, lru); | 1147 | page = list_entry(pcp->list.next, struct page, lru); |
| 1143 | } | 1148 | } |
| 1144 | 1149 | ||
| @@ -1740,8 +1745,10 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | |||
| 1740 | * be using allocators in order of preference for an area that is | 1745 | * be using allocators in order of preference for an area that is |
| 1741 | * too large. | 1746 | * too large. |
| 1742 | */ | 1747 | */ |
| 1743 | if (WARN_ON_ONCE(order >= MAX_ORDER)) | 1748 | if (order >= MAX_ORDER) { |
| 1749 | WARN_ON_ONCE(!(gfp_mask & __GFP_NOWARN)); | ||
| 1744 | return NULL; | 1750 | return NULL; |
| 1751 | } | ||
| 1745 | 1752 | ||
| 1746 | /* | 1753 | /* |
| 1747 | * GFP_THISNODE (meaning __GFP_THISNODE, __GFP_NORETRY and | 1754 | * GFP_THISNODE (meaning __GFP_THISNODE, __GFP_NORETRY and |
| @@ -1789,6 +1796,10 @@ rebalance: | |||
| 1789 | if (p->flags & PF_MEMALLOC) | 1796 | if (p->flags & PF_MEMALLOC) |
| 1790 | goto nopage; | 1797 | goto nopage; |
| 1791 | 1798 | ||
| 1799 | /* Avoid allocations with no watermarks from looping endlessly */ | ||
| 1800 | if (test_thread_flag(TIF_MEMDIE) && !(gfp_mask & __GFP_NOFAIL)) | ||
| 1801 | goto nopage; | ||
| 1802 | |||
| 1792 | /* Try direct reclaim and then allocating */ | 1803 | /* Try direct reclaim and then allocating */ |
| 1793 | page = __alloc_pages_direct_reclaim(gfp_mask, order, | 1804 | page = __alloc_pages_direct_reclaim(gfp_mask, order, |
| 1794 | zonelist, high_zoneidx, | 1805 | zonelist, high_zoneidx, |
diff --git a/mm/swapfile.c b/mm/swapfile.c index d1ade1a48ee7..8ffdc0d23c53 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
| @@ -753,7 +753,7 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p) | |||
| 753 | 753 | ||
| 754 | if (!bdev) { | 754 | if (!bdev) { |
| 755 | if (bdev_p) | 755 | if (bdev_p) |
| 756 | *bdev_p = bdget(sis->bdev->bd_dev); | 756 | *bdev_p = bdgrab(sis->bdev); |
| 757 | 757 | ||
| 758 | spin_unlock(&swap_lock); | 758 | spin_unlock(&swap_lock); |
| 759 | return i; | 759 | return i; |
| @@ -765,7 +765,7 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p) | |||
| 765 | struct swap_extent, list); | 765 | struct swap_extent, list); |
| 766 | if (se->start_block == offset) { | 766 | if (se->start_block == offset) { |
| 767 | if (bdev_p) | 767 | if (bdev_p) |
| 768 | *bdev_p = bdget(sis->bdev->bd_dev); | 768 | *bdev_p = bdgrab(sis->bdev); |
| 769 | 769 | ||
| 770 | spin_unlock(&swap_lock); | 770 | spin_unlock(&swap_lock); |
| 771 | bdput(bdev); | 771 | bdput(bdev); |
