Matthew Wilcox (Oracle) e320d3012d mm/page_alloc.c: fix freeing non-compound pages
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: e286781d5f2e ("mm: speculative page references")
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Mike 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: Linus Torvalds <torvalds@linux-foundation.org>
2020-10-13 18:38:33 -07:00
..
2020-10-13 18:38:32 -07:00
2020-08-09 14:10:26 -07:00
2020-08-14 19:56:56 -07:00
2020-10-02 18:02:13 +10:00
2020-05-24 20:48:11 +02:00
2018-08-16 12:14:42 -07:00
2020-06-01 08:23:42 -04:00
2020-10-13 18:38:32 -07:00
2020-05-07 14:54:26 +08:00
2018-10-16 13:45:44 +02:00
2020-06-15 18:22:43 -07:00
2019-07-11 15:17:41 -07:00
2020-09-26 10:33:57 -07:00
2018-06-27 18:58:49 +03:00
2020-06-29 10:02:23 +02:00
2018-10-15 16:31:29 -04:00
2020-10-13 18:38:32 -07:00
2020-06-07 10:53:36 -07:00
2020-06-09 10:03:12 -07:00
2020-06-04 19:06:28 -07:00