• Peter Feiner's avatar
    mm: softdirty: unmapped addresses between VMAs are clean · fdfce812
    Peter Feiner authored
    commit 81d0fa62 upstream.
    
    If a /proc/pid/pagemap read spans a [VMA, an unmapped region, then a
    VM_SOFTDIRTY VMA], the virtual pages in the unmapped region are reported
    as softdirty.  Here's a program to demonstrate the bug:
    
    int main() {
    	const uint64_t PAGEMAP_SOFTDIRTY = 1ul << 55;
    	uint64_t pme[3];
    	int fd = open("/proc/self/pagemap", O_RDONLY);;
    	char *m = mmap(NULL, 3 * getpagesize(), PROT_READ,
    	               MAP_ANONYMOUS | MAP_SHARED, -1, 0);
    	munmap(m + getpagesize(), getpagesize());
    	pread(fd, pme, 24, (unsigned long) m / getpagesize() * 8);
    	assert(pme[0] & PAGEMAP_SOFTDIRTY);    /* passes */
    	assert(!(pme[1] & PAGEMAP_SOFTDIRTY)); /* fails */
    	assert(pme[2] & PAGEMAP_SOFTDIRTY);    /* passes */
    	return 0;
    }
    
    (Note that all pages in new VMAs are softdirty until cleared).
    
    Tested:
    	Used the program given above. I'm going to include this code in
    	a selftest in the future.
    
    [n-horiguchi@ah.jp.nec.com: prevent pagemap_pte_range() from overrunning]
    Signed-off-by: default avatarPeter Feiner <pfeiner@google.com>
    Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
    Cc: Cyrill Gorcunov <gorcunov@openvz.org>
    Cc: Pavel Emelyanov <xemul@parallels.com>
    Cc: Jamie Liu <jamieliu@google.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Signed-off-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    fdfce812
task_mmu.c 38.7 KB