at v4.18 2.9 kB view raw
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 10struct frontswap_ops { 11 void (*init)(unsigned); /* this swap type was just swapon'ed */ 12 int (*store)(unsigned, pgoff_t, struct page *); /* store a page */ 13 int (*load)(unsigned, pgoff_t, struct page *); /* load a page */ 14 void (*invalidate_page)(unsigned, pgoff_t); /* page no longer needed */ 15 void (*invalidate_area)(unsigned); /* swap type just swapoff'ed */ 16 struct frontswap_ops *next; /* private pointer to next ops */ 17}; 18 19extern void frontswap_register_ops(struct frontswap_ops *ops); 20extern void frontswap_shrink(unsigned long); 21extern unsigned long frontswap_curr_pages(void); 22extern void frontswap_writethrough(bool); 23#define FRONTSWAP_HAS_EXCLUSIVE_GETS 24extern void frontswap_tmem_exclusive_gets(bool); 25 26extern bool __frontswap_test(struct swap_info_struct *, pgoff_t); 27extern void __frontswap_init(unsigned type, unsigned long *map); 28extern int __frontswap_store(struct page *page); 29extern int __frontswap_load(struct page *page); 30extern void __frontswap_invalidate_page(unsigned, pgoff_t); 31extern void __frontswap_invalidate_area(unsigned); 32 33#ifdef CONFIG_FRONTSWAP 34extern struct static_key_false frontswap_enabled_key; 35 36static inline bool frontswap_enabled(void) 37{ 38 return static_branch_unlikely(&frontswap_enabled_key); 39} 40 41static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 42{ 43 return __frontswap_test(sis, offset); 44} 45 46static inline void frontswap_map_set(struct swap_info_struct *p, 47 unsigned long *map) 48{ 49 p->frontswap_map = map; 50} 51 52static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 53{ 54 return p->frontswap_map; 55} 56#else 57/* all inline routines become no-ops and all externs are ignored */ 58 59static inline bool frontswap_enabled(void) 60{ 61 return false; 62} 63 64static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 65{ 66 return false; 67} 68 69static inline void frontswap_map_set(struct swap_info_struct *p, 70 unsigned long *map) 71{ 72} 73 74static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 75{ 76 return NULL; 77} 78#endif 79 80static inline int frontswap_store(struct page *page) 81{ 82 if (frontswap_enabled()) 83 return __frontswap_store(page); 84 85 return -1; 86} 87 88static inline int frontswap_load(struct page *page) 89{ 90 if (frontswap_enabled()) 91 return __frontswap_load(page); 92 93 return -1; 94} 95 96static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset) 97{ 98 if (frontswap_enabled()) 99 __frontswap_invalidate_page(type, offset); 100} 101 102static inline void frontswap_invalidate_area(unsigned type) 103{ 104 if (frontswap_enabled()) 105 __frontswap_invalidate_area(type); 106} 107 108static inline void frontswap_init(unsigned type, unsigned long *map) 109{ 110#ifdef CONFIG_FRONTSWAP 111 __frontswap_init(type, map); 112#endif 113} 114 115#endif /* _LINUX_FRONTSWAP_H */