frontswap.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. /*
  2. * Frontswap frontend
  3. *
  4. * This code provides the generic "frontend" layer to call a matching
  5. * "backend" driver implementation of frontswap. See
  6. * Documentation/vm/frontswap.txt for more information.
  7. *
  8. * Copyright (C) 2009-2012 Oracle Corp. All rights reserved.
  9. * Author: Dan Magenheimer
  10. *
  11. * This work is licensed under the terms of the GNU GPL, version 2.
  12. */
  13. #include <linux/mman.h>
  14. #include <linux/swap.h>
  15. #include <linux/swapops.h>
  16. #include <linux/security.h>
  17. #include <linux/module.h>
  18. #include <linux/debugfs.h>
  19. #include <linux/frontswap.h>
  20. #include <linux/swapfile.h>
  21. /*
  22. * frontswap_ops is set by frontswap_register_ops to contain the pointers
  23. * to the frontswap "backend" implementation functions.
  24. */
  25. static struct frontswap_ops frontswap_ops __read_mostly;
  26. /*
  27. * This global enablement flag reduces overhead on systems where frontswap_ops
  28. * has not been registered, so is preferred to the slower alternative: a
  29. * function call that checks a non-global.
  30. */
  31. bool frontswap_enabled __read_mostly;
  32. EXPORT_SYMBOL(frontswap_enabled);
  33. /*
  34. * If enabled, frontswap_store will return failure even on success. As
  35. * a result, the swap subsystem will always write the page to swap, in
  36. * effect converting frontswap into a writethrough cache. In this mode,
  37. * there is no direct reduction in swap writes, but a frontswap backend
  38. * can unilaterally "reclaim" any pages in use with no data loss, thus
  39. * providing increases control over maximum memory usage due to frontswap.
  40. */
  41. static bool frontswap_writethrough_enabled __read_mostly;
  42. #ifdef CONFIG_DEBUG_FS
  43. /*
  44. * Counters available via /sys/kernel/debug/frontswap (if debugfs is
  45. * properly configured). These are for information only so are not protected
  46. * against increment races.
  47. */
  48. static u64 frontswap_loads;
  49. static u64 frontswap_succ_stores;
  50. static u64 frontswap_failed_stores;
  51. static u64 frontswap_invalidates;
  52. static inline void inc_frontswap_loads(void) {
  53. frontswap_loads++;
  54. }
  55. static inline void inc_frontswap_succ_stores(void) {
  56. frontswap_succ_stores++;
  57. }
  58. static inline void inc_frontswap_failed_stores(void) {
  59. frontswap_failed_stores++;
  60. }
  61. static inline void inc_frontswap_invalidates(void) {
  62. frontswap_invalidates++;
  63. }
  64. #else
  65. static inline void inc_frontswap_loads(void) { }
  66. static inline void inc_frontswap_succ_stores(void) { }
  67. static inline void inc_frontswap_failed_stores(void) { }
  68. static inline void inc_frontswap_invalidates(void) { }
  69. #endif
  70. /*
  71. * Register operations for frontswap, returning previous thus allowing
  72. * detection of multiple backends and possible nesting.
  73. */
  74. struct frontswap_ops frontswap_register_ops(struct frontswap_ops *ops)
  75. {
  76. struct frontswap_ops old = frontswap_ops;
  77. frontswap_ops = *ops;
  78. frontswap_enabled = true;
  79. return old;
  80. }
  81. EXPORT_SYMBOL(frontswap_register_ops);
  82. /*
  83. * Enable/disable frontswap writethrough (see above).
  84. */
  85. void frontswap_writethrough(bool enable)
  86. {
  87. frontswap_writethrough_enabled = enable;
  88. }
  89. EXPORT_SYMBOL(frontswap_writethrough);
  90. /*
  91. * Called when a swap device is swapon'd.
  92. */
  93. void __frontswap_init(unsigned type)
  94. {
  95. struct swap_info_struct *sis = swap_info[type];
  96. BUG_ON(sis == NULL);
  97. if (sis->frontswap_map == NULL)
  98. return;
  99. frontswap_ops.init(type);
  100. }
  101. EXPORT_SYMBOL(__frontswap_init);
  102. static inline void __frontswap_clear(struct swap_info_struct *sis, pgoff_t offset)
  103. {
  104. frontswap_clear(sis, offset);
  105. atomic_dec(&sis->frontswap_pages);
  106. }
  107. /*
  108. * "Store" data from a page to frontswap and associate it with the page's
  109. * swaptype and offset. Page must be locked and in the swap cache.
  110. * If frontswap already contains a page with matching swaptype and
  111. * offset, the frontswap implementation may either overwrite the data and
  112. * return success or invalidate the page from frontswap and return failure.
  113. */
  114. int __frontswap_store(struct page *page)
  115. {
  116. int ret = -1, dup = 0;
  117. swp_entry_t entry = { .val = page_private(page), };
  118. int type = swp_type(entry);
  119. struct swap_info_struct *sis = swap_info[type];
  120. pgoff_t offset = swp_offset(entry);
  121. BUG_ON(!PageLocked(page));
  122. BUG_ON(sis == NULL);
  123. if (frontswap_test(sis, offset))
  124. dup = 1;
  125. ret = frontswap_ops.store(type, offset, page);
  126. if (ret == 0) {
  127. frontswap_set(sis, offset);
  128. inc_frontswap_succ_stores();
  129. if (!dup)
  130. atomic_inc(&sis->frontswap_pages);
  131. } else {
  132. /*
  133. failed dup always results in automatic invalidate of
  134. the (older) page from frontswap
  135. */
  136. inc_frontswap_failed_stores();
  137. if (dup)
  138. __frontswap_clear(sis, offset);
  139. }
  140. if (frontswap_writethrough_enabled)
  141. /* report failure so swap also writes to swap device */
  142. ret = -1;
  143. return ret;
  144. }
  145. EXPORT_SYMBOL(__frontswap_store);
  146. /*
  147. * "Get" data from frontswap associated with swaptype and offset that were
  148. * specified when the data was put to frontswap and use it to fill the
  149. * specified page with data. Page must be locked and in the swap cache.
  150. */
  151. int __frontswap_load(struct page *page)
  152. {
  153. int ret = -1;
  154. swp_entry_t entry = { .val = page_private(page), };
  155. int type = swp_type(entry);
  156. struct swap_info_struct *sis = swap_info[type];
  157. pgoff_t offset = swp_offset(entry);
  158. BUG_ON(!PageLocked(page));
  159. BUG_ON(sis == NULL);
  160. if (frontswap_test(sis, offset))
  161. ret = frontswap_ops.load(type, offset, page);
  162. if (ret == 0)
  163. inc_frontswap_loads();
  164. return ret;
  165. }
  166. EXPORT_SYMBOL(__frontswap_load);
  167. /*
  168. * Invalidate any data from frontswap associated with the specified swaptype
  169. * and offset so that a subsequent "get" will fail.
  170. */
  171. void __frontswap_invalidate_page(unsigned type, pgoff_t offset)
  172. {
  173. struct swap_info_struct *sis = swap_info[type];
  174. BUG_ON(sis == NULL);
  175. if (frontswap_test(sis, offset)) {
  176. frontswap_ops.invalidate_page(type, offset);
  177. __frontswap_clear(sis, offset);
  178. inc_frontswap_invalidates();
  179. }
  180. }
  181. EXPORT_SYMBOL(__frontswap_invalidate_page);
  182. /*
  183. * Invalidate all data from frontswap associated with all offsets for the
  184. * specified swaptype.
  185. */
  186. void __frontswap_invalidate_area(unsigned type)
  187. {
  188. struct swap_info_struct *sis = swap_info[type];
  189. BUG_ON(sis == NULL);
  190. if (sis->frontswap_map == NULL)
  191. return;
  192. frontswap_ops.invalidate_area(type);
  193. atomic_set(&sis->frontswap_pages, 0);
  194. memset(sis->frontswap_map, 0, sis->max / sizeof(long));
  195. }
  196. EXPORT_SYMBOL(__frontswap_invalidate_area);
  197. static unsigned long __frontswap_curr_pages(void)
  198. {
  199. int type;
  200. unsigned long totalpages = 0;
  201. struct swap_info_struct *si = NULL;
  202. assert_spin_locked(&swap_lock);
  203. for (type = swap_list.head; type >= 0; type = si->next) {
  204. si = swap_info[type];
  205. totalpages += atomic_read(&si->frontswap_pages);
  206. }
  207. return totalpages;
  208. }
  209. static int __frontswap_unuse_pages(unsigned long total, unsigned long *unused,
  210. int *swapid)
  211. {
  212. int ret = -EINVAL;
  213. struct swap_info_struct *si = NULL;
  214. int si_frontswap_pages;
  215. unsigned long total_pages_to_unuse = total;
  216. unsigned long pages = 0, pages_to_unuse = 0;
  217. int type;
  218. assert_spin_locked(&swap_lock);
  219. for (type = swap_list.head; type >= 0; type = si->next) {
  220. si = swap_info[type];
  221. si_frontswap_pages = atomic_read(&si->frontswap_pages);
  222. if (total_pages_to_unuse < si_frontswap_pages) {
  223. pages = pages_to_unuse = total_pages_to_unuse;
  224. } else {
  225. pages = si_frontswap_pages;
  226. pages_to_unuse = 0; /* unuse all */
  227. }
  228. /* ensure there is enough RAM to fetch pages from frontswap */
  229. if (security_vm_enough_memory_mm(current->mm, pages)) {
  230. ret = -ENOMEM;
  231. continue;
  232. }
  233. vm_unacct_memory(pages);
  234. *unused = pages_to_unuse;
  235. *swapid = type;
  236. ret = 0;
  237. break;
  238. }
  239. return ret;
  240. }
  241. /*
  242. * Used to check if it's necessory and feasible to unuse pages.
  243. * Return 1 when nothing to do, 0 when need to shink pages,
  244. * error code when there is an error.
  245. */
  246. static int __frontswap_shrink(unsigned long target_pages,
  247. unsigned long *pages_to_unuse,
  248. int *type)
  249. {
  250. unsigned long total_pages = 0, total_pages_to_unuse;
  251. assert_spin_locked(&swap_lock);
  252. total_pages = __frontswap_curr_pages();
  253. if (total_pages <= target_pages) {
  254. /* Nothing to do */
  255. *pages_to_unuse = 0;
  256. return 1;
  257. }
  258. total_pages_to_unuse = total_pages - target_pages;
  259. return __frontswap_unuse_pages(total_pages_to_unuse, pages_to_unuse, type);
  260. }
  261. /*
  262. * Frontswap, like a true swap device, may unnecessarily retain pages
  263. * under certain circumstances; "shrink" frontswap is essentially a
  264. * "partial swapoff" and works by calling try_to_unuse to attempt to
  265. * unuse enough frontswap pages to attempt to -- subject to memory
  266. * constraints -- reduce the number of pages in frontswap to the
  267. * number given in the parameter target_pages.
  268. */
  269. void frontswap_shrink(unsigned long target_pages)
  270. {
  271. unsigned long pages_to_unuse = 0;
  272. int uninitialized_var(type), ret;
  273. /*
  274. * we don't want to hold swap_lock while doing a very
  275. * lengthy try_to_unuse, but swap_list may change
  276. * so restart scan from swap_list.head each time
  277. */
  278. spin_lock(&swap_lock);
  279. ret = __frontswap_shrink(target_pages, &pages_to_unuse, &type);
  280. spin_unlock(&swap_lock);
  281. if (ret == 0)
  282. try_to_unuse(type, true, pages_to_unuse);
  283. return;
  284. }
  285. EXPORT_SYMBOL(frontswap_shrink);
  286. /*
  287. * Count and return the number of frontswap pages across all
  288. * swap devices. This is exported so that backend drivers can
  289. * determine current usage without reading debugfs.
  290. */
  291. unsigned long frontswap_curr_pages(void)
  292. {
  293. unsigned long totalpages = 0;
  294. spin_lock(&swap_lock);
  295. totalpages = __frontswap_curr_pages();
  296. spin_unlock(&swap_lock);
  297. return totalpages;
  298. }
  299. EXPORT_SYMBOL(frontswap_curr_pages);
  300. static int __init init_frontswap(void)
  301. {
  302. #ifdef CONFIG_DEBUG_FS
  303. struct dentry *root = debugfs_create_dir("frontswap", NULL);
  304. if (root == NULL)
  305. return -ENXIO;
  306. debugfs_create_u64("loads", S_IRUGO, root, &frontswap_loads);
  307. debugfs_create_u64("succ_stores", S_IRUGO, root, &frontswap_succ_stores);
  308. debugfs_create_u64("failed_stores", S_IRUGO, root,
  309. &frontswap_failed_stores);
  310. debugfs_create_u64("invalidates", S_IRUGO,
  311. root, &frontswap_invalidates);
  312. #endif
  313. return 0;
  314. }
  315. module_init(init_frontswap);