Skip to content

Commit

Permalink
mm, page_owner: convert page_owner_inited to static key
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Cc: Joonsoo Kim <[email protected]>
Cc: Minchan Kim <[email protected]>
Cc: Sasha Levin <[email protected]>
Cc: "Kirill A. Shutemov" <[email protected]>
Cc: Mel Gorman <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
tehcaster authored and torvalds committed Mar 15, 2016
1 parent 60f3035 commit 7dd80b8
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 21 deletions.
9 changes: 5 additions & 4 deletions Documentation/vm/page_owner.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ with page owner and page owner is disabled in runtime due to no enabling
boot option, runtime overhead is marginal. If disabled in runtime, it
doesn't require memory to store owner information, so there is no runtime
memory overhead. And, page owner inserts just two unlikely branches into
the page allocator hotpath and if it returns false then allocation is
done like as the kernel without page owner. These two unlikely branches
would not affect to allocation performance. Following is the kernel's
code size change due to this facility.
the page allocator hotpath and if not enabled, then allocation is done
like as the kernel without page owner. These two unlikely branches should
not affect to allocation performance, especially if the static keys jump
label patching functionality is available. Following is the kernel's code
size change due to this facility.

- Without page owner
text data bss dec hex filename
Expand Down
22 changes: 10 additions & 12 deletions include/linux/page_owner.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#ifndef __LINUX_PAGE_OWNER_H
#define __LINUX_PAGE_OWNER_H

#include <linux/jump_label.h>

#ifdef CONFIG_PAGE_OWNER
extern bool page_owner_inited;
extern struct static_key_false page_owner_inited;
extern struct page_ext_operations page_owner_ops;

extern void __reset_page_owner(struct page *page, unsigned int order);
Expand All @@ -12,27 +14,23 @@ extern gfp_t __get_page_owner_gfp(struct page *page);

static inline void reset_page_owner(struct page *page, unsigned int order)
{
if (likely(!page_owner_inited))
return;

__reset_page_owner(page, order);
if (static_branch_unlikely(&page_owner_inited))
__reset_page_owner(page, order);
}

static inline void set_page_owner(struct page *page,
unsigned int order, gfp_t gfp_mask)
{
if (likely(!page_owner_inited))
return;

__set_page_owner(page, order, gfp_mask);
if (static_branch_unlikely(&page_owner_inited))
__set_page_owner(page, order, gfp_mask);
}

static inline gfp_t get_page_owner_gfp(struct page *page)
{
if (likely(!page_owner_inited))
if (static_branch_unlikely(&page_owner_inited))
return __get_page_owner_gfp(page);
else
return 0;

return __get_page_owner_gfp(page);
}
#else
static inline void reset_page_owner(struct page *page, unsigned int order)
Expand Down
9 changes: 5 additions & 4 deletions mm/page_owner.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
#include <linux/bootmem.h>
#include <linux/stacktrace.h>
#include <linux/page_owner.h>
#include <linux/jump_label.h>
#include "internal.h"

static bool page_owner_disabled = true;
bool page_owner_inited __read_mostly;
DEFINE_STATIC_KEY_FALSE(page_owner_inited);

static void init_early_allocated_pages(void);

Expand Down Expand Up @@ -37,7 +38,7 @@ static void init_page_owner(void)
if (page_owner_disabled)
return;

page_owner_inited = true;
static_branch_enable(&page_owner_inited);
init_early_allocated_pages();
}

Expand Down Expand Up @@ -147,7 +148,7 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos)
struct page *page;
struct page_ext *page_ext;

if (!page_owner_inited)
if (!static_branch_unlikely(&page_owner_inited))
return -EINVAL;

page = NULL;
Expand Down Expand Up @@ -295,7 +296,7 @@ static int __init pageowner_init(void)
{
struct dentry *dentry;

if (!page_owner_inited) {
if (!static_branch_unlikely(&page_owner_inited)) {
pr_info("page_owner is disabled\n");
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion mm/vmstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1120,7 +1120,7 @@ static void pagetypeinfo_showmixedcount(struct seq_file *m, pg_data_t *pgdat)
#ifdef CONFIG_PAGE_OWNER
int mtype;

if (!page_owner_inited)
if (!static_branch_unlikely(&page_owner_inited))
return;

drain_all_pages(NULL);
Expand Down

0 comments on commit 7dd80b8

Please sign in to comment.