mm: split page_type out from _mapcount
We're already using a union of many fields here, so stop abusing the _mapcount and make page_type its own field. That implies renaming some of the machinery that creates PageBuddy, PageBalloon and PageKmemcg; bring back the PG_buddy, PG_balloon and PG_kmemcg names. As suggested by Kirill, make page_type a bitmask. Because it starts out life as -1 (thanks to sharing the storage with _mapcount), setting a page flag means clearing the appropriate bit. This gives us space for probably twenty or so extra bits (depending how paranoid we want to be about _mapcount underflow). Link: http://lkml.kernel.org/r/20180518194519.3820-3-willy@infradead.org Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Christoph Lameter <cl@linux.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Jérôme Glisse <jglisse@redhat.com> Cc: Lai Jiangshan <jiangshanlai@gmail.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
620b4e9031
commit
6e292b9be7
@@ -705,16 +705,14 @@ static inline void rmv_page_order(struct page *page)
|
||||
|
||||
/*
|
||||
* This function checks whether a page is free && is the buddy
|
||||
* we can do coalesce a page and its buddy if
|
||||
* we can coalesce a page and its buddy if
|
||||
* (a) the buddy is not in a hole (check before calling!) &&
|
||||
* (b) the buddy is in the buddy system &&
|
||||
* (c) a page and its buddy have the same order &&
|
||||
* (d) a page and its buddy are in the same zone.
|
||||
*
|
||||
* For recording whether a page is in the buddy system, we set ->_mapcount
|
||||
* PAGE_BUDDY_MAPCOUNT_VALUE.
|
||||
* Setting, clearing, and testing _mapcount PAGE_BUDDY_MAPCOUNT_VALUE is
|
||||
* serialized by zone->lock.
|
||||
* For recording whether a page is in the buddy system, we set PageBuddy.
|
||||
* Setting, clearing, and testing PageBuddy is serialized by zone->lock.
|
||||
*
|
||||
* For recording page's order, we use page_private(page).
|
||||
*/
|
||||
@@ -759,9 +757,8 @@ static inline int page_is_buddy(struct page *page, struct page *buddy,
|
||||
* as necessary, plus some accounting needed to play nicely with other
|
||||
* parts of the VM system.
|
||||
* At each level, we keep a list of pages, which are heads of continuous
|
||||
* free pages of length of (1 << order) and marked with _mapcount
|
||||
* PAGE_BUDDY_MAPCOUNT_VALUE. Page's order is recorded in page_private(page)
|
||||
* field.
|
||||
* free pages of length of (1 << order) and marked with PageBuddy.
|
||||
* Page's order is recorded in page_private(page) field.
|
||||
* So when we are allocating or freeing one, we can derive the state of the
|
||||
* other. That is, if we allocate a small block, and both were
|
||||
* free, the remainder of the region must be split into blocks.
|
||||
|
Reference in New Issue
Block a user