• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/debugfs.h>
3 #include <linux/mm.h>
4 #include <linux/slab.h>
5 #include <linux/uaccess.h>
6 #include <linux/memblock.h>
7 #include <linux/stacktrace.h>
8 #include <linux/page_owner.h>
9 #include <linux/jump_label.h>
10 #include <linux/migrate.h>
11 #include <linux/stackdepot.h>
12 #include <linux/seq_file.h>
13 #include <linux/sched/clock.h>
14 
15 #include "internal.h"
16 
17 /*
18  * TODO: teach PAGE_OWNER_STACK_DEPTH (__dump_page_owner and save_stack)
19  * to use off stack temporal storage
20  */
21 #define PAGE_OWNER_STACK_DEPTH (16)
22 
23 struct page_owner {
24 	unsigned short order;
25 	short last_migrate_reason;
26 	gfp_t gfp_mask;
27 	depot_stack_handle_t handle;
28 	depot_stack_handle_t free_handle;
29 	u64 ts_nsec;
30 	u64 free_ts_nsec;
31 	pid_t pid;
32 };
33 
34 static bool page_owner_enabled = false;
35 DEFINE_STATIC_KEY_FALSE(page_owner_inited);
36 
37 static depot_stack_handle_t dummy_handle;
38 static depot_stack_handle_t failure_handle;
39 static depot_stack_handle_t early_handle;
40 
41 static void init_early_allocated_pages(void);
42 
early_page_owner_param(char * buf)43 static int __init early_page_owner_param(char *buf)
44 {
45 	if (!buf)
46 		return -EINVAL;
47 
48 	if (strcmp(buf, "on") == 0)
49 		page_owner_enabled = true;
50 
51 	return 0;
52 }
53 early_param("page_owner", early_page_owner_param);
54 
need_page_owner(void)55 static bool need_page_owner(void)
56 {
57 	return page_owner_enabled;
58 }
59 
create_dummy_stack(void)60 static __always_inline depot_stack_handle_t create_dummy_stack(void)
61 {
62 	unsigned long entries[4];
63 	unsigned int nr_entries;
64 
65 	nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 0);
66 	return stack_depot_save(entries, nr_entries, GFP_KERNEL);
67 }
68 
register_dummy_stack(void)69 static noinline void register_dummy_stack(void)
70 {
71 	dummy_handle = create_dummy_stack();
72 }
73 
register_failure_stack(void)74 static noinline void register_failure_stack(void)
75 {
76 	failure_handle = create_dummy_stack();
77 }
78 
register_early_stack(void)79 static noinline void register_early_stack(void)
80 {
81 	early_handle = create_dummy_stack();
82 }
83 
init_page_owner(void)84 static void init_page_owner(void)
85 {
86 	if (!page_owner_enabled)
87 		return;
88 
89 	register_dummy_stack();
90 	register_failure_stack();
91 	register_early_stack();
92 	static_branch_enable(&page_owner_inited);
93 	init_early_allocated_pages();
94 }
95 
96 struct page_ext_operations page_owner_ops = {
97 	.size = sizeof(struct page_owner),
98 	.need = need_page_owner,
99 	.init = init_page_owner,
100 };
101 
get_page_owner(struct page_ext * page_ext)102 static inline struct page_owner *get_page_owner(struct page_ext *page_ext)
103 {
104 	return (void *)page_ext + page_owner_ops.offset;
105 }
106 
check_recursive_alloc(unsigned long * entries,unsigned int nr_entries,unsigned long ip)107 static inline bool check_recursive_alloc(unsigned long *entries,
108 					 unsigned int nr_entries,
109 					 unsigned long ip)
110 {
111 	unsigned int i;
112 
113 	for (i = 0; i < nr_entries; i++) {
114 		if (entries[i] == ip)
115 			return true;
116 	}
117 	return false;
118 }
119 
save_stack(gfp_t flags)120 static noinline depot_stack_handle_t save_stack(gfp_t flags)
121 {
122 	unsigned long entries[PAGE_OWNER_STACK_DEPTH];
123 	depot_stack_handle_t handle;
124 	unsigned int nr_entries;
125 
126 	nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 2);
127 
128 	/*
129 	 * We need to check recursion here because our request to
130 	 * stackdepot could trigger memory allocation to save new
131 	 * entry. New memory allocation would reach here and call
132 	 * stack_depot_save_entries() again if we don't catch it. There is
133 	 * still not enough memory in stackdepot so it would try to
134 	 * allocate memory again and loop forever.
135 	 */
136 	if (check_recursive_alloc(entries, nr_entries, _RET_IP_))
137 		return dummy_handle;
138 
139 	handle = stack_depot_save(entries, nr_entries, flags);
140 	if (!handle)
141 		handle = failure_handle;
142 
143 	return handle;
144 }
145 
__reset_page_owner(struct page * page,unsigned int order)146 void __reset_page_owner(struct page *page, unsigned int order)
147 {
148 	int i;
149 	struct page_ext *page_ext;
150 	depot_stack_handle_t handle = 0;
151 	struct page_owner *page_owner;
152 	u64 free_ts_nsec = local_clock();
153 
154 	handle = save_stack(GFP_NOWAIT | __GFP_NOWARN);
155 
156 	page_ext = lookup_page_ext(page);
157 	if (unlikely(!page_ext))
158 		return;
159 	for (i = 0; i < (1 << order); i++) {
160 		__clear_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
161 		page_owner = get_page_owner(page_ext);
162 		page_owner->free_handle = handle;
163 		page_owner->free_ts_nsec = free_ts_nsec;
164 		page_ext = page_ext_next(page_ext);
165 	}
166 }
167 
__set_page_owner_handle(struct page * page,struct page_ext * page_ext,depot_stack_handle_t handle,unsigned int order,gfp_t gfp_mask)168 static inline void __set_page_owner_handle(struct page *page,
169 	struct page_ext *page_ext, depot_stack_handle_t handle,
170 	unsigned int order, gfp_t gfp_mask)
171 {
172 	struct page_owner *page_owner;
173 	int i;
174 
175 	for (i = 0; i < (1 << order); i++) {
176 		page_owner = get_page_owner(page_ext);
177 		page_owner->handle = handle;
178 		page_owner->order = order;
179 		page_owner->gfp_mask = gfp_mask;
180 		page_owner->last_migrate_reason = -1;
181 		page_owner->pid = current->pid;
182 		page_owner->ts_nsec = local_clock();
183 		__set_bit(PAGE_EXT_OWNER, &page_ext->flags);
184 		__set_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
185 
186 		page_ext = page_ext_next(page_ext);
187 	}
188 }
189 
__set_page_owner(struct page * page,unsigned int order,gfp_t gfp_mask)190 noinline void __set_page_owner(struct page *page, unsigned int order,
191 					gfp_t gfp_mask)
192 {
193 	struct page_ext *page_ext = lookup_page_ext(page);
194 	depot_stack_handle_t handle;
195 
196 	if (unlikely(!page_ext))
197 		return;
198 
199 	handle = save_stack(gfp_mask);
200 	__set_page_owner_handle(page, page_ext, handle, order, gfp_mask);
201 }
202 
__set_page_owner_migrate_reason(struct page * page,int reason)203 void __set_page_owner_migrate_reason(struct page *page, int reason)
204 {
205 	struct page_ext *page_ext = lookup_page_ext(page);
206 	struct page_owner *page_owner;
207 
208 	if (unlikely(!page_ext))
209 		return;
210 
211 	page_owner = get_page_owner(page_ext);
212 	page_owner->last_migrate_reason = reason;
213 }
214 
__split_page_owner(struct page * page,unsigned int nr)215 void __split_page_owner(struct page *page, unsigned int nr)
216 {
217 	int i;
218 	struct page_ext *page_ext = lookup_page_ext(page);
219 	struct page_owner *page_owner;
220 
221 	if (unlikely(!page_ext))
222 		return;
223 
224 	for (i = 0; i < nr; i++) {
225 		page_owner = get_page_owner(page_ext);
226 		page_owner->order = 0;
227 		page_ext = page_ext_next(page_ext);
228 	}
229 }
230 
__copy_page_owner(struct page * oldpage,struct page * newpage)231 void __copy_page_owner(struct page *oldpage, struct page *newpage)
232 {
233 	struct page_ext *old_ext = lookup_page_ext(oldpage);
234 	struct page_ext *new_ext = lookup_page_ext(newpage);
235 	struct page_owner *old_page_owner, *new_page_owner;
236 
237 	if (unlikely(!old_ext || !new_ext))
238 		return;
239 
240 	old_page_owner = get_page_owner(old_ext);
241 	new_page_owner = get_page_owner(new_ext);
242 	new_page_owner->order = old_page_owner->order;
243 	new_page_owner->gfp_mask = old_page_owner->gfp_mask;
244 	new_page_owner->last_migrate_reason =
245 		old_page_owner->last_migrate_reason;
246 	new_page_owner->handle = old_page_owner->handle;
247 	new_page_owner->pid = old_page_owner->pid;
248 	new_page_owner->ts_nsec = old_page_owner->ts_nsec;
249 	new_page_owner->free_ts_nsec = old_page_owner->ts_nsec;
250 
251 	/*
252 	 * We don't clear the bit on the oldpage as it's going to be freed
253 	 * after migration. Until then, the info can be useful in case of
254 	 * a bug, and the overal stats will be off a bit only temporarily.
255 	 * Also, migrate_misplaced_transhuge_page() can still fail the
256 	 * migration and then we want the oldpage to retain the info. But
257 	 * in that case we also don't need to explicitly clear the info from
258 	 * the new page, which will be freed.
259 	 */
260 	__set_bit(PAGE_EXT_OWNER, &new_ext->flags);
261 	__set_bit(PAGE_EXT_OWNER_ALLOCATED, &new_ext->flags);
262 }
263 
pagetypeinfo_showmixedcount_print(struct seq_file * m,pg_data_t * pgdat,struct zone * zone)264 void pagetypeinfo_showmixedcount_print(struct seq_file *m,
265 				       pg_data_t *pgdat, struct zone *zone)
266 {
267 	struct page *page;
268 	struct page_ext *page_ext;
269 	struct page_owner *page_owner;
270 	unsigned long pfn = zone->zone_start_pfn, block_end_pfn;
271 	unsigned long end_pfn = pfn + zone->spanned_pages;
272 	unsigned long count[MIGRATE_TYPES] = { 0, };
273 	int pageblock_mt, page_mt;
274 	int i;
275 
276 	/* Scan block by block. First and last block may be incomplete */
277 	pfn = zone->zone_start_pfn;
278 
279 	/*
280 	 * Walk the zone in pageblock_nr_pages steps. If a page block spans
281 	 * a zone boundary, it will be double counted between zones. This does
282 	 * not matter as the mixed block count will still be correct
283 	 */
284 	for (; pfn < end_pfn; ) {
285 		page = pfn_to_online_page(pfn);
286 		if (!page) {
287 			pfn = ALIGN(pfn + 1, MAX_ORDER_NR_PAGES);
288 			continue;
289 		}
290 
291 		block_end_pfn = ALIGN(pfn + 1, pageblock_nr_pages);
292 		block_end_pfn = min(block_end_pfn, end_pfn);
293 
294 		pageblock_mt = get_pageblock_migratetype(page);
295 
296 		for (; pfn < block_end_pfn; pfn++) {
297 			if (!pfn_valid_within(pfn))
298 				continue;
299 
300 			/* The pageblock is online, no need to recheck. */
301 			page = pfn_to_page(pfn);
302 
303 			if (page_zone(page) != zone)
304 				continue;
305 
306 			if (PageBuddy(page)) {
307 				unsigned long freepage_order;
308 
309 				freepage_order = buddy_order_unsafe(page);
310 				if (freepage_order < MAX_ORDER)
311 					pfn += (1UL << freepage_order) - 1;
312 				continue;
313 			}
314 
315 			if (PageReserved(page))
316 				continue;
317 
318 			page_ext = lookup_page_ext(page);
319 			if (unlikely(!page_ext))
320 				continue;
321 
322 			if (!test_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags))
323 				continue;
324 
325 			page_owner = get_page_owner(page_ext);
326 			page_mt = gfp_migratetype(page_owner->gfp_mask);
327 			if (pageblock_mt != page_mt) {
328 				if (is_migrate_cma(pageblock_mt))
329 					count[MIGRATE_MOVABLE]++;
330 				else
331 					count[pageblock_mt]++;
332 
333 				pfn = block_end_pfn;
334 				break;
335 			}
336 			pfn += (1UL << page_owner->order) - 1;
337 		}
338 	}
339 
340 	/* Print counts */
341 	seq_printf(m, "Node %d, zone %8s ", pgdat->node_id, zone->name);
342 	for (i = 0; i < MIGRATE_TYPES; i++)
343 		seq_printf(m, "%12lu ", count[i]);
344 	seq_putc(m, '\n');
345 }
346 
347 static ssize_t
print_page_owner(char __user * buf,size_t count,unsigned long pfn,struct page * page,struct page_owner * page_owner,depot_stack_handle_t handle)348 print_page_owner(char __user *buf, size_t count, unsigned long pfn,
349 		struct page *page, struct page_owner *page_owner,
350 		depot_stack_handle_t handle)
351 {
352 	int ret, pageblock_mt, page_mt;
353 	unsigned long *entries;
354 	unsigned int nr_entries;
355 	char *kbuf;
356 
357 	count = min_t(size_t, count, PAGE_SIZE);
358 	kbuf = kmalloc(count, GFP_KERNEL);
359 	if (!kbuf)
360 		return -ENOMEM;
361 
362 	ret = snprintf(kbuf, count,
363 			"Page allocated via order %u, mask %#x(%pGg), pid %d, ts %llu ns, free_ts %llu ns\n",
364 			page_owner->order, page_owner->gfp_mask,
365 			&page_owner->gfp_mask, page_owner->pid,
366 			page_owner->ts_nsec, page_owner->free_ts_nsec);
367 
368 	if (ret >= count)
369 		goto err;
370 
371 	/* Print information relevant to grouping pages by mobility */
372 	pageblock_mt = get_pageblock_migratetype(page);
373 	page_mt  = gfp_migratetype(page_owner->gfp_mask);
374 	ret += snprintf(kbuf + ret, count - ret,
375 			"PFN %lu type %s Block %lu type %s Flags %#lx(%pGp)\n",
376 			pfn,
377 			migratetype_names[page_mt],
378 			pfn >> pageblock_order,
379 			migratetype_names[pageblock_mt],
380 			page->flags, &page->flags);
381 
382 	if (ret >= count)
383 		goto err;
384 
385 	nr_entries = stack_depot_fetch(handle, &entries);
386 	ret += stack_trace_snprint(kbuf + ret, count - ret, entries, nr_entries, 0);
387 	if (ret >= count)
388 		goto err;
389 
390 	if (page_owner->last_migrate_reason != -1) {
391 		ret += snprintf(kbuf + ret, count - ret,
392 			"Page has been migrated, last migrate reason: %s\n",
393 			migrate_reason_names[page_owner->last_migrate_reason]);
394 		if (ret >= count)
395 			goto err;
396 	}
397 
398 	ret += snprintf(kbuf + ret, count - ret, "\n");
399 	if (ret >= count)
400 		goto err;
401 
402 	if (copy_to_user(buf, kbuf, ret))
403 		ret = -EFAULT;
404 
405 	kfree(kbuf);
406 	return ret;
407 
408 err:
409 	kfree(kbuf);
410 	return -ENOMEM;
411 }
412 
__dump_page_owner(struct page * page)413 void __dump_page_owner(struct page *page)
414 {
415 	struct page_ext *page_ext = lookup_page_ext(page);
416 	struct page_owner *page_owner;
417 	depot_stack_handle_t handle;
418 	unsigned long *entries;
419 	unsigned int nr_entries;
420 	gfp_t gfp_mask;
421 	int mt;
422 
423 	if (unlikely(!page_ext)) {
424 		pr_alert("There is not page extension available.\n");
425 		return;
426 	}
427 
428 	page_owner = get_page_owner(page_ext);
429 	gfp_mask = page_owner->gfp_mask;
430 	mt = gfp_migratetype(gfp_mask);
431 
432 	if (!test_bit(PAGE_EXT_OWNER, &page_ext->flags)) {
433 		pr_alert("page_owner info is not present (never set?)\n");
434 		return;
435 	}
436 
437 	if (test_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags))
438 		pr_alert("page_owner tracks the page as allocated\n");
439 	else
440 		pr_alert("page_owner tracks the page as freed\n");
441 
442 	pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, ts %llu, free_ts %llu\n",
443 		 page_owner->order, migratetype_names[mt], gfp_mask, &gfp_mask,
444 		 page_owner->pid, page_owner->ts_nsec, page_owner->free_ts_nsec);
445 
446 	handle = READ_ONCE(page_owner->handle);
447 	if (!handle) {
448 		pr_alert("page_owner allocation stack trace missing\n");
449 	} else {
450 		nr_entries = stack_depot_fetch(handle, &entries);
451 		stack_trace_print(entries, nr_entries, 0);
452 	}
453 
454 	handle = READ_ONCE(page_owner->free_handle);
455 	if (!handle) {
456 		pr_alert("page_owner free stack trace missing\n");
457 	} else {
458 		nr_entries = stack_depot_fetch(handle, &entries);
459 		pr_alert("page last free stack trace:\n");
460 		stack_trace_print(entries, nr_entries, 0);
461 	}
462 
463 	if (page_owner->last_migrate_reason != -1)
464 		pr_alert("page has been migrated, last migrate reason: %s\n",
465 			migrate_reason_names[page_owner->last_migrate_reason]);
466 }
467 
468 static ssize_t
read_page_owner(struct file * file,char __user * buf,size_t count,loff_t * ppos)469 read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos)
470 {
471 	unsigned long pfn;
472 	struct page *page;
473 	struct page_ext *page_ext;
474 	struct page_owner *page_owner;
475 	depot_stack_handle_t handle;
476 
477 	if (!static_branch_unlikely(&page_owner_inited))
478 		return -EINVAL;
479 
480 	page = NULL;
481 	pfn = min_low_pfn + *ppos;
482 
483 	/* Find a valid PFN or the start of a MAX_ORDER_NR_PAGES area */
484 	while (!pfn_valid(pfn) && (pfn & (MAX_ORDER_NR_PAGES - 1)) != 0)
485 		pfn++;
486 
487 	drain_all_pages(NULL);
488 
489 	/* Find an allocated page */
490 	for (; pfn < max_pfn; pfn++) {
491 		/*
492 		 * If the new page is in a new MAX_ORDER_NR_PAGES area,
493 		 * validate the area as existing, skip it if not
494 		 */
495 		if ((pfn & (MAX_ORDER_NR_PAGES - 1)) == 0 && !pfn_valid(pfn)) {
496 			pfn += MAX_ORDER_NR_PAGES - 1;
497 			continue;
498 		}
499 
500 		/* Check for holes within a MAX_ORDER area */
501 		if (!pfn_valid_within(pfn))
502 			continue;
503 
504 		page = pfn_to_page(pfn);
505 		if (PageBuddy(page)) {
506 			unsigned long freepage_order = buddy_order_unsafe(page);
507 
508 			if (freepage_order < MAX_ORDER)
509 				pfn += (1UL << freepage_order) - 1;
510 			continue;
511 		}
512 
513 		page_ext = lookup_page_ext(page);
514 		if (unlikely(!page_ext))
515 			continue;
516 
517 		/*
518 		 * Some pages could be missed by concurrent allocation or free,
519 		 * because we don't hold the zone lock.
520 		 */
521 		if (!test_bit(PAGE_EXT_OWNER, &page_ext->flags))
522 			continue;
523 
524 		/*
525 		 * Although we do have the info about past allocation of free
526 		 * pages, it's not relevant for current memory usage.
527 		 */
528 		if (!test_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags))
529 			continue;
530 
531 		page_owner = get_page_owner(page_ext);
532 
533 		/*
534 		 * Don't print "tail" pages of high-order allocations as that
535 		 * would inflate the stats.
536 		 */
537 		if (!IS_ALIGNED(pfn, 1 << page_owner->order))
538 			continue;
539 
540 		/*
541 		 * Access to page_ext->handle isn't synchronous so we should
542 		 * be careful to access it.
543 		 */
544 		handle = READ_ONCE(page_owner->handle);
545 		if (!handle)
546 			continue;
547 
548 		/* Record the next PFN to read in the file offset */
549 		*ppos = (pfn - min_low_pfn) + 1;
550 
551 		return print_page_owner(buf, count, pfn, page,
552 				page_owner, handle);
553 	}
554 
555 	return 0;
556 }
557 
init_pages_in_zone(pg_data_t * pgdat,struct zone * zone)558 static void init_pages_in_zone(pg_data_t *pgdat, struct zone *zone)
559 {
560 	unsigned long pfn = zone->zone_start_pfn;
561 	unsigned long end_pfn = zone_end_pfn(zone);
562 	unsigned long count = 0;
563 
564 	/*
565 	 * Walk the zone in pageblock_nr_pages steps. If a page block spans
566 	 * a zone boundary, it will be double counted between zones. This does
567 	 * not matter as the mixed block count will still be correct
568 	 */
569 	for (; pfn < end_pfn; ) {
570 		unsigned long block_end_pfn;
571 
572 		if (!pfn_valid(pfn)) {
573 			pfn = ALIGN(pfn + 1, MAX_ORDER_NR_PAGES);
574 			continue;
575 		}
576 
577 		block_end_pfn = ALIGN(pfn + 1, pageblock_nr_pages);
578 		block_end_pfn = min(block_end_pfn, end_pfn);
579 
580 		for (; pfn < block_end_pfn; pfn++) {
581 			struct page *page;
582 			struct page_ext *page_ext;
583 
584 			if (!pfn_valid_within(pfn))
585 				continue;
586 
587 			page = pfn_to_page(pfn);
588 
589 			if (page_zone(page) != zone)
590 				continue;
591 
592 			/*
593 			 * To avoid having to grab zone->lock, be a little
594 			 * careful when reading buddy page order. The only
595 			 * danger is that we skip too much and potentially miss
596 			 * some early allocated pages, which is better than
597 			 * heavy lock contention.
598 			 */
599 			if (PageBuddy(page)) {
600 				unsigned long order = buddy_order_unsafe(page);
601 
602 				if (order > 0 && order < MAX_ORDER)
603 					pfn += (1UL << order) - 1;
604 				continue;
605 			}
606 
607 			if (PageReserved(page))
608 				continue;
609 
610 			page_ext = lookup_page_ext(page);
611 			if (unlikely(!page_ext))
612 				continue;
613 
614 			/* Maybe overlapping zone */
615 			if (test_bit(PAGE_EXT_OWNER, &page_ext->flags))
616 				continue;
617 
618 			/* Found early allocated page */
619 			__set_page_owner_handle(page, page_ext, early_handle,
620 						0, 0);
621 			count++;
622 		}
623 		cond_resched();
624 	}
625 
626 	pr_info("Node %d, zone %8s: page owner found early allocated %lu pages\n",
627 		pgdat->node_id, zone->name, count);
628 }
629 
init_zones_in_node(pg_data_t * pgdat)630 static void init_zones_in_node(pg_data_t *pgdat)
631 {
632 	struct zone *zone;
633 	struct zone *node_zones = pgdat->node_zones;
634 
635 	for (zone = node_zones; zone - node_zones < MAX_NR_ZONES; ++zone) {
636 		if (!populated_zone(zone))
637 			continue;
638 
639 		init_pages_in_zone(pgdat, zone);
640 	}
641 }
642 
init_early_allocated_pages(void)643 static void init_early_allocated_pages(void)
644 {
645 	pg_data_t *pgdat;
646 
647 	for_each_online_pgdat(pgdat)
648 		init_zones_in_node(pgdat);
649 }
650 
651 static const struct file_operations proc_page_owner_operations = {
652 	.read		= read_page_owner,
653 };
654 
pageowner_init(void)655 static int __init pageowner_init(void)
656 {
657 	if (!static_branch_unlikely(&page_owner_inited)) {
658 		pr_info("page_owner is disabled\n");
659 		return 0;
660 	}
661 
662 	debugfs_create_file("page_owner", 0400, NULL, NULL,
663 			    &proc_page_owner_operations);
664 
665 	return 0;
666 }
667 late_initcall(pageowner_init)
668