@@ -55,20 +55,26 @@ void __reset_page_owner(struct page *page, unsigned int order)
5555
5656 for (i = 0 ; i < (1 << order ); i ++ ) {
5757 page_ext = lookup_page_ext (page + i );
58+ if (unlikely (!page_ext ))
59+ continue ;
5860 __clear_bit (PAGE_EXT_OWNER , & page_ext -> flags );
5961 }
6062}
6163
6264void __set_page_owner (struct page * page , unsigned int order , gfp_t gfp_mask )
6365{
6466 struct page_ext * page_ext = lookup_page_ext (page );
67+
6568 struct stack_trace trace = {
6669 .nr_entries = 0 ,
6770 .max_entries = ARRAY_SIZE (page_ext -> trace_entries ),
6871 .entries = & page_ext -> trace_entries [0 ],
6972 .skip = 3 ,
7073 };
7174
75+ if (unlikely (!page_ext ))
76+ return ;
77+
7278 save_stack_trace (& trace );
7379
7480 page_ext -> order = order ;
@@ -82,13 +88,21 @@ void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask)
8288void __set_page_owner_migrate_reason (struct page * page , int reason )
8389{
8490 struct page_ext * page_ext = lookup_page_ext (page );
91+ if (unlikely (!page_ext ))
92+ return ;
8593
8694 page_ext -> last_migrate_reason = reason ;
8795}
8896
8997gfp_t __get_page_owner_gfp (struct page * page )
9098{
9199 struct page_ext * page_ext = lookup_page_ext (page );
100+ if (unlikely (!page_ext ))
101+ /*
102+ * The caller just returns 0 if no valid gfp
103+ * So return 0 here too.
104+ */
105+ return 0 ;
92106
93107 return page_ext -> gfp_mask ;
94108}
@@ -99,6 +113,9 @@ void __copy_page_owner(struct page *oldpage, struct page *newpage)
99113 struct page_ext * new_ext = lookup_page_ext (newpage );
100114 int i ;
101115
116+ if (unlikely (!old_ext || !new_ext ))
117+ return ;
118+
102119 new_ext -> order = old_ext -> order ;
103120 new_ext -> gfp_mask = old_ext -> gfp_mask ;
104121 new_ext -> nr_entries = old_ext -> nr_entries ;
@@ -193,6 +210,11 @@ void __dump_page_owner(struct page *page)
193210 gfp_t gfp_mask = page_ext -> gfp_mask ;
194211 int mt = gfpflags_to_migratetype (gfp_mask );
195212
213+ if (unlikely (!page_ext )) {
214+ pr_alert ("There is not page extension available.\n" );
215+ return ;
216+ }
217+
196218 if (!test_bit (PAGE_EXT_OWNER , & page_ext -> flags )) {
197219 pr_alert ("page_owner info is not active (free page?)\n" );
198220 return ;
@@ -251,6 +273,8 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos)
251273 }
252274
253275 page_ext = lookup_page_ext (page );
276+ if (unlikely (!page_ext ))
277+ continue ;
254278
255279 /*
256280 * 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)
317341 continue ;
318342
319343 page_ext = lookup_page_ext (page );
344+ if (unlikely (!page_ext ))
345+ continue ;
320346
321347 /* Maybe overraping zone */
322348 if (test_bit (PAGE_EXT_OWNER , & page_ext -> flags ))
0 commit comments