mirror of https://gitee.com/openkylin/linux.git
mm/page_owner.c: remove unnecessary stack_trace field
Page owner uses the page_ext structure to keep meta-information for every page in the system. The structure also contains a field of type 'struct stack_trace', page owner uses this field during invocation of the function save_stack_trace. It is easy to notice that keeping a copy of this structure for every page in the system is very inefficiently in terms of memory. The patch removes this unnecessary field of page_ext and forces page owner to use a stack_trace structure allocated on the stack. [akpm@linux-foundation.org: use struct initializers] Signed-off-by: Sergei Rogachev <rogachevsergei@gmail.com> Acked-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
740a5ddb0e
commit
94f759d62b
|
@ -40,7 +40,7 @@ struct page_ext {
|
|||
#ifdef CONFIG_PAGE_OWNER
|
||||
unsigned int order;
|
||||
gfp_t gfp_mask;
|
||||
struct stack_trace trace;
|
||||
unsigned int nr_entries;
|
||||
unsigned long trace_entries[8];
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -59,20 +59,19 @@ void __reset_page_owner(struct page *page, unsigned int order)
|
|||
|
||||
void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask)
|
||||
{
|
||||
struct page_ext *page_ext;
|
||||
struct stack_trace *trace;
|
||||
struct page_ext *page_ext = lookup_page_ext(page);
|
||||
struct stack_trace trace = {
|
||||
.nr_entries = 0,
|
||||
.max_entries = ARRAY_SIZE(page_ext->trace_entries),
|
||||
.entries = &page_ext->trace_entries[0],
|
||||
.skip = 3,
|
||||
};
|
||||
|
||||
page_ext = lookup_page_ext(page);
|
||||
|
||||
trace = &page_ext->trace;
|
||||
trace->nr_entries = 0;
|
||||
trace->max_entries = ARRAY_SIZE(page_ext->trace_entries);
|
||||
trace->entries = &page_ext->trace_entries[0];
|
||||
trace->skip = 3;
|
||||
save_stack_trace(&page_ext->trace);
|
||||
save_stack_trace(&trace);
|
||||
|
||||
page_ext->order = order;
|
||||
page_ext->gfp_mask = gfp_mask;
|
||||
page_ext->nr_entries = trace.nr_entries;
|
||||
|
||||
__set_bit(PAGE_EXT_OWNER, &page_ext->flags);
|
||||
}
|
||||
|
@ -84,6 +83,10 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn,
|
|||
int ret;
|
||||
int pageblock_mt, page_mt;
|
||||
char *kbuf;
|
||||
struct stack_trace trace = {
|
||||
.nr_entries = page_ext->nr_entries,
|
||||
.entries = &page_ext->trace_entries[0],
|
||||
};
|
||||
|
||||
kbuf = kmalloc(count, GFP_KERNEL);
|
||||
if (!kbuf)
|
||||
|
@ -121,8 +124,7 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn,
|
|||
if (ret >= count)
|
||||
goto err;
|
||||
|
||||
ret += snprint_stack_trace(kbuf + ret, count - ret,
|
||||
&page_ext->trace, 0);
|
||||
ret += snprint_stack_trace(kbuf + ret, count - ret, &trace, 0);
|
||||
if (ret >= count)
|
||||
goto err;
|
||||
|
||||
|
|
Loading…
Reference in New Issue