at v5.3 3.1 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 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 17struct 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 26extern void frontswap_register_ops(struct frontswap_ops *ops); 27extern void frontswap_shrink(unsigned long); 28extern unsigned long frontswap_curr_pages(void); 29extern void frontswap_writethrough(bool); 30#define FRONTSWAP_HAS_EXCLUSIVE_GETS 31extern void frontswap_tmem_exclusive_gets(bool); 32 33extern bool __frontswap_test(struct swap_info_struct *, pgoff_t); 34extern void __frontswap_init(unsigned type, unsigned long *map); 35extern int __frontswap_store(struct page *page); 36extern int __frontswap_load(struct page *page); 37extern void __frontswap_invalidate_page(unsigned, pgoff_t); 38extern void __frontswap_invalidate_area(unsigned); 39 40#ifdef CONFIG_FRONTSWAP 41extern struct static_key_false frontswap_enabled_key; 42 43static inline bool frontswap_enabled(void) 44{ 45 return static_branch_unlikely(&frontswap_enabled_key); 46} 47 48static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 49{ 50 return __frontswap_test(sis, offset); 51} 52 53static inline void frontswap_map_set(struct swap_info_struct *p, 54 unsigned long *map) 55{ 56 p->frontswap_map = map; 57} 58 59static 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 66static inline bool frontswap_enabled(void) 67{ 68 return false; 69} 70 71static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 72{ 73 return false; 74} 75 76static inline void frontswap_map_set(struct swap_info_struct *p, 77 unsigned long *map) 78{ 79} 80 81static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 82{ 83 return NULL; 84} 85#endif 86 87static inline int frontswap_store(struct page *page) 88{ 89 if (frontswap_enabled()) 90 return __frontswap_store(page); 91 92 return -1; 93} 94 95static inline int frontswap_load(struct page *page) 96{ 97 if (frontswap_enabled()) 98 return __frontswap_load(page); 99 100 return -1; 101} 102 103static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset) 104{ 105 if (frontswap_enabled()) 106 __frontswap_invalidate_page(type, offset); 107} 108 109static inline void frontswap_invalidate_area(unsigned type) 110{ 111 if (frontswap_enabled()) 112 __frontswap_invalidate_area(type); 113} 114 115static 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 */