• H
    mm: don't return 0 too early from find_get_pages() · 5b280c0c
    Hugh Dickins 提交于
    Callers of find_get_pages(), or its wrapper pagevec_lookup() - notably
    truncate_inode_pages_range() - stop looking further when it returns 0.
    
    But if an interrupt comes just after its radix_tree_gang_lookup_slot(),
    especially if we have preemptible RCU enabled, isn't it conceivable that
    all 14 pages returned could be removed from the page cache by
    shrink_page_list(), before find_get_pages() gets to process them?  So
    causing it to return 0 although there may be plenty more pages beyond.
    
    Make find_get_pages() and find_get_pages_tag() check for this unlikely
    case, and restart should it occur; but callers of find_get_pages_contig()
    have no such expectation, it's okay for that to return 0 early.
    
    I have not seen this in practice, just worried by the possibility.
    Signed-off-by: NHugh Dickins <hughd@google.com>
    Cc: Nick Piggin <npiggin@kernel.dk>
    Acked-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Wu Fengguang <fengguang.wu@intel.com>
    Cc: Salman Qazi <sqazi@google.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    5b280c0c
filemap.c 69.8 KB