On Wed, Mar 05, 2014 at 11:31:55PM -0500, Sasha Levin wrote: ... > > Sorry, I didn't write it but I also run it as root on VM, so condition is > > the same. It might depend on kernel config, so I'm now trying the config > > you previously gave me, but it doesn't boot correctly on my environment > > (panic in initialization). I may need some time to get over this. > > I'd be happy to help with anything off-list, it shouldn't be too difficult > to get that kernel to boot :) Thanks. I did reproduce this on my kernel although it's only once and I needed many trials due to hitting other bugs. And I found my patch was totally wrong because it should check !pte_present(), not pte_present(). I'm testing fixed one (see below), and the problem seems not to reproduce in my environment at least for now. But I'm not 100% sure, so I need your double checking. > I've also reverted the page walker series for now, it makes it impossible > to test anything else since it seems that hitting one of the issues is quite > easy. OK. Sorry for the bother. Thanks, Naoya --- From: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> Date: Thu, 6 Mar 2014 07:08:24 -0500 Subject: [PATCH] mm: add pte_present() check on existing hugetlb_entry callbacks Page table walker doesn't check non-present hugetlb entry in common path, so hugetlb_entry() callbacks must check it. The reason for this behavior is that some callers want to handle it in its own way. However, some callers don't check it now, which causes unpredictable result, for example when we have a race between migrating hugepage and reading /proc/pid/numa_maps. This patch fixes it by adding pte_present checks on buggy callbacks. This bug exists for long and got visible by introducing hugepage migration. ChangeLog v2: - fix if condition (check pte_present() instead of pte_present()) Reported-by: Sasha Levin <sasha.levin@xxxxxxxxxx> Signed-off-by: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> Cc: stable@xxxxxxxxxxxxxxx # 3.12+ --- fs/proc/task_mmu.c | 3 +++ mm/mempolicy.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index f819d0d4a0e8..762026098381 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1301,6 +1301,9 @@ static int gather_hugetlb_stats(pte_t *pte, unsigned long addr, if (pte_none(*pte)) return 0; + if (!pte_present(*pte)) + return 0; + page = pte_page(*pte); if (!page) return 0; diff --git a/mm/mempolicy.c b/mm/mempolicy.c index b2155b8adbae..494f401bbf6c 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -524,8 +524,12 @@ static int queue_pages_hugetlb(pte_t *pte, unsigned long addr, unsigned long flags = qp->flags; int nid; struct page *page; + pte_t entry; - page = pte_page(huge_ptep_get(pte)); + entry = huge_ptep_get(pte); + if (!pte_present(entry)) + return 0; + page = pte_page(entry); nid = page_to_nid(page); if (node_isset(nid, *qp->nmask) == !!(flags & MPOL_MF_INVERT)) return 0; -- 1.8.5.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>