|
@@ -55,6 +55,8 @@ void __reset_page_owner(struct page *page, unsigned int order)
|
|
|
|
|
|
for (i = 0; i < (1 << order); i++) {
|
|
for (i = 0; i < (1 << order); i++) {
|
|
page_ext = lookup_page_ext(page + i);
|
|
page_ext = lookup_page_ext(page + i);
|
|
|
|
+ if (unlikely(!page_ext))
|
|
|
|
+ continue;
|
|
__clear_bit(PAGE_EXT_OWNER, &page_ext->flags);
|
|
__clear_bit(PAGE_EXT_OWNER, &page_ext->flags);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -62,6 +64,7 @@ void __reset_page_owner(struct page *page, unsigned int order)
|
|
void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask)
|
|
void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask)
|
|
{
|
|
{
|
|
struct page_ext *page_ext = lookup_page_ext(page);
|
|
struct page_ext *page_ext = lookup_page_ext(page);
|
|
|
|
+
|
|
struct stack_trace trace = {
|
|
struct stack_trace trace = {
|
|
.nr_entries = 0,
|
|
.nr_entries = 0,
|
|
.max_entries = ARRAY_SIZE(page_ext->trace_entries),
|
|
.max_entries = ARRAY_SIZE(page_ext->trace_entries),
|
|
@@ -69,6 +72,9 @@ void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask)
|
|
.skip = 3,
|
|
.skip = 3,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ if (unlikely(!page_ext))
|
|
|
|
+ return;
|
|
|
|
+
|
|
save_stack_trace(&trace);
|
|
save_stack_trace(&trace);
|
|
|
|
|
|
page_ext->order = order;
|
|
page_ext->order = order;
|
|
@@ -82,6 +88,8 @@ void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask)
|
|
void __set_page_owner_migrate_reason(struct page *page, int reason)
|
|
void __set_page_owner_migrate_reason(struct page *page, int reason)
|
|
{
|
|
{
|
|
struct page_ext *page_ext = lookup_page_ext(page);
|
|
struct page_ext *page_ext = lookup_page_ext(page);
|
|
|
|
+ if (unlikely(!page_ext))
|
|
|
|
+ return;
|
|
|
|
|
|
page_ext->last_migrate_reason = reason;
|
|
page_ext->last_migrate_reason = reason;
|
|
}
|
|
}
|
|
@@ -89,6 +97,12 @@ void __set_page_owner_migrate_reason(struct page *page, int reason)
|
|
gfp_t __get_page_owner_gfp(struct page *page)
|
|
gfp_t __get_page_owner_gfp(struct page *page)
|
|
{
|
|
{
|
|
struct page_ext *page_ext = lookup_page_ext(page);
|
|
struct page_ext *page_ext = lookup_page_ext(page);
|
|
|
|
+ if (unlikely(!page_ext))
|
|
|
|
+ /*
|
|
|
|
+ * The caller just returns 0 if no valid gfp
|
|
|
|
+ * So return 0 here too.
|
|
|
|
+ */
|
|
|
|
+ return 0;
|
|
|
|
|
|
return page_ext->gfp_mask;
|
|
return page_ext->gfp_mask;
|
|
}
|
|
}
|
|
@@ -99,6 +113,9 @@ void __copy_page_owner(struct page *oldpage, struct page *newpage)
|
|
struct page_ext *new_ext = lookup_page_ext(newpage);
|
|
struct page_ext *new_ext = lookup_page_ext(newpage);
|
|
int i;
|
|
int i;
|
|
|
|
|
|
|
|
+ if (unlikely(!old_ext || !new_ext))
|
|
|
|
+ return;
|
|
|
|
+
|
|
new_ext->order = old_ext->order;
|
|
new_ext->order = old_ext->order;
|
|
new_ext->gfp_mask = old_ext->gfp_mask;
|
|
new_ext->gfp_mask = old_ext->gfp_mask;
|
|
new_ext->nr_entries = old_ext->nr_entries;
|
|
new_ext->nr_entries = old_ext->nr_entries;
|
|
@@ -193,6 +210,11 @@ void __dump_page_owner(struct page *page)
|
|
gfp_t gfp_mask = page_ext->gfp_mask;
|
|
gfp_t gfp_mask = page_ext->gfp_mask;
|
|
int mt = gfpflags_to_migratetype(gfp_mask);
|
|
int mt = gfpflags_to_migratetype(gfp_mask);
|
|
|
|
|
|
|
|
+ if (unlikely(!page_ext)) {
|
|
|
|
+ pr_alert("There is not page extension available.\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (!test_bit(PAGE_EXT_OWNER, &page_ext->flags)) {
|
|
if (!test_bit(PAGE_EXT_OWNER, &page_ext->flags)) {
|
|
pr_alert("page_owner info is not active (free page?)\n");
|
|
pr_alert("page_owner info is not active (free page?)\n");
|
|
return;
|
|
return;
|
|
@@ -251,6 +273,8 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
|
}
|
|
}
|
|
|
|
|
|
page_ext = lookup_page_ext(page);
|
|
page_ext = lookup_page_ext(page);
|
|
|
|
+ if (unlikely(!page_ext))
|
|
|
|
+ continue;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Some pages could be missed by concurrent allocation or free,
|
|
* Some pages could be missed by concurrent allocation or free,
|
|
@@ -317,6 +341,8 @@ static void init_pages_in_zone(pg_data_t *pgdat, struct zone *zone)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
page_ext = lookup_page_ext(page);
|
|
page_ext = lookup_page_ext(page);
|
|
|
|
+ if (unlikely(!page_ext))
|
|
|
|
+ continue;
|
|
|
|
|
|
/* Maybe overraping zone */
|
|
/* Maybe overraping zone */
|
|
if (test_bit(PAGE_EXT_OWNER, &page_ext->flags))
|
|
if (test_bit(PAGE_EXT_OWNER, &page_ext->flags))
|