- Update Xen patches to 3.3-rc5 and c/s 1157.
[linux-flexiantxendom0-3.2.10.git] / include / linux / frontswap.h
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
8 struct frontswap_ops {
9         void (*init)(unsigned);
10         int (*put_page)(unsigned, pgoff_t, struct page *);
11         int (*get_page)(unsigned, pgoff_t, struct page *);
12         void (*invalidate_page)(unsigned, pgoff_t);
13         void (*invalidate_area)(unsigned);
14 };
15
16 extern int frontswap_enabled;
17 extern struct frontswap_ops
18         frontswap_register_ops(struct frontswap_ops *ops);
19 extern void frontswap_shrink(unsigned long);
20 extern unsigned long frontswap_curr_pages(void);
21
22 extern void __frontswap_init(unsigned type);
23 extern int __frontswap_put_page(struct page *page);
24 extern int __frontswap_get_page(struct page *page);
25 extern void __frontswap_invalidate_page(unsigned, pgoff_t);
26 extern void __frontswap_invalidate_area(unsigned);
27
28 #ifdef CONFIG_FRONTSWAP
29
30 static inline int frontswap_test(struct swap_info_struct *sis, pgoff_t offset)
31 {
32         int ret = 0;
33
34         if (frontswap_enabled && sis->frontswap_map)
35                 ret = test_bit(offset, sis->frontswap_map);
36         return ret;
37 }
38
39 static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset)
40 {
41         if (frontswap_enabled && sis->frontswap_map)
42                 set_bit(offset, sis->frontswap_map);
43 }
44
45 static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset)
46 {
47         if (frontswap_enabled && sis->frontswap_map)
48                 clear_bit(offset, sis->frontswap_map);
49 }
50
51 static inline void frontswap_map_set(struct swap_info_struct *p,
52                                      unsigned long *map)
53 {
54         p->frontswap_map = map;
55 }
56
57 static inline unsigned long *frontswap_map_get(struct swap_info_struct *p)
58 {
59         return p->frontswap_map;
60 }
61 #else
62 /* all inline routines become no-ops and all externs are ignored */
63
64 #define frontswap_enabled (0)
65
66 static inline int frontswap_test(struct swap_info_struct *sis, pgoff_t offset)
67 {
68         return 0;
69 }
70
71 static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset)
72 {
73 }
74
75 static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset)
76 {
77 }
78
79 static inline void frontswap_map_set(struct swap_info_struct *p,
80                                      unsigned long *map)
81 {
82 }
83
84 static inline unsigned long *frontswap_map_get(struct swap_info_struct *p)
85 {
86         return NULL;
87 }
88 #endif
89
90 static inline int frontswap_put_page(struct page *page)
91 {
92         int ret = -1;
93
94         if (frontswap_enabled)
95                 ret = __frontswap_put_page(page);
96         return ret;
97 }
98
99 static inline int frontswap_get_page(struct page *page)
100 {
101         int ret = -1;
102
103         if (frontswap_enabled)
104                 ret = __frontswap_get_page(page);
105         return ret;
106 }
107
108 static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset)
109 {
110         if (frontswap_enabled)
111                 __frontswap_invalidate_page(type, offset);
112 }
113
114 static inline void frontswap_invalidate_area(unsigned type)
115 {
116         if (frontswap_enabled)
117                 __frontswap_invalidate_area(type);
118 }
119
120 static inline void frontswap_init(unsigned type)
121 {
122         if (frontswap_enabled)
123                 __frontswap_init(type);
124 }
125
126 #endif /* _LINUX_FRONTSWAP_H */