at v3.5 2.9 kB view raw
1#ifndef _LINUX_FRONTSWAP_H 2#define _LINUX_FRONTSWAP_H 3 4#include <linux/swap.h> 5#include <linux/mm.h> 6#include <linux/bitops.h> 7 8struct frontswap_ops { 9 void (*init)(unsigned); 10 int (*store)(unsigned, pgoff_t, struct page *); 11 int (*load)(unsigned, pgoff_t, struct page *); 12 void (*invalidate_page)(unsigned, pgoff_t); 13 void (*invalidate_area)(unsigned); 14}; 15 16extern bool frontswap_enabled; 17extern struct frontswap_ops 18 frontswap_register_ops(struct frontswap_ops *ops); 19extern void frontswap_shrink(unsigned long); 20extern unsigned long frontswap_curr_pages(void); 21extern void frontswap_writethrough(bool); 22 23extern void __frontswap_init(unsigned type); 24extern int __frontswap_store(struct page *page); 25extern int __frontswap_load(struct page *page); 26extern void __frontswap_invalidate_page(unsigned, pgoff_t); 27extern void __frontswap_invalidate_area(unsigned); 28 29#ifdef CONFIG_FRONTSWAP 30 31static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 32{ 33 bool ret = false; 34 35 if (frontswap_enabled && sis->frontswap_map) 36 ret = test_bit(offset, sis->frontswap_map); 37 return ret; 38} 39 40static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset) 41{ 42 if (frontswap_enabled && sis->frontswap_map) 43 set_bit(offset, sis->frontswap_map); 44} 45 46static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) 47{ 48 if (frontswap_enabled && sis->frontswap_map) 49 clear_bit(offset, sis->frontswap_map); 50} 51 52static inline void frontswap_map_set(struct swap_info_struct *p, 53 unsigned long *map) 54{ 55 p->frontswap_map = map; 56} 57 58static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 59{ 60 return p->frontswap_map; 61} 62#else 63/* all inline routines become no-ops and all externs are ignored */ 64 65#define frontswap_enabled (0) 66 67static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) 68{ 69 return false; 70} 71 72static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset) 73{ 74} 75 76static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) 77{ 78} 79 80static inline void frontswap_map_set(struct swap_info_struct *p, 81 unsigned long *map) 82{ 83} 84 85static inline unsigned long *frontswap_map_get(struct swap_info_struct *p) 86{ 87 return NULL; 88} 89#endif 90 91static inline int frontswap_store(struct page *page) 92{ 93 int ret = -1; 94 95 if (frontswap_enabled) 96 ret = __frontswap_store(page); 97 return ret; 98} 99 100static inline int frontswap_load(struct page *page) 101{ 102 int ret = -1; 103 104 if (frontswap_enabled) 105 ret = __frontswap_load(page); 106 return ret; 107} 108 109static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset) 110{ 111 if (frontswap_enabled) 112 __frontswap_invalidate_page(type, offset); 113} 114 115static inline void frontswap_invalidate_area(unsigned type) 116{ 117 if (frontswap_enabled) 118 __frontswap_invalidate_area(type); 119} 120 121static inline void frontswap_init(unsigned type) 122{ 123 if (frontswap_enabled) 124 __frontswap_init(type); 125} 126 127#endif /* _LINUX_FRONTSWAP_H */