Blame view

include/linux/cleancache.h 3.86 KB
077b1f83a   Dan Magenheimer   mm: cleancache co...
1
2
3
4
5
6
  #ifndef _LINUX_CLEANCACHE_H
  #define _LINUX_CLEANCACHE_H
  
  #include <linux/fs.h>
  #include <linux/exportfs.h>
  #include <linux/mm.h>
3cb29d111   Vladimir Davydov   cleancache: remov...
7
8
9
  #define CLEANCACHE_NO_POOL		-1
  #define CLEANCACHE_NO_BACKEND		-2
  #define CLEANCACHE_NO_BACKEND_SHARED	-3
077b1f83a   Dan Magenheimer   mm: cleancache co...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  #define CLEANCACHE_KEY_MAX 6
  
  /*
   * cleancache requires every file with a page in cleancache to have a
   * unique key unless/until the file is removed/truncated.  For some
   * filesystems, the inode number is unique, but for "modern" filesystems
   * an exportable filehandle is required (see exportfs.h)
   */
  struct cleancache_filekey {
  	union {
  		ino_t ino;
  		__u32 fh[CLEANCACHE_KEY_MAX];
  		u32 key[CLEANCACHE_KEY_MAX];
  	} u;
  };
  
  struct cleancache_ops {
  	int (*init_fs)(size_t);
  	int (*init_shared_fs)(char *uuid, size_t);
  	int (*get_page)(int, struct cleancache_filekey,
  			pgoff_t, struct page *);
  	void (*put_page)(int, struct cleancache_filekey,
  			pgoff_t, struct page *);
91c6cc9b5   Dan Magenheimer   mm: zcache/tmem/c...
33
34
35
  	void (*invalidate_page)(int, struct cleancache_filekey, pgoff_t);
  	void (*invalidate_inode)(int, struct cleancache_filekey);
  	void (*invalidate_fs)(int);
077b1f83a   Dan Magenheimer   mm: cleancache co...
36
  };
53d85c985   Vladimir Davydov   cleancache: forbi...
37
  extern int cleancache_register_ops(struct cleancache_ops *ops);
077b1f83a   Dan Magenheimer   mm: cleancache co...
38
  extern void __cleancache_init_fs(struct super_block *);
9de162629   Vladimir Davydov   cleancache: zap u...
39
  extern void __cleancache_init_shared_fs(struct super_block *);
077b1f83a   Dan Magenheimer   mm: cleancache co...
40
41
  extern int  __cleancache_get_page(struct page *);
  extern void __cleancache_put_page(struct page *);
3167760f8   Dan Magenheimer   mm: cleancache: s...
42
43
44
  extern void __cleancache_invalidate_page(struct address_space *, struct page *);
  extern void __cleancache_invalidate_inode(struct address_space *);
  extern void __cleancache_invalidate_fs(struct super_block *);
077b1f83a   Dan Magenheimer   mm: cleancache co...
45
46
  
  #ifdef CONFIG_CLEANCACHE
ff610a1d5   Bob Liu   mm: cleancache: c...
47
  #define cleancache_enabled (1)
077b1f83a   Dan Magenheimer   mm: cleancache co...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  static inline bool cleancache_fs_enabled(struct page *page)
  {
  	return page->mapping->host->i_sb->cleancache_poolid >= 0;
  }
  static inline bool cleancache_fs_enabled_mapping(struct address_space *mapping)
  {
  	return mapping->host->i_sb->cleancache_poolid >= 0;
  }
  #else
  #define cleancache_enabled (0)
  #define cleancache_fs_enabled(_page) (0)
  #define cleancache_fs_enabled_mapping(_page) (0)
  #endif
  
  /*
   * The shim layer provided by these inline functions allows the compiler
   * to reduce all cleancache hooks to nothingness if CONFIG_CLEANCACHE
   * is disabled, to a single global variable check if CONFIG_CLEANCACHE
   * is enabled but no cleancache "backend" has dynamically enabled it,
   * and, for the most frequent cleancache ops, to a single global variable
   * check plus a superblock element comparison if CONFIG_CLEANCACHE is enabled
   * and a cleancache backend has dynamically enabled cleancache, but the
   * filesystem referenced by that cleancache op has not enabled cleancache.
   * As a result, CONFIG_CLEANCACHE can be enabled by default with essentially
   * no measurable performance impact.
   */
  
  static inline void cleancache_init_fs(struct super_block *sb)
  {
  	if (cleancache_enabled)
  		__cleancache_init_fs(sb);
  }
9de162629   Vladimir Davydov   cleancache: zap u...
80
  static inline void cleancache_init_shared_fs(struct super_block *sb)
077b1f83a   Dan Magenheimer   mm: cleancache co...
81
82
  {
  	if (cleancache_enabled)
9de162629   Vladimir Davydov   cleancache: zap u...
83
  		__cleancache_init_shared_fs(sb);
077b1f83a   Dan Magenheimer   mm: cleancache co...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  }
  
  static inline int cleancache_get_page(struct page *page)
  {
  	int ret = -1;
  
  	if (cleancache_enabled && cleancache_fs_enabled(page))
  		ret = __cleancache_get_page(page);
  	return ret;
  }
  
  static inline void cleancache_put_page(struct page *page)
  {
  	if (cleancache_enabled && cleancache_fs_enabled(page))
  		__cleancache_put_page(page);
  }
3167760f8   Dan Magenheimer   mm: cleancache: s...
100
  static inline void cleancache_invalidate_page(struct address_space *mapping,
077b1f83a   Dan Magenheimer   mm: cleancache co...
101
102
103
104
  					struct page *page)
  {
  	/* careful... page->mapping is NULL sometimes when this is called */
  	if (cleancache_enabled && cleancache_fs_enabled_mapping(mapping))
3167760f8   Dan Magenheimer   mm: cleancache: s...
105
  		__cleancache_invalidate_page(mapping, page);
077b1f83a   Dan Magenheimer   mm: cleancache co...
106
  }
3167760f8   Dan Magenheimer   mm: cleancache: s...
107
  static inline void cleancache_invalidate_inode(struct address_space *mapping)
077b1f83a   Dan Magenheimer   mm: cleancache co...
108
109
  {
  	if (cleancache_enabled && cleancache_fs_enabled_mapping(mapping))
3167760f8   Dan Magenheimer   mm: cleancache: s...
110
  		__cleancache_invalidate_inode(mapping);
077b1f83a   Dan Magenheimer   mm: cleancache co...
111
  }
3167760f8   Dan Magenheimer   mm: cleancache: s...
112
  static inline void cleancache_invalidate_fs(struct super_block *sb)
077b1f83a   Dan Magenheimer   mm: cleancache co...
113
114
  {
  	if (cleancache_enabled)
3167760f8   Dan Magenheimer   mm: cleancache: s...
115
  		__cleancache_invalidate_fs(sb);
077b1f83a   Dan Magenheimer   mm: cleancache co...
116
117
118
  }
  
  #endif /* _LINUX_CLEANCACHE_H */