Skip to content
  • Andrey Ryabinin's avatar
    mm/kasan: don't vfree() nonexistent vm_area · 0f901dcb
    Andrey Ryabinin authored
    KASAN uses different routines to map shadow for hot added memory and
    memory obtained in boot process.  Attempt to offline memory onlined by
    normal boot process leads to this:
    
        Trying to vfree() nonexistent vm area (000000005d3b34b9)
        WARNING: CPU: 2 PID: 13215 at mm/vmalloc.c:1525 __vunmap+0x147/0x190
    
        Call Trace:
         kasan_mem_notifier+0xad/0xb9
         notifier_call_chain+0x166/0x260
         __blocking_notifier_call_chain+0xdb/0x140
         __offline_pages+0x96a/0xb10
         memory_subsys_offline+0x76/0xc0
         device_offline+0xb8/0x120
         store_mem_state+0xfa/0x120
         kernfs_fop_write+0x1d5/0x320
         __vfs_write+0xd4/0x530
         vfs_write+0x105/0x340
         SyS_write+0xb0/0x140
    
    Obviously we can't call vfree() to free memory that wasn't allocated via
    vmalloc().  Use find_vm_area() to see if we can call vfree().
    
    Unfortunately it's a bit tricky to properly unmap and free shadow
    allocated during boot, so we'll have to keep it.  If memory will come
    online again that shadow will be reused.
    
    Matthew asked: how can you call vfree() on something that isn't a
    vmalloc address?
    
      vfree() is able to free any address returned by
      __vmalloc_node_range().  And __vmalloc_node_range() gives you any
      address you ask.  It doesn't have to be an address in [VMALLOC_START,
      VMALLOC_END] range.
    
      That's also how the module_alloc()/module_memfree() works on
      architectures that have designated area for modules.
    
    [aryabinin@virtuozzo.com: improve comments]
      Link: http://lkml.kernel.org/r/dabee6ab-3a7a-51cd-3b86-5468718e0390@virtuozzo.com
    [akpm@linux-foundation.org: fix typos, reflow comment]
    Link: http://lkml.kernel.org/r/20180201163349.8700-1-aryabinin@virtuozzo.com
    Fixes: fa69b598
    
     ("mm/kasan: add support for memory hotplug")
    Signed-off-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
    Reported-by: default avatarPaul Menzel <pmenzel+linux-kasan-dev@molgen.mpg.de>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0f901dcb