diff options
author | Vlastimil Babka <vbabka@suse.cz> | 2016-03-15 17:56:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-15 19:55:16 -0400 |
commit | 7dd80b8af0bcd705a9ef2fa272c082882616a499 (patch) | |
tree | 75048a0e7ff2648c59b1a23640e202653fa1aa27 /mm | |
parent | 60f30350fd69a3e4d5f0f45937d3274c22565134 (diff) |
mm, page_owner: convert page_owner_inited to static key
CONFIG_PAGE_OWNER attempts to impose negligible runtime overhead when
enabled during compilation, but not actually enabled during runtime by
boot param page_owner=on. This overhead can be further reduced using
the static key mechanism, which this patch does.
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Sasha Levin <sasha.levin@oracle.com>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Mel Gorman <mgorman@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_owner.c | 9 | ||||
-rw-r--r-- | mm/vmstat.c | 2 |
2 files changed, 6 insertions, 5 deletions
diff --git a/mm/page_owner.c b/mm/page_owner.c index 7a37a30d941b..feaa28b40c1c 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c | |||
@@ -5,10 +5,11 @@ | |||
5 | #include <linux/bootmem.h> | 5 | #include <linux/bootmem.h> |
6 | #include <linux/stacktrace.h> | 6 | #include <linux/stacktrace.h> |
7 | #include <linux/page_owner.h> | 7 | #include <linux/page_owner.h> |
8 | #include <linux/jump_label.h> | ||
8 | #include "internal.h" | 9 | #include "internal.h" |
9 | 10 | ||
10 | static bool page_owner_disabled = true; | 11 | static bool page_owner_disabled = true; |
11 | bool page_owner_inited __read_mostly; | 12 | DEFINE_STATIC_KEY_FALSE(page_owner_inited); |
12 | 13 | ||
13 | static void init_early_allocated_pages(void); | 14 | static void init_early_allocated_pages(void); |
14 | 15 | ||
@@ -37,7 +38,7 @@ static void init_page_owner(void) | |||
37 | if (page_owner_disabled) | 38 | if (page_owner_disabled) |
38 | return; | 39 | return; |
39 | 40 | ||
40 | page_owner_inited = true; | 41 | static_branch_enable(&page_owner_inited); |
41 | init_early_allocated_pages(); | 42 | init_early_allocated_pages(); |
42 | } | 43 | } |
43 | 44 | ||
@@ -147,7 +148,7 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos) | |||
147 | struct page *page; | 148 | struct page *page; |
148 | struct page_ext *page_ext; | 149 | struct page_ext *page_ext; |
149 | 150 | ||
150 | if (!page_owner_inited) | 151 | if (!static_branch_unlikely(&page_owner_inited)) |
151 | return -EINVAL; | 152 | return -EINVAL; |
152 | 153 | ||
153 | page = NULL; | 154 | page = NULL; |
@@ -295,7 +296,7 @@ static int __init pageowner_init(void) | |||
295 | { | 296 | { |
296 | struct dentry *dentry; | 297 | struct dentry *dentry; |
297 | 298 | ||
298 | if (!page_owner_inited) { | 299 | if (!static_branch_unlikely(&page_owner_inited)) { |
299 | pr_info("page_owner is disabled\n"); | 300 | pr_info("page_owner is disabled\n"); |
300 | return 0; | 301 | return 0; |
301 | } | 302 | } |
diff --git a/mm/vmstat.c b/mm/vmstat.c index 72c17981cb70..69ce64f7b8d7 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -1120,7 +1120,7 @@ static void pagetypeinfo_showmixedcount(struct seq_file *m, pg_data_t *pgdat) | |||
1120 | #ifdef CONFIG_PAGE_OWNER | 1120 | #ifdef CONFIG_PAGE_OWNER |
1121 | int mtype; | 1121 | int mtype; |
1122 | 1122 | ||
1123 | if (!page_owner_inited) | 1123 | if (!static_branch_unlikely(&page_owner_inited)) |
1124 | return; | 1124 | return; |
1125 | 1125 | ||
1126 | drain_all_pages(NULL); | 1126 | drain_all_pages(NULL); |