Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_FRONTSWAP_H 3 : : #define _LINUX_FRONTSWAP_H 4 : : 5 : : #include <linux/swap.h> 6 : : #include <linux/mm.h> 7 : : #include <linux/bitops.h> 8 : : #include <linux/jump_label.h> 9 : : 10 : : /* 11 : : * Return code to denote that requested number of 12 : : * frontswap pages are unused(moved to page cache). 13 : : * Used in in shmem_unuse and try_to_unuse. 14 : : */ 15 : : #define FRONTSWAP_PAGES_UNUSED 2 16 : : 17 : : struct frontswap_ops { 18 : : void (*init)(unsigned); /* this swap type was just swapon'ed */ 19 : : int (*store)(unsigned, pgoff_t, struct page *); /* store a page */ 20 : : int (*load)(unsigned, pgoff_t, struct page *); /* load a page */ 21 : : void (*invalidate_page)(unsigned, pgoff_t); /* page no longer needed */ 22 : : void (*invalidate_area)(unsigned); /* swap type just swapoff'ed */ 23 : : struct frontswap_ops *next; /* private pointer to next ops */ 24 : : }; 25 : : 26 : : extern void frontswap_register_ops(struct frontswap_ops *ops); 27 : : extern void frontswap_shrink(unsigned long); 28 : : extern unsigned long frontswap_curr_pages(void); 29 : : extern void frontswap_writethrough(bool); 30 : : #define FRONTSWAP_HAS_EXCLUSIVE_GETS 31 : : extern void frontswap_tmem_exclusive_gets(bool); 32 : : 33 : : extern bool __frontswap_test(struct swap_info_struct *, pgoff_t); 34 : : extern void __frontswap_init(unsigned type, unsigned long *map); 35 : : extern int __frontswap_store(struct page *page); 36 : : extern int __frontswap_load(struct page *page); 37 : : extern void __frontswap_invalidate_page(unsigned, pgoff_t); 38 : : extern void __frontswap_invalidate_area(unsigned); 39 : : 40 : : #ifdef CONFIG_FRONTSWAP 41 : : extern struct static_key_false frontswap_enabled_key; 42 : : 43 : : static inline bool frontswap_enabled(void) 44 : : { 45 : : return static_branch_unlikely(&frontswap_enabled_key); 46 : : } 47 : : 48 : : static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 49 : : { 50 : : return __frontswap_test(sis, offset); 51 : : } 52 : : 53 : : static inline void frontswap_map_set(struct swap_info_struct *p, 54 : : unsigned long *map) 55 : : { 56 : : p->frontswap_map = map; 57 : : } 58 : : 59 : : static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 60 : : { 61 : : return p->frontswap_map; 62 : : } 63 : : #else 64 : : /* all inline routines become no-ops and all externs are ignored */ 65 : : 66 : 0 : static inline bool frontswap_enabled(void) 67 : : { 68 : 0 : return false; 69 : : } 70 : : 71 : 0 : static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 72 : : { 73 : 0 : return false; 74 : : } 75 : : 76 : 0 : static inline void frontswap_map_set(struct swap_info_struct *p, 77 : : unsigned long *map) 78 : : { 79 : 0 : } 80 : : 81 : 0 : static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 82 : : { 83 : 0 : return NULL; 84 : : } 85 : : #endif 86 : : 87 : 0 : static inline int frontswap_store(struct page *page) 88 : : { 89 : 0 : if (frontswap_enabled()) 90 : : return __frontswap_store(page); 91 : : 92 : 0 : return -1; 93 : : } 94 : : 95 : 0 : static inline int frontswap_load(struct page *page) 96 : : { 97 : 0 : if (frontswap_enabled()) 98 : : return __frontswap_load(page); 99 : : 100 [ # # ]: 0 : return -1; 101 : : } 102 : : 103 : 0 : static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset) 104 : : { 105 [ # # ]: 0 : if (frontswap_enabled()) 106 : : __frontswap_invalidate_page(type, offset); 107 : : } 108 : : 109 : 0 : static inline void frontswap_invalidate_area(unsigned type) 110 : : { 111 : 0 : if (frontswap_enabled()) 112 : : __frontswap_invalidate_area(type); 113 : : } 114 : : 115 : : static inline void frontswap_init(unsigned type, unsigned long *map) 116 : : { 117 : : #ifdef CONFIG_FRONTSWAP 118 : : __frontswap_init(type, map); 119 : : #endif 120 : : } 121 : : 122 : : #endif /* _LINUX_FRONTSWAP_H */