xref: /OK3568_Linux_fs/kernel/include/linux/page_pinner.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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