Skip to content

Commit ca120cf

Browse files
committed
mm: fix show_smap() for zone_device-pmd ranges
Attempting to dump /proc/<pid>/smaps for a process with pmd dax mappings currently results in the following VM_BUG_ONs: kernel BUG at mm/huge_memory.c:1105! task: ffff88045f16b140 task.stack: ffff88045be14000 RIP: 0010:[<ffffffff81268f9b>] [<ffffffff81268f9b>] follow_trans_huge_pmd+0x2cb/0x340 [..] Call Trace: [<ffffffff81306030>] smaps_pte_range+0xa0/0x4b0 [<ffffffff814c2755>] ? vsnprintf+0x255/0x4c0 [<ffffffff8123c46e>] __walk_page_range+0x1fe/0x4d0 [<ffffffff8123c8a2>] walk_page_vma+0x62/0x80 [<ffffffff81307656>] show_smap+0xa6/0x2b0 kernel BUG at fs/proc/task_mmu.c:585! RIP: 0010:[<ffffffff81306469>] [<ffffffff81306469>] smaps_pte_range+0x499/0x4b0 Call Trace: [<ffffffff814c2795>] ? vsnprintf+0x255/0x4c0 [<ffffffff8123c46e>] __walk_page_range+0x1fe/0x4d0 [<ffffffff8123c8a2>] walk_page_vma+0x62/0x80 [<ffffffff81307696>] show_smap+0xa6/0x2b0 These locations are sanity checking page flags that must be set for an anonymous transparent huge page, but are not set for the zone_device pages associated with dax mappings. Cc: Ross Zwisler <[email protected]> Cc: Kirill A. Shutemov <[email protected]> Acked-by: Andrew Morton <[email protected]> Signed-off-by: Dan Williams <[email protected]>
1 parent 4c3cb6e commit ca120cf

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

fs/proc/task_mmu.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,8 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
581581
mss->anonymous_thp += HPAGE_PMD_SIZE;
582582
else if (PageSwapBacked(page))
583583
mss->shmem_thp += HPAGE_PMD_SIZE;
584+
else if (is_zone_device_page(page))
585+
/* pass */;
584586
else
585587
VM_BUG_ON_PAGE(1, page);
586588
smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd));

mm/huge_memory.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,7 +1078,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
10781078
goto out;
10791079

10801080
page = pmd_page(*pmd);
1081-
VM_BUG_ON_PAGE(!PageHead(page), page);
1081+
VM_BUG_ON_PAGE(!PageHead(page) && !is_zone_device_page(page), page);
10821082
if (flags & FOLL_TOUCH)
10831083
touch_pmd(vma, addr, pmd);
10841084
if ((flags & FOLL_MLOCK) && (vma->vm_flags & VM_LOCKED)) {
@@ -1116,7 +1116,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
11161116
}
11171117
skip_mlock:
11181118
page += (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT;
1119-
VM_BUG_ON_PAGE(!PageCompound(page), page);
1119+
VM_BUG_ON_PAGE(!PageCompound(page) && !is_zone_device_page(page), page);
11201120
if (flags & FOLL_GET)
11211121
get_page(page);
11221122

0 commit comments

Comments
 (0)