Skip to content
Snippets Groups Projects
Select Git revision
  • objtool
  • master default protected
  • v5.9
  • v5.9-rc8
  • v5.9-rc7
  • v5.9-rc6
  • v5.9-rc5
  • v5.9-rc4
  • v5.9-rc3
  • v5.9-rc2
  • v5.9-rc1
  • v5.8
  • v5.8-rc7
  • v5.8-rc6
  • v5.8-rc5
  • v5.8-rc4
  • v5.8-rc3
  • v5.8-rc2
  • v5.8-rc1
  • v5.7
  • v5.7-rc7
  • v5.7-rc6
22 results

lib

  • Clone with SSH
  • Clone with HTTPS
  • user avatar
    Matthew Wilcox (Oracle) authored
    Here is a very rare race which leaks memory:
    
    Page P0 is allocated to the page cache.  Page P1 is free.
    
    Thread A                Thread B                Thread C
    find_get_entry():
    xas_load() returns P0
    						Removes P0 from page cache
    						P0 finds its buddy P1
    			alloc_pages(GFP_KERNEL, 1) returns P0
    			P0 has refcount 1
    page_cache_get_speculative(P0)
    P0 has refcount 2
    			__free_pages(P0)
    			P0 has refcount 1
    put_page(P0)
    P1 is not freed
    
    Fix this by freeing all the pages in __free_pages() that won't be freed
    by the call to put_page().  It's usually not a good idea to split a page,
    but this is a very unlikely scenario.
    
    Fixes: e286781d ("mm: speculative page references")
    Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Cc: Nick Piggin <npiggin@gmail.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200926213919.26642-1-willy@infradead.org
    
    
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e320d301
    History