• H
    ksm: stop hotremove lockdep warning · ef4d43a8
    Hugh Dickins 提交于
    Complaints are rare, but lockdep still does not understand the way
    ksm_memory_callback(MEM_GOING_OFFLINE) takes ksm_thread_mutex, and holds
    it until the ksm_memory_callback(MEM_OFFLINE): that appears to be a
    problem because notifier callbacks are made under down_read of
    blocking_notifier_head->rwsem (so first the mutex is taken while holding
    the rwsem, then later the rwsem is taken while still holding the mutex);
    but is not in fact a problem because mem_hotplug_mutex is held
    throughout the dance.
    
    There was an attempt to fix this with mutex_lock_nested(); but if that
    happened to fool lockdep two years ago, apparently it does so no longer.
    
    I had hoped to eradicate this issue in extending KSM page migration not
    to need the ksm_thread_mutex.  But then realized that although the page
    migration itself is safe, we do still need to lock out ksmd and other
    users of get_ksm_page() while offlining memory - at some point between
    MEM_GOING_OFFLINE and MEM_OFFLINE, the struct pages themselves may
    vanish, and get_ksm_page()'s accesses to them become a violation.
    
    So, give up on holding ksm_thread_mutex itself from MEM_GOING_OFFLINE to
    MEM_OFFLINE, and add a KSM_RUN_OFFLINE flag, and wait_while_offlining()
    checks, to achieve the same lockout without being caught by lockdep.
    This is less elegant for KSM, but it's more important to keep lockdep
    useful to other users - and I apologize for how long it took to fix.
    Signed-off-by: NHugh Dickins <hughd@google.com>
    Reported-by: NGerald Schaefer <gerald.schaefer@de.ibm.com>
    Tested-by: NGerald Schaefer <gerald.schaefer@de.ibm.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Petr Holasek <pholasek@redhat.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Izik Eidus <izik.eidus@ravellosystems.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    ef4d43a8
ksm.c 64.6 KB