list_lru.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. /*
  2. * Copyright (c) 2013 Red Hat, Inc. and Parallels Inc. All rights reserved.
  3. * Authors: David Chinner and Glauber Costa
  4. *
  5. * Generic LRU infrastructure
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/mm.h>
  10. #include <linux/list_lru.h>
  11. #include <linux/slab.h>
  12. #include <linux/mutex.h>
  13. #include <linux/memcontrol.h>
  14. #ifdef CONFIG_MEMCG_KMEM
  15. static LIST_HEAD(list_lrus);
  16. static DEFINE_MUTEX(list_lrus_mutex);
  17. static void list_lru_register(struct list_lru *lru)
  18. {
  19. mutex_lock(&list_lrus_mutex);
  20. list_add(&lru->list, &list_lrus);
  21. mutex_unlock(&list_lrus_mutex);
  22. }
  23. static void list_lru_unregister(struct list_lru *lru)
  24. {
  25. mutex_lock(&list_lrus_mutex);
  26. list_del(&lru->list);
  27. mutex_unlock(&list_lrus_mutex);
  28. }
  29. #else
  30. static void list_lru_register(struct list_lru *lru)
  31. {
  32. }
  33. static void list_lru_unregister(struct list_lru *lru)
  34. {
  35. }
  36. #endif /* CONFIG_MEMCG_KMEM */
  37. #ifdef CONFIG_MEMCG_KMEM
  38. static inline bool list_lru_memcg_aware(struct list_lru *lru)
  39. {
  40. return !!lru->node[0].memcg_lrus;
  41. }
  42. static inline struct list_lru_one *
  43. list_lru_from_memcg_idx(struct list_lru_node *nlru, int idx)
  44. {
  45. /*
  46. * The lock protects the array of per cgroup lists from relocation
  47. * (see memcg_update_list_lru_node).
  48. */
  49. lockdep_assert_held(&nlru->lock);
  50. if (nlru->memcg_lrus && idx >= 0)
  51. return nlru->memcg_lrus->lru[idx];
  52. return &nlru->lru;
  53. }
  54. static inline struct list_lru_one *
  55. list_lru_from_kmem(struct list_lru_node *nlru, void *ptr)
  56. {
  57. struct mem_cgroup *memcg;
  58. if (!nlru->memcg_lrus)
  59. return &nlru->lru;
  60. memcg = mem_cgroup_from_kmem(ptr);
  61. if (!memcg)
  62. return &nlru->lru;
  63. return list_lru_from_memcg_idx(nlru, memcg_cache_id(memcg));
  64. }
  65. #else
  66. static inline bool list_lru_memcg_aware(struct list_lru *lru)
  67. {
  68. return false;
  69. }
  70. static inline struct list_lru_one *
  71. list_lru_from_memcg_idx(struct list_lru_node *nlru, int idx)
  72. {
  73. return &nlru->lru;
  74. }
  75. static inline struct list_lru_one *
  76. list_lru_from_kmem(struct list_lru_node *nlru, void *ptr)
  77. {
  78. return &nlru->lru;
  79. }
  80. #endif /* CONFIG_MEMCG_KMEM */
  81. bool list_lru_add(struct list_lru *lru, struct list_head *item)
  82. {
  83. int nid = page_to_nid(virt_to_page(item));
  84. struct list_lru_node *nlru = &lru->node[nid];
  85. struct list_lru_one *l;
  86. spin_lock(&nlru->lock);
  87. l = list_lru_from_kmem(nlru, item);
  88. if (list_empty(item)) {
  89. list_add_tail(item, &l->list);
  90. l->nr_items++;
  91. spin_unlock(&nlru->lock);
  92. return true;
  93. }
  94. spin_unlock(&nlru->lock);
  95. return false;
  96. }
  97. EXPORT_SYMBOL_GPL(list_lru_add);
  98. bool list_lru_del(struct list_lru *lru, struct list_head *item)
  99. {
  100. int nid = page_to_nid(virt_to_page(item));
  101. struct list_lru_node *nlru = &lru->node[nid];
  102. struct list_lru_one *l;
  103. spin_lock(&nlru->lock);
  104. l = list_lru_from_kmem(nlru, item);
  105. if (!list_empty(item)) {
  106. list_del_init(item);
  107. l->nr_items--;
  108. spin_unlock(&nlru->lock);
  109. return true;
  110. }
  111. spin_unlock(&nlru->lock);
  112. return false;
  113. }
  114. EXPORT_SYMBOL_GPL(list_lru_del);
  115. void list_lru_isolate(struct list_lru_one *list, struct list_head *item)
  116. {
  117. list_del_init(item);
  118. list->nr_items--;
  119. }
  120. EXPORT_SYMBOL_GPL(list_lru_isolate);
  121. void list_lru_isolate_move(struct list_lru_one *list, struct list_head *item,
  122. struct list_head *head)
  123. {
  124. list_move(item, head);
  125. list->nr_items--;
  126. }
  127. EXPORT_SYMBOL_GPL(list_lru_isolate_move);
  128. static unsigned long __list_lru_count_one(struct list_lru *lru,
  129. int nid, int memcg_idx)
  130. {
  131. struct list_lru_node *nlru = &lru->node[nid];
  132. struct list_lru_one *l;
  133. unsigned long count;
  134. spin_lock(&nlru->lock);
  135. l = list_lru_from_memcg_idx(nlru, memcg_idx);
  136. count = l->nr_items;
  137. spin_unlock(&nlru->lock);
  138. return count;
  139. }
  140. unsigned long list_lru_count_one(struct list_lru *lru,
  141. int nid, struct mem_cgroup *memcg)
  142. {
  143. return __list_lru_count_one(lru, nid, memcg_cache_id(memcg));
  144. }
  145. EXPORT_SYMBOL_GPL(list_lru_count_one);
  146. unsigned long list_lru_count_node(struct list_lru *lru, int nid)
  147. {
  148. long count = 0;
  149. int memcg_idx;
  150. count += __list_lru_count_one(lru, nid, -1);
  151. if (list_lru_memcg_aware(lru)) {
  152. for_each_memcg_cache_index(memcg_idx)
  153. count += __list_lru_count_one(lru, nid, memcg_idx);
  154. }
  155. return count;
  156. }
  157. EXPORT_SYMBOL_GPL(list_lru_count_node);
  158. static unsigned long
  159. __list_lru_walk_one(struct list_lru *lru, int nid, int memcg_idx,
  160. list_lru_walk_cb isolate, void *cb_arg,
  161. unsigned long *nr_to_walk)
  162. {
  163. struct list_lru_node *nlru = &lru->node[nid];
  164. struct list_lru_one *l;
  165. struct list_head *item, *n;
  166. unsigned long isolated = 0;
  167. spin_lock(&nlru->lock);
  168. l = list_lru_from_memcg_idx(nlru, memcg_idx);
  169. restart:
  170. list_for_each_safe(item, n, &l->list) {
  171. enum lru_status ret;
  172. /*
  173. * decrement nr_to_walk first so that we don't livelock if we
  174. * get stuck on large numbesr of LRU_RETRY items
  175. */
  176. if (!*nr_to_walk)
  177. break;
  178. --*nr_to_walk;
  179. ret = isolate(item, l, &nlru->lock, cb_arg);
  180. switch (ret) {
  181. case LRU_REMOVED_RETRY:
  182. assert_spin_locked(&nlru->lock);
  183. case LRU_REMOVED:
  184. isolated++;
  185. /*
  186. * If the lru lock has been dropped, our list
  187. * traversal is now invalid and so we have to
  188. * restart from scratch.
  189. */
  190. if (ret == LRU_REMOVED_RETRY)
  191. goto restart;
  192. break;
  193. case LRU_ROTATE:
  194. list_move_tail(item, &l->list);
  195. break;
  196. case LRU_SKIP:
  197. break;
  198. case LRU_RETRY:
  199. /*
  200. * The lru lock has been dropped, our list traversal is
  201. * now invalid and so we have to restart from scratch.
  202. */
  203. assert_spin_locked(&nlru->lock);
  204. goto restart;
  205. default:
  206. BUG();
  207. }
  208. }
  209. spin_unlock(&nlru->lock);
  210. return isolated;
  211. }
  212. unsigned long
  213. list_lru_walk_one(struct list_lru *lru, int nid, struct mem_cgroup *memcg,
  214. list_lru_walk_cb isolate, void *cb_arg,
  215. unsigned long *nr_to_walk)
  216. {
  217. return __list_lru_walk_one(lru, nid, memcg_cache_id(memcg),
  218. isolate, cb_arg, nr_to_walk);
  219. }
  220. EXPORT_SYMBOL_GPL(list_lru_walk_one);
  221. unsigned long list_lru_walk_node(struct list_lru *lru, int nid,
  222. list_lru_walk_cb isolate, void *cb_arg,
  223. unsigned long *nr_to_walk)
  224. {
  225. long isolated = 0;
  226. int memcg_idx;
  227. isolated += __list_lru_walk_one(lru, nid, -1, isolate, cb_arg,
  228. nr_to_walk);
  229. if (*nr_to_walk > 0 && list_lru_memcg_aware(lru)) {
  230. for_each_memcg_cache_index(memcg_idx) {
  231. isolated += __list_lru_walk_one(lru, nid, memcg_idx,
  232. isolate, cb_arg, nr_to_walk);
  233. if (*nr_to_walk <= 0)
  234. break;
  235. }
  236. }
  237. return isolated;
  238. }
  239. EXPORT_SYMBOL_GPL(list_lru_walk_node);
  240. static void init_one_lru(struct list_lru_one *l)
  241. {
  242. INIT_LIST_HEAD(&l->list);
  243. l->nr_items = 0;
  244. }
  245. #ifdef CONFIG_MEMCG_KMEM
  246. static void __memcg_destroy_list_lru_node(struct list_lru_memcg *memcg_lrus,
  247. int begin, int end)
  248. {
  249. int i;
  250. for (i = begin; i < end; i++)
  251. kfree(memcg_lrus->lru[i]);
  252. }
  253. static int __memcg_init_list_lru_node(struct list_lru_memcg *memcg_lrus,
  254. int begin, int end)
  255. {
  256. int i;
  257. for (i = begin; i < end; i++) {
  258. struct list_lru_one *l;
  259. l = kmalloc(sizeof(struct list_lru_one), GFP_KERNEL);
  260. if (!l)
  261. goto fail;
  262. init_one_lru(l);
  263. memcg_lrus->lru[i] = l;
  264. }
  265. return 0;
  266. fail:
  267. __memcg_destroy_list_lru_node(memcg_lrus, begin, i - 1);
  268. return -ENOMEM;
  269. }
  270. static int memcg_init_list_lru_node(struct list_lru_node *nlru)
  271. {
  272. int size = memcg_nr_cache_ids;
  273. nlru->memcg_lrus = kmalloc(size * sizeof(void *), GFP_KERNEL);
  274. if (!nlru->memcg_lrus)
  275. return -ENOMEM;
  276. if (__memcg_init_list_lru_node(nlru->memcg_lrus, 0, size)) {
  277. kfree(nlru->memcg_lrus);
  278. return -ENOMEM;
  279. }
  280. return 0;
  281. }
  282. static void memcg_destroy_list_lru_node(struct list_lru_node *nlru)
  283. {
  284. __memcg_destroy_list_lru_node(nlru->memcg_lrus, 0, memcg_nr_cache_ids);
  285. kfree(nlru->memcg_lrus);
  286. }
  287. static int memcg_update_list_lru_node(struct list_lru_node *nlru,
  288. int old_size, int new_size)
  289. {
  290. struct list_lru_memcg *old, *new;
  291. BUG_ON(old_size > new_size);
  292. old = nlru->memcg_lrus;
  293. new = kmalloc(new_size * sizeof(void *), GFP_KERNEL);
  294. if (!new)
  295. return -ENOMEM;
  296. if (__memcg_init_list_lru_node(new, old_size, new_size)) {
  297. kfree(new);
  298. return -ENOMEM;
  299. }
  300. memcpy(new, old, old_size * sizeof(void *));
  301. /*
  302. * The lock guarantees that we won't race with a reader
  303. * (see list_lru_from_memcg_idx).
  304. *
  305. * Since list_lru_{add,del} may be called under an IRQ-safe lock,
  306. * we have to use IRQ-safe primitives here to avoid deadlock.
  307. */
  308. spin_lock_irq(&nlru->lock);
  309. nlru->memcg_lrus = new;
  310. spin_unlock_irq(&nlru->lock);
  311. kfree(old);
  312. return 0;
  313. }
  314. static void memcg_cancel_update_list_lru_node(struct list_lru_node *nlru,
  315. int old_size, int new_size)
  316. {
  317. /* do not bother shrinking the array back to the old size, because we
  318. * cannot handle allocation failures here */
  319. __memcg_destroy_list_lru_node(nlru->memcg_lrus, old_size, new_size);
  320. }
  321. static int memcg_init_list_lru(struct list_lru *lru, bool memcg_aware)
  322. {
  323. int i;
  324. for (i = 0; i < nr_node_ids; i++) {
  325. if (!memcg_aware)
  326. lru->node[i].memcg_lrus = NULL;
  327. else if (memcg_init_list_lru_node(&lru->node[i]))
  328. goto fail;
  329. }
  330. return 0;
  331. fail:
  332. for (i = i - 1; i >= 0; i--)
  333. memcg_destroy_list_lru_node(&lru->node[i]);
  334. return -ENOMEM;
  335. }
  336. static void memcg_destroy_list_lru(struct list_lru *lru)
  337. {
  338. int i;
  339. if (!list_lru_memcg_aware(lru))
  340. return;
  341. for (i = 0; i < nr_node_ids; i++)
  342. memcg_destroy_list_lru_node(&lru->node[i]);
  343. }
  344. static int memcg_update_list_lru(struct list_lru *lru,
  345. int old_size, int new_size)
  346. {
  347. int i;
  348. if (!list_lru_memcg_aware(lru))
  349. return 0;
  350. for (i = 0; i < nr_node_ids; i++) {
  351. if (memcg_update_list_lru_node(&lru->node[i],
  352. old_size, new_size))
  353. goto fail;
  354. }
  355. return 0;
  356. fail:
  357. for (i = i - 1; i >= 0; i--)
  358. memcg_cancel_update_list_lru_node(&lru->node[i],
  359. old_size, new_size);
  360. return -ENOMEM;
  361. }
  362. static void memcg_cancel_update_list_lru(struct list_lru *lru,
  363. int old_size, int new_size)
  364. {
  365. int i;
  366. if (!list_lru_memcg_aware(lru))
  367. return;
  368. for (i = 0; i < nr_node_ids; i++)
  369. memcg_cancel_update_list_lru_node(&lru->node[i],
  370. old_size, new_size);
  371. }
  372. int memcg_update_all_list_lrus(int new_size)
  373. {
  374. int ret = 0;
  375. struct list_lru *lru;
  376. int old_size = memcg_nr_cache_ids;
  377. mutex_lock(&list_lrus_mutex);
  378. list_for_each_entry(lru, &list_lrus, list) {
  379. ret = memcg_update_list_lru(lru, old_size, new_size);
  380. if (ret)
  381. goto fail;
  382. }
  383. out:
  384. mutex_unlock(&list_lrus_mutex);
  385. return ret;
  386. fail:
  387. list_for_each_entry_continue_reverse(lru, &list_lrus, list)
  388. memcg_cancel_update_list_lru(lru, old_size, new_size);
  389. goto out;
  390. }
  391. static void memcg_drain_list_lru_node(struct list_lru_node *nlru,
  392. int src_idx, int dst_idx)
  393. {
  394. struct list_lru_one *src, *dst;
  395. /*
  396. * Since list_lru_{add,del} may be called under an IRQ-safe lock,
  397. * we have to use IRQ-safe primitives here to avoid deadlock.
  398. */
  399. spin_lock_irq(&nlru->lock);
  400. src = list_lru_from_memcg_idx(nlru, src_idx);
  401. dst = list_lru_from_memcg_idx(nlru, dst_idx);
  402. list_splice_init(&src->list, &dst->list);
  403. dst->nr_items += src->nr_items;
  404. src->nr_items = 0;
  405. spin_unlock_irq(&nlru->lock);
  406. }
  407. static void memcg_drain_list_lru(struct list_lru *lru,
  408. int src_idx, int dst_idx)
  409. {
  410. int i;
  411. if (!list_lru_memcg_aware(lru))
  412. return;
  413. for (i = 0; i < nr_node_ids; i++)
  414. memcg_drain_list_lru_node(&lru->node[i], src_idx, dst_idx);
  415. }
  416. void memcg_drain_all_list_lrus(int src_idx, int dst_idx)
  417. {
  418. struct list_lru *lru;
  419. mutex_lock(&list_lrus_mutex);
  420. list_for_each_entry(lru, &list_lrus, list)
  421. memcg_drain_list_lru(lru, src_idx, dst_idx);
  422. mutex_unlock(&list_lrus_mutex);
  423. }
  424. #else
  425. static int memcg_init_list_lru(struct list_lru *lru, bool memcg_aware)
  426. {
  427. return 0;
  428. }
  429. static void memcg_destroy_list_lru(struct list_lru *lru)
  430. {
  431. }
  432. #endif /* CONFIG_MEMCG_KMEM */
  433. int __list_lru_init(struct list_lru *lru, bool memcg_aware,
  434. struct lock_class_key *key)
  435. {
  436. int i;
  437. size_t size = sizeof(*lru->node) * nr_node_ids;
  438. int err = -ENOMEM;
  439. memcg_get_cache_ids();
  440. lru->node = kzalloc(size, GFP_KERNEL);
  441. if (!lru->node)
  442. goto out;
  443. for (i = 0; i < nr_node_ids; i++) {
  444. spin_lock_init(&lru->node[i].lock);
  445. if (key)
  446. lockdep_set_class(&lru->node[i].lock, key);
  447. init_one_lru(&lru->node[i].lru);
  448. }
  449. err = memcg_init_list_lru(lru, memcg_aware);
  450. if (err) {
  451. kfree(lru->node);
  452. goto out;
  453. }
  454. list_lru_register(lru);
  455. out:
  456. memcg_put_cache_ids();
  457. return err;
  458. }
  459. EXPORT_SYMBOL_GPL(__list_lru_init);
  460. void list_lru_destroy(struct list_lru *lru)
  461. {
  462. /* Already destroyed or not yet initialized? */
  463. if (!lru->node)
  464. return;
  465. memcg_get_cache_ids();
  466. list_lru_unregister(lru);
  467. memcg_destroy_list_lru(lru);
  468. kfree(lru->node);
  469. lru->node = NULL;
  470. memcg_put_cache_ids();
  471. }
  472. EXPORT_SYMBOL_GPL(list_lru_destroy);