Messages in this thread Patch in this message | | | Date | Sun, 16 Dec 2012 18:56:58 -0800 (PST) | From | Hugh Dickins <> | Subject | [PATCH] mm: fix kernel BUG at huge_memory.c:1474! |
| |
Andrea's autonuma-benchmark numa01 hits kernel BUG at huge_memory.c:1474! in change_huge_pmd called from change_protection from change_prot_numa from task_numa_work.
That BUG, introduced in the huge zero page commit cad7f613c4d0 ("thp: change_huge_pmd(): make sure we don't try to make a page writable") was trying to verify that newprot never adds write permission to an anonymous huge page; but Automatic NUMA Balancing's 4b10e7d562c9 ("mm: mempolicy: Implement change_prot_numa() in terms of change_protection()") adds a new prot_numa path into change_huge_pmd(), which makes no use of the newprot provided, and may retain the write bit in the pmd.
Just move the BUG_ON(pmd_write(entry)) up into the !prot_numa block.
Signed-off-by: Hugh Dickins <hughd@google.com> ---
mm/huge_memory.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
--- 2a74dbb9/mm/huge_memory.c 2012-12-16 16:35:08.752441527 -0800 +++ linux/mm/huge_memory.c 2012-12-16 18:21:24.308156970 -0800 @@ -1460,9 +1460,10 @@ int change_huge_pmd(struct vm_area_struc if (__pmd_trans_huge_lock(pmd, vma) == 1) { pmd_t entry; entry = pmdp_get_and_clear(mm, addr, pmd); - if (!prot_numa) + if (!prot_numa) { entry = pmd_modify(entry, newprot); - else { + BUG_ON(pmd_write(entry)); + } else { struct page *page = pmd_page(*pmd); /* only check non-shared pages */ @@ -1471,7 +1472,6 @@ int change_huge_pmd(struct vm_area_struc entry = pmd_mknuma(entry); } } - BUG_ON(pmd_write(entry)); set_pmd_at(mm, addr, pmd, entry); spin_unlock(&vma->vm_mm->page_table_lock); ret = 1;
| |