• O
    mm, kmemleak: little optimization while scanning · 9f1eb38e
    Oscar Salvador 提交于
    kmemleak_scan() goes through all online nodes and tries to scan all used
    pages.
    
    We can do better and use pfn_to_online_page(), so in case we have
    CONFIG_MEMORY_HOTPLUG, offlined pages will be skiped automatically.  For
    boxes where CONFIG_MEMORY_HOTPLUG is not present, pfn_to_online_page()
    will fallback to pfn_valid().
    
    Another little optimization is to check if the page belongs to the node we
    are currently checking, so in case we have nodes interleaved we will not
    check the same pfn multiple times.
    
    I ran some tests:
    
    Add some memory to node1 and node2 making it interleaved:
    
    (qemu) object_add memory-backend-ram,id=ram0,size=1G
    (qemu) device_add pc-dimm,id=dimm0,memdev=ram0,node=1
    (qemu) object_add memory-backend-ram,id=ram1,size=1G
    (qemu) device_add pc-dimm,id=dimm1,memdev=ram1,node=2
    (qemu) object_add memory-backend-ram,id=ram2,size=1G
    (qemu) device_add pc-dimm,id=dimm2,memdev=ram2,node=1
    
    Then, we offline that memory:
     # for i in {32..39} ; do echo "offline" > /sys/devices/system/node/node1/memory$i/state;done
     # for i in {48..55} ; do echo "offline" > /sys/devices/system/node/node1/memory$i/state;don
     # for i in {40..47} ; do echo "offline" > /sys/devices/system/node/node2/memory$i/state;done
    
    And we run kmemleak_scan:
    
     # echo "scan" > /sys/kernel/debug/kmemleak
    
    before the patch:
    
    kmemleak: time spend: 41596 us
    
    after the patch:
    
    kmemleak: time spend: 34899 us
    
    [akpm@linux-foundation.org: remove stray newline, per Oscar]
    Link: http://lkml.kernel.org/r/20181206131918.25099-1-osalvador@suse.deSigned-off-by: NOscar Salvador <osalvador@suse.de>
    Reviewed-by: NWei Yang <richard.weiyang@gmail.com>
    Suggested-by: NMichal Hocko <mhocko@suse.com>
    Acked-by: NCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    9f1eb38e
kmemleak.c 59.9 KB