diff options
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/bootmem.c | 14 | ||||
| -rw-r--r-- | mm/mremap.c | 6 | ||||
| -rw-r--r-- | mm/slab.c | 25 |
3 files changed, 24 insertions, 21 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index 8ec4e4c2a179..c1330cc19783 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
| @@ -61,17 +61,9 @@ static unsigned long __init init_bootmem_core (pg_data_t *pgdat, | |||
| 61 | { | 61 | { |
| 62 | bootmem_data_t *bdata = pgdat->bdata; | 62 | bootmem_data_t *bdata = pgdat->bdata; |
| 63 | unsigned long mapsize = ((end - start)+7)/8; | 63 | unsigned long mapsize = ((end - start)+7)/8; |
| 64 | static struct pglist_data *pgdat_last; | 64 | |
| 65 | 65 | pgdat->pgdat_next = pgdat_list; | |
| 66 | pgdat->pgdat_next = NULL; | 66 | pgdat_list = pgdat; |
| 67 | /* Add new nodes last so that bootmem always starts | ||
| 68 | searching in the first nodes, not the last ones */ | ||
| 69 | if (pgdat_last) | ||
| 70 | pgdat_last->pgdat_next = pgdat; | ||
| 71 | else { | ||
| 72 | pgdat_list = pgdat; | ||
| 73 | pgdat_last = pgdat; | ||
| 74 | } | ||
| 75 | 67 | ||
| 76 | mapsize = ALIGN(mapsize, sizeof(long)); | 68 | mapsize = ALIGN(mapsize, sizeof(long)); |
| 77 | bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT); | 69 | bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT); |
diff --git a/mm/mremap.c b/mm/mremap.c index a32fed454bd7..f343fc73a8bd 100644 --- a/mm/mremap.c +++ b/mm/mremap.c | |||
| @@ -141,10 +141,10 @@ move_one_page(struct vm_area_struct *vma, unsigned long old_addr, | |||
| 141 | if (dst) { | 141 | if (dst) { |
| 142 | pte_t pte; | 142 | pte_t pte; |
| 143 | pte = ptep_clear_flush(vma, old_addr, src); | 143 | pte = ptep_clear_flush(vma, old_addr, src); |
| 144 | |||
| 144 | /* ZERO_PAGE can be dependant on virtual addr */ | 145 | /* ZERO_PAGE can be dependant on virtual addr */ |
| 145 | if (pfn_valid(pte_pfn(pte)) && | 146 | pte = move_pte(pte, new_vma->vm_page_prot, |
| 146 | pte_page(pte) == ZERO_PAGE(old_addr)) | 147 | old_addr, new_addr); |
| 147 | pte = pte_wrprotect(mk_pte(ZERO_PAGE(new_addr), new_vma->vm_page_prot)); | ||
| 148 | set_pte_at(mm, new_addr, dst, pte); | 148 | set_pte_at(mm, new_addr, dst, pte); |
| 149 | } else | 149 | } else |
| 150 | error = -ENOMEM; | 150 | error = -ENOMEM; |
| @@ -2510,16 +2510,12 @@ cache_alloc_debugcheck_after(kmem_cache_t *cachep, | |||
| 2510 | #define cache_alloc_debugcheck_after(a,b,objp,d) (objp) | 2510 | #define cache_alloc_debugcheck_after(a,b,objp,d) (objp) |
| 2511 | #endif | 2511 | #endif |
| 2512 | 2512 | ||
| 2513 | 2513 | static inline void *____cache_alloc(kmem_cache_t *cachep, unsigned int __nocast flags) | |
| 2514 | static inline void *__cache_alloc(kmem_cache_t *cachep, unsigned int __nocast flags) | ||
| 2515 | { | 2514 | { |
| 2516 | unsigned long save_flags; | ||
| 2517 | void* objp; | 2515 | void* objp; |
| 2518 | struct array_cache *ac; | 2516 | struct array_cache *ac; |
| 2519 | 2517 | ||
| 2520 | cache_alloc_debugcheck_before(cachep, flags); | 2518 | check_irq_off(); |
| 2521 | |||
| 2522 | local_irq_save(save_flags); | ||
| 2523 | ac = ac_data(cachep); | 2519 | ac = ac_data(cachep); |
| 2524 | if (likely(ac->avail)) { | 2520 | if (likely(ac->avail)) { |
| 2525 | STATS_INC_ALLOCHIT(cachep); | 2521 | STATS_INC_ALLOCHIT(cachep); |
| @@ -2529,6 +2525,18 @@ static inline void *__cache_alloc(kmem_cache_t *cachep, unsigned int __nocast fl | |||
| 2529 | STATS_INC_ALLOCMISS(cachep); | 2525 | STATS_INC_ALLOCMISS(cachep); |
| 2530 | objp = cache_alloc_refill(cachep, flags); | 2526 | objp = cache_alloc_refill(cachep, flags); |
| 2531 | } | 2527 | } |
| 2528 | return objp; | ||
| 2529 | } | ||
| 2530 | |||
| 2531 | static inline void *__cache_alloc(kmem_cache_t *cachep, unsigned int __nocast flags) | ||
| 2532 | { | ||
| 2533 | unsigned long save_flags; | ||
| 2534 | void* objp; | ||
| 2535 | |||
| 2536 | cache_alloc_debugcheck_before(cachep, flags); | ||
| 2537 | |||
| 2538 | local_irq_save(save_flags); | ||
| 2539 | objp = ____cache_alloc(cachep, flags); | ||
| 2532 | local_irq_restore(save_flags); | 2540 | local_irq_restore(save_flags); |
| 2533 | objp = cache_alloc_debugcheck_after(cachep, flags, objp, | 2541 | objp = cache_alloc_debugcheck_after(cachep, flags, objp, |
| 2534 | __builtin_return_address(0)); | 2542 | __builtin_return_address(0)); |
| @@ -2856,7 +2864,10 @@ void *kmem_cache_alloc_node(kmem_cache_t *cachep, unsigned int __nocast flags, i | |||
| 2856 | 2864 | ||
| 2857 | cache_alloc_debugcheck_before(cachep, flags); | 2865 | cache_alloc_debugcheck_before(cachep, flags); |
| 2858 | local_irq_save(save_flags); | 2866 | local_irq_save(save_flags); |
| 2859 | ptr = __cache_alloc_node(cachep, flags, nodeid); | 2867 | if (nodeid == numa_node_id()) |
| 2868 | ptr = ____cache_alloc(cachep, flags); | ||
| 2869 | else | ||
| 2870 | ptr = __cache_alloc_node(cachep, flags, nodeid); | ||
| 2860 | local_irq_restore(save_flags); | 2871 | local_irq_restore(save_flags); |
| 2861 | ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, __builtin_return_address(0)); | 2872 | ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, __builtin_return_address(0)); |
| 2862 | 2873 | ||
