Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'akpm' (patches from Andrew)

Merge misc fixes from Andrew Morton:
"4 fixes"

* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
mm, page_alloc: fix has_unmovable_pages for HugePages
fork,memcg: fix crash in free_thread_stack on memcg charge fail
mm: thp: fix flags for pmd migration when split
mm, memory_hotplug: initialize struct pages for the full memory section

+35 -13
+7 -2
kernel/fork.c
··· 240 240 * free_thread_stack() can be called in interrupt context, 241 241 * so cache the vm_struct. 242 242 */ 243 - if (stack) 243 + if (stack) { 244 244 tsk->stack_vm_area = find_vm_area(stack); 245 + tsk->stack = stack; 246 + } 245 247 return stack; 246 248 #else 247 249 struct page *page = alloc_pages_node(node, THREADINFO_GFP, ··· 290 288 static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, 291 289 int node) 292 290 { 293 - return kmem_cache_alloc_node(thread_stack_cache, THREADINFO_GFP, node); 291 + unsigned long *stack; 292 + stack = kmem_cache_alloc_node(thread_stack_cache, THREADINFO_GFP, node); 293 + tsk->stack = stack; 294 + return stack; 294 295 } 295 296 296 297 static void free_thread_stack(struct task_struct *tsk)
+11 -9
mm/huge_memory.c
··· 2144 2144 */ 2145 2145 old_pmd = pmdp_invalidate(vma, haddr, pmd); 2146 2146 2147 - #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION 2148 2147 pmd_migration = is_pmd_migration_entry(old_pmd); 2149 - if (pmd_migration) { 2148 + if (unlikely(pmd_migration)) { 2150 2149 swp_entry_t entry; 2151 2150 2152 2151 entry = pmd_to_swp_entry(old_pmd); 2153 2152 page = pfn_to_page(swp_offset(entry)); 2154 - } else 2155 - #endif 2153 + write = is_write_migration_entry(entry); 2154 + young = false; 2155 + soft_dirty = pmd_swp_soft_dirty(old_pmd); 2156 + } else { 2156 2157 page = pmd_page(old_pmd); 2158 + if (pmd_dirty(old_pmd)) 2159 + SetPageDirty(page); 2160 + write = pmd_write(old_pmd); 2161 + young = pmd_young(old_pmd); 2162 + soft_dirty = pmd_soft_dirty(old_pmd); 2163 + } 2157 2164 VM_BUG_ON_PAGE(!page_count(page), page); 2158 2165 page_ref_add(page, HPAGE_PMD_NR - 1); 2159 - if (pmd_dirty(old_pmd)) 2160 - SetPageDirty(page); 2161 - write = pmd_write(old_pmd); 2162 - young = pmd_young(old_pmd); 2163 - soft_dirty = pmd_soft_dirty(old_pmd); 2164 2166 2165 2167 /* 2166 2168 * Withdraw the table only after we mark the pmd entry invalid.
+17 -2
mm/page_alloc.c
··· 5542 5542 cond_resched(); 5543 5543 } 5544 5544 } 5545 + #ifdef CONFIG_SPARSEMEM 5546 + /* 5547 + * If the zone does not span the rest of the section then 5548 + * we should at least initialize those pages. Otherwise we 5549 + * could blow up on a poisoned page in some paths which depend 5550 + * on full sections being initialized (e.g. memory hotplug). 5551 + */ 5552 + while (end_pfn % PAGES_PER_SECTION) { 5553 + __init_single_page(pfn_to_page(end_pfn), end_pfn, zone, nid); 5554 + end_pfn++; 5555 + } 5556 + #endif 5545 5557 } 5546 5558 5547 5559 #ifdef CONFIG_ZONE_DEVICE ··· 7814 7802 * handle each tail page individually in migration. 7815 7803 */ 7816 7804 if (PageHuge(page)) { 7805 + struct page *head = compound_head(page); 7806 + unsigned int skip_pages; 7817 7807 7818 - if (!hugepage_migration_supported(page_hstate(page))) 7808 + if (!hugepage_migration_supported(page_hstate(head))) 7819 7809 goto unmovable; 7820 7810 7821 - iter = round_up(iter + 1, 1<<compound_order(page)) - 1; 7811 + skip_pages = (1 << compound_order(head)) - (page - head); 7812 + iter += skip_pages - 1; 7822 7813 continue; 7823 7814 } 7824 7815