frontswap.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #ifndef _LINUX_FRONTSWAP_H
  2. #define _LINUX_FRONTSWAP_H
  3. #include <linux/swap.h>
  4. #include <linux/mm.h>
  5. #include <linux/bitops.h>
  6. #include <linux/jump_label.h>
  7. struct frontswap_ops {
  8. void (*init)(unsigned); /* this swap type was just swapon'ed */
  9. int (*store)(unsigned, pgoff_t, struct page *); /* store a page */
  10. int (*load)(unsigned, pgoff_t, struct page *); /* load a page */
  11. void (*invalidate_page)(unsigned, pgoff_t); /* page no longer needed */
  12. void (*invalidate_area)(unsigned); /* swap type just swapoff'ed */
  13. struct frontswap_ops *next; /* private pointer to next ops */
  14. };
  15. extern void frontswap_register_ops(struct frontswap_ops *ops);
  16. extern void frontswap_shrink(unsigned long);
  17. extern unsigned long frontswap_curr_pages(void);
  18. extern void frontswap_writethrough(bool);
  19. #define FRONTSWAP_HAS_EXCLUSIVE_GETS
  20. extern void frontswap_tmem_exclusive_gets(bool);
  21. extern bool __frontswap_test(struct swap_info_struct *, pgoff_t);
  22. extern void __frontswap_init(unsigned type, unsigned long *map);
  23. extern int __frontswap_store(struct page *page);
  24. extern int __frontswap_load(struct page *page);
  25. extern void __frontswap_invalidate_page(unsigned, pgoff_t);
  26. extern void __frontswap_invalidate_area(unsigned);
  27. #ifdef CONFIG_FRONTSWAP
  28. extern struct static_key_false frontswap_enabled_key;
  29. static inline bool frontswap_enabled(void)
  30. {
  31. return static_branch_unlikely(&frontswap_enabled_key);
  32. }
  33. static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset)
  34. {
  35. return __frontswap_test(sis, offset);
  36. }
  37. static inline void frontswap_map_set(struct swap_info_struct *p,
  38. unsigned long *map)
  39. {
  40. p->frontswap_map = map;
  41. }
  42. static inline unsigned long *frontswap_map_get(struct swap_info_struct *p)
  43. {
  44. return p->frontswap_map;
  45. }
  46. #else
  47. /* all inline routines become no-ops and all externs are ignored */
  48. static inline bool frontswap_enabled(void)
  49. {
  50. return false;
  51. }
  52. static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset)
  53. {
  54. return false;
  55. }
  56. static inline void frontswap_map_set(struct swap_info_struct *p,
  57. unsigned long *map)
  58. {
  59. }
  60. static inline unsigned long *frontswap_map_get(struct swap_info_struct *p)
  61. {
  62. return NULL;
  63. }
  64. #endif
  65. static inline int frontswap_store(struct page *page)
  66. {
  67. if (frontswap_enabled())
  68. return __frontswap_store(page);
  69. return -1;
  70. }
  71. static inline int frontswap_load(struct page *page)
  72. {
  73. if (frontswap_enabled())
  74. return __frontswap_load(page);
  75. return -1;
  76. }
  77. static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset)
  78. {
  79. if (frontswap_enabled())
  80. __frontswap_invalidate_page(type, offset);
  81. }
  82. static inline void frontswap_invalidate_area(unsigned type)
  83. {
  84. if (frontswap_enabled())
  85. __frontswap_invalidate_area(type);
  86. }
  87. static inline void frontswap_init(unsigned type, unsigned long *map)
  88. {
  89. #ifdef CONFIG_FRONTSWAP
  90. __frontswap_init(type, map);
  91. #endif
  92. }
  93. #endif /* _LINUX_FRONTSWAP_H */