Skip to content

Commit

Permalink
mm: Use owner_priv bit for PageSwapCache, valid when PageSwapBacked
Browse files Browse the repository at this point in the history
A page is not added to the swap cache without being swap backed,
so PageSwapBacked mappings can use PG_owner_priv_1 for PageSwapCache.

Signed-off-by: Nicholas Piggin <[email protected]>
Acked-by: Hugh Dickins <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Bob Peterson <[email protected]>
Cc: Steven Whitehouse <[email protected]>
Cc: Andrew Lutomirski <[email protected]>
Cc: Andreas Gruenbacher <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Mel Gorman <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
npiggin authored and torvalds committed Dec 25, 2016
1 parent 7c0f6ba commit 6326fec
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 18 deletions.
24 changes: 16 additions & 8 deletions include/linux/page-flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ enum pageflags {
PG_private_2, /* If pagecache, has fs aux data */
PG_writeback, /* Page is under writeback */
PG_head, /* A head page */
PG_swapcache, /* Swap page: swp_entry_t in private */
PG_mappedtodisk, /* Has blocks allocated on-disk */
PG_reclaim, /* To be reclaimed asap */
PG_swapbacked, /* Page is backed by RAM/swap */
Expand All @@ -110,6 +109,9 @@ enum pageflags {
/* Filesystems */
PG_checked = PG_owner_priv_1,

/* SwapBacked */
PG_swapcache = PG_owner_priv_1, /* Swap page: swp_entry_t in private */

/* Two page bits are conscripted by FS-Cache to maintain local caching
* state. These bits are set on pages belonging to the netfs's inodes
* when those inodes are being locally cached.
Expand Down Expand Up @@ -314,7 +316,13 @@ PAGEFLAG_FALSE(HighMem)
#endif

#ifdef CONFIG_SWAP
PAGEFLAG(SwapCache, swapcache, PF_NO_COMPOUND)
static __always_inline int PageSwapCache(struct page *page)
{
return PageSwapBacked(page) && test_bit(PG_swapcache, &page->flags);

}
SETPAGEFLAG(SwapCache, swapcache, PF_NO_COMPOUND)
CLEARPAGEFLAG(SwapCache, swapcache, PF_NO_COMPOUND)
#else
PAGEFLAG_FALSE(SwapCache)
#endif
Expand Down Expand Up @@ -701,12 +709,12 @@ static inline void ClearPageSlabPfmemalloc(struct page *page)
* Flags checked when a page is freed. Pages being freed should not have
* these flags set. It they are, there is a problem.
*/
#define PAGE_FLAGS_CHECK_AT_FREE \
(1UL << PG_lru | 1UL << PG_locked | \
1UL << PG_private | 1UL << PG_private_2 | \
1UL << PG_writeback | 1UL << PG_reserved | \
1UL << PG_slab | 1UL << PG_swapcache | 1UL << PG_active | \
1UL << PG_unevictable | __PG_MLOCKED)
#define PAGE_FLAGS_CHECK_AT_FREE \
(1UL << PG_lru | 1UL << PG_locked | \
1UL << PG_private | 1UL << PG_private_2 | \
1UL << PG_writeback | 1UL << PG_reserved | \
1UL << PG_slab | 1UL << PG_active | \
1UL << PG_unevictable | __PG_MLOCKED)

/*
* Flags checked when a page is prepped for return by the page allocator.
Expand Down
1 change: 0 additions & 1 deletion include/trace/events/mmflags.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@
{1UL << PG_private_2, "private_2" }, \
{1UL << PG_writeback, "writeback" }, \
{1UL << PG_head, "head" }, \
{1UL << PG_swapcache, "swapcache" }, \
{1UL << PG_mappedtodisk, "mappedtodisk" }, \
{1UL << PG_reclaim, "reclaim" }, \
{1UL << PG_swapbacked, "swapbacked" }, \
Expand Down
4 changes: 1 addition & 3 deletions mm/memory-failure.c
Original file line number Diff line number Diff line change
Expand Up @@ -764,12 +764,11 @@ static int me_huge_page(struct page *p, unsigned long pfn)
*/

#define dirty (1UL << PG_dirty)
#define sc (1UL << PG_swapcache)
#define sc ((1UL << PG_swapcache) | (1UL << PG_swapbacked))
#define unevict (1UL << PG_unevictable)
#define mlock (1UL << PG_mlocked)
#define writeback (1UL << PG_writeback)
#define lru (1UL << PG_lru)
#define swapbacked (1UL << PG_swapbacked)
#define head (1UL << PG_head)
#define slab (1UL << PG_slab)
#define reserved (1UL << PG_reserved)
Expand Down Expand Up @@ -819,7 +818,6 @@ static struct page_state {
#undef mlock
#undef writeback
#undef lru
#undef swapbacked
#undef head
#undef slab
#undef reserved
Expand Down
14 changes: 8 additions & 6 deletions mm/migrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -466,13 +466,15 @@ int migrate_page_move_mapping(struct address_space *mapping,
*/
newpage->index = page->index;
newpage->mapping = page->mapping;
if (PageSwapBacked(page))
__SetPageSwapBacked(newpage);

get_page(newpage); /* add cache reference */
if (PageSwapCache(page)) {
SetPageSwapCache(newpage);
set_page_private(newpage, page_private(page));
if (PageSwapBacked(page)) {
__SetPageSwapBacked(newpage);
if (PageSwapCache(page)) {
SetPageSwapCache(newpage);
set_page_private(newpage, page_private(page));
}
} else {
VM_BUG_ON_PAGE(PageSwapCache(page), page);
}

/* Move dirty while page refs frozen and newpage not yet exposed */
Expand Down

0 comments on commit 6326fec

Please sign in to comment.