• Catalin Marinas's avatar
    mm: kmemleak: allow safe memory scanning during kmemleak disabling · 3bc68ffc
    Catalin Marinas authored
    commit c5f3b1a5 upstream.
    
    The kmemleak scanning thread can run for minutes.  Callbacks like
    kmemleak_free() are allowed during this time, the race being taken care
    of by the object->lock spinlock.  Such lock also prevents a memory block
    from being freed or unmapped while it is being scanned by blocking the
    kmemleak_free() -> ...  -> __delete_object() function until the lock is
    released in scan_object().
    
    When a kmemleak error occurs (e.g.  it fails to allocate its metadata),
    kmemleak_enabled is set and __delete_object() is no longer called on
    freed objects.  If kmemleak_scan is running at the same time,
    kmemleak_free() no longer waits for the object scanning to complete,
    allowing the corresponding memory block to be freed or unmapped (in the
    case of vfree()).  This leads to kmemleak_scan potentially triggering a
    page fault.
    
    This patch separates the kmemleak_free() enabling/disabling from the
    overall kmemleak_enabled nob so that we can defer the disabling of the
    object freeing tracking until the scanning thread completed.  The
    kmemleak_free_part() is deliberately ignored by this patch since this is
    only called during boot before the scanning thread started.
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reported-by: default avatarVignesh Radhakrishnan <vigneshr@codeaurora.org>
    Tested-by: default avatarVignesh Radhakrishnan <vigneshr@codeaurora.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    [bwh: Backported to 3.2:
     - Adjust context
     - Drop changes to kmemleak_free_percpu()]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    3bc68ffc
kmemleak.c 50.2 KB