mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 21:21:09 +00:00
mm: clean up non-standard page->_mapcount users
- Add a proper comment to page->_mapcount. - Introduce a macro for generating helper functions. - Place all special page->_mapcount values next to each other so that readers can see all possible values and so we don't get duplicates. Link: http://lkml.kernel.org/r/502f49000e0b63e6c62e338fac6b420bf34fb526.1464079537.git.vdavydov@virtuozzo.com Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@kernel.org> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Minchan Kim <minchan@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
99691addb4
commit
632c0a1aff
3 changed files with 40 additions and 41 deletions
|
@ -85,6 +85,11 @@ struct page {
|
||||||
/*
|
/*
|
||||||
* Count of ptes mapped in mms, to show when
|
* Count of ptes mapped in mms, to show when
|
||||||
* page is mapped & limit reverse map searches.
|
* page is mapped & limit reverse map searches.
|
||||||
|
*
|
||||||
|
* Extra information about page type may be
|
||||||
|
* stored here for pages that are never mapped,
|
||||||
|
* in which case the value MUST BE <= -2.
|
||||||
|
* See page-flags.h for more details.
|
||||||
*/
|
*/
|
||||||
atomic_t _mapcount;
|
atomic_t _mapcount;
|
||||||
|
|
||||||
|
|
|
@ -603,55 +603,46 @@ TESTPAGEFLAG_FALSE(DoubleMap)
|
||||||
TESTCLEARFLAG_FALSE(DoubleMap)
|
TESTCLEARFLAG_FALSE(DoubleMap)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For pages that are never mapped to userspace, page->mapcount may be
|
||||||
|
* used for storing extra information about page type. Any value used
|
||||||
|
* for this purpose must be <= -2, but it's better start not too close
|
||||||
|
* to -2 so that an underflow of the page_mapcount() won't be mistaken
|
||||||
|
* for a special page.
|
||||||
|
*/
|
||||||
|
#define PAGE_MAPCOUNT_OPS(uname, lname) \
|
||||||
|
static __always_inline int Page##uname(struct page *page) \
|
||||||
|
{ \
|
||||||
|
return atomic_read(&page->_mapcount) == \
|
||||||
|
PAGE_##lname##_MAPCOUNT_VALUE; \
|
||||||
|
} \
|
||||||
|
static __always_inline void __SetPage##uname(struct page *page) \
|
||||||
|
{ \
|
||||||
|
VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page); \
|
||||||
|
atomic_set(&page->_mapcount, PAGE_##lname##_MAPCOUNT_VALUE); \
|
||||||
|
} \
|
||||||
|
static __always_inline void __ClearPage##uname(struct page *page) \
|
||||||
|
{ \
|
||||||
|
VM_BUG_ON_PAGE(!Page##uname(page), page); \
|
||||||
|
atomic_set(&page->_mapcount, -1); \
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PageBuddy() indicate that the page is free and in the buddy system
|
* PageBuddy() indicate that the page is free and in the buddy system
|
||||||
* (see mm/page_alloc.c).
|
* (see mm/page_alloc.c).
|
||||||
*
|
|
||||||
* PAGE_BUDDY_MAPCOUNT_VALUE must be <= -2 but better not too close to
|
|
||||||
* -2 so that an underflow of the page_mapcount() won't be mistaken
|
|
||||||
* for a genuine PAGE_BUDDY_MAPCOUNT_VALUE. -128 can be created very
|
|
||||||
* efficiently by most CPU architectures.
|
|
||||||
*/
|
*/
|
||||||
#define PAGE_BUDDY_MAPCOUNT_VALUE (-128)
|
#define PAGE_BUDDY_MAPCOUNT_VALUE (-128)
|
||||||
|
PAGE_MAPCOUNT_OPS(Buddy, BUDDY)
|
||||||
|
|
||||||
static inline int PageBuddy(struct page *page)
|
/*
|
||||||
{
|
* PageBalloon() is set on pages that are on the balloon page list
|
||||||
return atomic_read(&page->_mapcount) == PAGE_BUDDY_MAPCOUNT_VALUE;
|
* (see mm/balloon_compaction.c).
|
||||||
}
|
*/
|
||||||
|
#define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
|
||||||
static inline void __SetPageBuddy(struct page *page)
|
PAGE_MAPCOUNT_OPS(Balloon, BALLOON)
|
||||||
{
|
|
||||||
VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page);
|
|
||||||
atomic_set(&page->_mapcount, PAGE_BUDDY_MAPCOUNT_VALUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __ClearPageBuddy(struct page *page)
|
|
||||||
{
|
|
||||||
VM_BUG_ON_PAGE(!PageBuddy(page), page);
|
|
||||||
atomic_set(&page->_mapcount, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern bool is_free_buddy_page(struct page *page);
|
extern bool is_free_buddy_page(struct page *page);
|
||||||
|
|
||||||
#define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
|
|
||||||
|
|
||||||
static inline int PageBalloon(struct page *page)
|
|
||||||
{
|
|
||||||
return atomic_read(&page->_mapcount) == PAGE_BALLOON_MAPCOUNT_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __SetPageBalloon(struct page *page)
|
|
||||||
{
|
|
||||||
VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page);
|
|
||||||
atomic_set(&page->_mapcount, PAGE_BALLOON_MAPCOUNT_VALUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __ClearPageBalloon(struct page *page)
|
|
||||||
{
|
|
||||||
VM_BUG_ON_PAGE(!PageBalloon(page), page);
|
|
||||||
atomic_set(&page->_mapcount, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
__PAGEFLAG(Isolated, isolated, PF_ANY);
|
__PAGEFLAG(Isolated, isolated, PF_ANY);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -185,6 +185,9 @@ regex_c=(
|
||||||
'/\<CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/ClearPage\1/'
|
'/\<CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/ClearPage\1/'
|
||||||
'/\<__CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/__ClearPage\1/'
|
'/\<__CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/__ClearPage\1/'
|
||||||
'/\<TESTCLEARFLAG_FALSE(\([[:alnum:]_]*\).*/TestClearPage\1/'
|
'/\<TESTCLEARFLAG_FALSE(\([[:alnum:]_]*\).*/TestClearPage\1/'
|
||||||
|
'/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/Page\1/'
|
||||||
|
'/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/__SetPage\1/'
|
||||||
|
'/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/__ClearPage\1/'
|
||||||
'/^TASK_PFA_TEST([^,]*, *\([[:alnum:]_]*\))/task_\1/'
|
'/^TASK_PFA_TEST([^,]*, *\([[:alnum:]_]*\))/task_\1/'
|
||||||
'/^TASK_PFA_SET([^,]*, *\([[:alnum:]_]*\))/task_set_\1/'
|
'/^TASK_PFA_SET([^,]*, *\([[:alnum:]_]*\))/task_set_\1/'
|
||||||
'/^TASK_PFA_CLEAR([^,]*, *\([[:alnum:]_]*\))/task_clear_\1/'
|
'/^TASK_PFA_CLEAR([^,]*, *\([[:alnum:]_]*\))/task_clear_\1/'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue