Commit ca215086 authored by David Hildenbrand's avatar David Hildenbrand Committed by Linus Torvalds

mm: convert PG_balloon to PG_offline

PG_balloon was introduced to implement page migration/compaction for
pages inflated in virtio-balloon.  Nowadays, it is only a marker that a
page is part of virtio-balloon and therefore logically offline.

We also want to make use of this flag in other balloon drivers - for
inflated pages or when onlining a section but keeping some pages offline
(e.g.  used right now by XEN and Hyper-V via set_online_page_callback()).

We are going to expose this flag to dump tools like makedumpfile.  But
instead of exposing PG_balloon, let's generalize the concept of marking
pages as logically offline, so it can be reused for other purposes later
on.

Rename PG_balloon to PG_offline.  This is an indicator that the page is
logically offline, the content stale and that it should not be touched
(e.g.  a hypervisor would have to allocate backing storage in order for
the guest to dump an unused page).  We can then e.g.  exclude such pages
from dumps.

We replace and reuse KPF_BALLOON (23), as this shouldn't really harm
(and for now the semantics stay the same).  In following patches, we
will make use of this bit also in other balloon drivers.  While at it,
document PGTABLE.

[akpm@linux-foundation.org: fix comment text, per David]
Link: http://lkml.kernel.org/r/20181119101616.8901-3-david@redhat.comSigned-off-by: default avatarDavid Hildenbrand <david@redhat.com>
Acked-by: default avatarKonstantin Khlebnikov <koct9i@gmail.com>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarPankaj gupta <pagupta@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
Cc: Christian Hansen <chansen3@cisco.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Pavel Tatashin <pasha.tatashin@oracle.com>
Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Miles Chen <miles.chen@mediatek.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Kazuhito Hagio <k-hagio@ab.jp.nec.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Baoquan He <bhe@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Julien Freche <jfreche@vmware.com>
Cc: Kairui Song <kasong@redhat.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Len Brown <len.brown@intel.com>
Cc: Lianbo Jiang <lijiang@redhat.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Nadav Amit <namit@vmware.com>
Cc: Omar Sandoval <osandov@fb.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Xavier Deguillard <xdeguillard@vmware.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4d3467e1
...@@ -75,9 +75,10 @@ number of times a page is mapped. ...@@ -75,9 +75,10 @@ number of times a page is mapped.
20. NOPAGE 20. NOPAGE
21. KSM 21. KSM
22. THP 22. THP
23. BALLOON 23. OFFLINE
24. ZERO_PAGE 24. ZERO_PAGE
25. IDLE 25. IDLE
26. PGTABLE
* ``/proc/kpagecgroup``. This file contains a 64-bit inode number of the * ``/proc/kpagecgroup``. This file contains a 64-bit inode number of the
memory cgroup each page is charged to, indexed by PFN. Only available when memory cgroup each page is charged to, indexed by PFN. Only available when
...@@ -118,8 +119,8 @@ Short descriptions to the page flags ...@@ -118,8 +119,8 @@ Short descriptions to the page flags
identical memory pages dynamically shared between one or more processes identical memory pages dynamically shared between one or more processes
22 - THP 22 - THP
contiguous pages which construct transparent hugepages contiguous pages which construct transparent hugepages
23 - BALLOON 23 - OFFLINE
balloon compaction page page is logically offline
24 - ZERO_PAGE 24 - ZERO_PAGE
zero page for pfn_zero or huge_zero page zero page for pfn_zero or huge_zero page
25 - IDLE 25 - IDLE
...@@ -128,6 +129,8 @@ Short descriptions to the page flags ...@@ -128,6 +129,8 @@ Short descriptions to the page flags
Note that this flag may be stale in case the page was accessed via Note that this flag may be stale in case the page was accessed via
a PTE. To make sure the flag is up-to-date one has to read a PTE. To make sure the flag is up-to-date one has to read
``/sys/kernel/mm/page_idle/bitmap`` first. ``/sys/kernel/mm/page_idle/bitmap`` first.
26 - PGTABLE
page is in use as a page table
IO related page flags IO related page flags
--------------------- ---------------------
......
...@@ -152,8 +152,8 @@ u64 stable_page_flags(struct page *page) ...@@ -152,8 +152,8 @@ u64 stable_page_flags(struct page *page)
else if (page_count(page) == 0 && is_free_buddy_page(page)) else if (page_count(page) == 0 && is_free_buddy_page(page))
u |= 1 << KPF_BUDDY; u |= 1 << KPF_BUDDY;
if (PageBalloon(page)) if (PageOffline(page))
u |= 1 << KPF_BALLOON; u |= 1 << KPF_OFFLINE;
if (PageTable(page)) if (PageTable(page))
u |= 1 << KPF_PGTABLE; u |= 1 << KPF_PGTABLE;
......
...@@ -95,7 +95,7 @@ extern int balloon_page_migrate(struct address_space *mapping, ...@@ -95,7 +95,7 @@ extern int balloon_page_migrate(struct address_space *mapping,
static inline void balloon_page_insert(struct balloon_dev_info *balloon, static inline void balloon_page_insert(struct balloon_dev_info *balloon,
struct page *page) struct page *page)
{ {
__SetPageBalloon(page); __SetPageOffline(page);
__SetPageMovable(page, balloon->inode->i_mapping); __SetPageMovable(page, balloon->inode->i_mapping);
set_page_private(page, (unsigned long)balloon); set_page_private(page, (unsigned long)balloon);
list_add(&page->lru, &balloon->pages); list_add(&page->lru, &balloon->pages);
...@@ -111,7 +111,7 @@ static inline void balloon_page_insert(struct balloon_dev_info *balloon, ...@@ -111,7 +111,7 @@ static inline void balloon_page_insert(struct balloon_dev_info *balloon,
*/ */
static inline void balloon_page_delete(struct page *page) static inline void balloon_page_delete(struct page *page)
{ {
__ClearPageBalloon(page); __ClearPageOffline(page);
__ClearPageMovable(page); __ClearPageMovable(page);
set_page_private(page, 0); set_page_private(page, 0);
/* /*
...@@ -141,13 +141,13 @@ static inline gfp_t balloon_mapping_gfp_mask(void) ...@@ -141,13 +141,13 @@ static inline gfp_t balloon_mapping_gfp_mask(void)
static inline void balloon_page_insert(struct balloon_dev_info *balloon, static inline void balloon_page_insert(struct balloon_dev_info *balloon,
struct page *page) struct page *page)
{ {
__SetPageBalloon(page); __SetPageOffline(page);
list_add(&page->lru, &balloon->pages); list_add(&page->lru, &balloon->pages);
} }
static inline void balloon_page_delete(struct page *page) static inline void balloon_page_delete(struct page *page)
{ {
__ClearPageBalloon(page); __ClearPageOffline(page);
list_del(&page->lru); list_del(&page->lru);
} }
......
...@@ -671,7 +671,7 @@ PAGEFLAG_FALSE(DoubleMap) ...@@ -671,7 +671,7 @@ PAGEFLAG_FALSE(DoubleMap)
/* Reserve 0x0000007f to catch underflows of page_mapcount */ /* Reserve 0x0000007f to catch underflows of page_mapcount */
#define PAGE_MAPCOUNT_RESERVE -128 #define PAGE_MAPCOUNT_RESERVE -128
#define PG_buddy 0x00000080 #define PG_buddy 0x00000080
#define PG_balloon 0x00000100 #define PG_offline 0x00000100
#define PG_kmemcg 0x00000200 #define PG_kmemcg 0x00000200
#define PG_table 0x00000400 #define PG_table 0x00000400
...@@ -706,10 +706,13 @@ static __always_inline void __ClearPage##uname(struct page *page) \ ...@@ -706,10 +706,13 @@ static __always_inline void __ClearPage##uname(struct page *page) \
PAGE_TYPE_OPS(Buddy, buddy) PAGE_TYPE_OPS(Buddy, buddy)
/* /*
* PageBalloon() is true for pages that are on the balloon page list * PageOffline() indicates that the page is logically offline although the
* (see mm/balloon_compaction.c). * containing section is online. (e.g. inflated in a balloon driver or
* not onlined when onlining the section).
* The content of these pages is effectively stale. Such pages should not
* be touched (read/write/dump/save) except by their owner.
*/ */
PAGE_TYPE_OPS(Balloon, balloon) PAGE_TYPE_OPS(Offline, offline)
/* /*
* If kmemcg is enabled, the buddy allocator will set PageKmemcg() on * If kmemcg is enabled, the buddy allocator will set PageKmemcg() on
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#define KPF_KSM 21 #define KPF_KSM 21
#define KPF_THP 22 #define KPF_THP 22
#define KPF_BALLOON 23 #define KPF_OFFLINE 23
#define KPF_ZERO_PAGE 24 #define KPF_ZERO_PAGE 24
#define KPF_IDLE 25 #define KPF_IDLE 25
#define KPF_PGTABLE 26 #define KPF_PGTABLE 26
......
...@@ -133,7 +133,7 @@ static const char * const page_flag_names[] = { ...@@ -133,7 +133,7 @@ static const char * const page_flag_names[] = {
[KPF_NOPAGE] = "n:nopage", [KPF_NOPAGE] = "n:nopage",
[KPF_KSM] = "x:ksm", [KPF_KSM] = "x:ksm",
[KPF_THP] = "t:thp", [KPF_THP] = "t:thp",
[KPF_BALLOON] = "o:balloon", [KPF_OFFLINE] = "o:offline",
[KPF_PGTABLE] = "g:pgtable", [KPF_PGTABLE] = "g:pgtable",
[KPF_ZERO_PAGE] = "z:zero_page", [KPF_ZERO_PAGE] = "z:zero_page",
[KPF_IDLE] = "i:idle_page", [KPF_IDLE] = "i:idle_page",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment