1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LINUX_PAGE_PINNER_H
3 #define __LINUX_PAGE_PINNER_H
4
5 #include <linux/jump_label.h>
6
7 #ifdef CONFIG_PAGE_PINNER
8 extern struct static_key_false page_pinner_inited;
9 extern struct static_key_true failure_tracking;
10 extern struct page_ext_operations page_pinner_ops;
11
12 extern void __reset_page_pinner(struct page *page, unsigned int order, bool free);
13 extern void __set_page_pinner(struct page *page, unsigned int order);
14 extern void __dump_page_pinner(struct page *page);
15 void __page_pinner_migration_failed(struct page *page);
16 void __page_pinner_mark_migration_failed_pages(struct list_head *page_list);
17
reset_page_pinner(struct page * page,unsigned int order)18 static inline void reset_page_pinner(struct page *page, unsigned int order)
19 {
20 if (static_branch_unlikely(&page_pinner_inited))
21 __reset_page_pinner(page, order, false);
22 }
23
free_page_pinner(struct page * page,unsigned int order)24 static inline void free_page_pinner(struct page *page, unsigned int order)
25 {
26 if (static_branch_unlikely(&page_pinner_inited))
27 __reset_page_pinner(page, order, true);
28 }
29
set_page_pinner(struct page * page,unsigned int order)30 static inline void set_page_pinner(struct page *page, unsigned int order)
31 {
32 if (static_branch_unlikely(&page_pinner_inited))
33 __set_page_pinner(page, order);
34 }
35
dump_page_pinner(struct page * page)36 static inline void dump_page_pinner(struct page *page)
37 {
38 if (static_branch_unlikely(&page_pinner_inited))
39 __dump_page_pinner(page);
40 }
41
page_pinner_put_page(struct page * page)42 static inline void page_pinner_put_page(struct page *page)
43 {
44 if (!static_branch_unlikely(&failure_tracking))
45 return;
46
47 __page_pinner_migration_failed(page);
48 }
49
page_pinner_failure_detect(struct page * page)50 static inline void page_pinner_failure_detect(struct page *page)
51 {
52 if (!static_branch_unlikely(&failure_tracking))
53 return;
54
55 __page_pinner_migration_failed(page);
56 }
57
page_pinner_mark_migration_failed_pages(struct list_head * page_list)58 static inline void page_pinner_mark_migration_failed_pages(struct list_head *page_list)
59 {
60 if (!static_branch_unlikely(&failure_tracking))
61 return;
62
63 __page_pinner_mark_migration_failed_pages(page_list);
64 }
65 #else
reset_page_pinner(struct page * page,unsigned int order)66 static inline void reset_page_pinner(struct page *page, unsigned int order)
67 {
68 }
free_page_pinner(struct page * page,unsigned int order)69 static inline void free_page_pinner(struct page *page, unsigned int order)
70 {
71 }
set_page_pinner(struct page * page,unsigned int order)72 static inline void set_page_pinner(struct page *page, unsigned int order)
73 {
74 }
dump_page_pinner(struct page * page)75 static inline void dump_page_pinner(struct page *page)
76 {
77 }
page_pinner_put_page(struct page * page)78 static inline void page_pinner_put_page(struct page *page)
79 {
80 }
page_pinner_failure_detect(struct page * page)81 static inline void page_pinner_failure_detect(struct page *page)
82 {
83 }
page_pinner_mark_migration_failed_pages(struct list_head * page_list)84 static inline void page_pinner_mark_migration_failed_pages(struct list_head *page_list)
85 {
86 }
87 #endif /* CONFIG_PAGE_PINNER */
88 #endif /* __LINUX_PAGE_PINNER_H */
89