kgsl_reclaim.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/kthread.h>
  7. #include <linux/notifier.h>
  8. #include <linux/pagevec.h>
  9. #include <linux/shmem_fs.h>
  10. #include <linux/swap.h>
  11. #include <linux/version.h>
  12. #include "kgsl_reclaim.h"
  13. #include "kgsl_sharedmem.h"
  14. #include "kgsl_trace.h"
  15. /*
  16. * Reclaiming excessive number of pages from a process will impact launch
  17. * latency for the subsequent launch of the process. After measuring the
  18. * launch latencies by having various maximum limits, it has been decided
  19. * that allowing 30MB (7680 pages) of relcaim per process will have little
  20. * impact and the latency will be within acceptable limit.
  21. */
  22. static u32 kgsl_reclaim_max_page_limit = 7680;
  23. /* Setting this to 0 means we reclaim pages as specified in shrinker call */
  24. static u32 kgsl_nr_to_scan;
  25. struct work_struct reclaim_work;
  26. static atomic_t kgsl_nr_to_reclaim;
  27. static int kgsl_memdesc_get_reclaimed_pages(struct kgsl_mem_entry *entry)
  28. {
  29. struct kgsl_memdesc *memdesc = &entry->memdesc;
  30. int i, ret;
  31. struct page *page;
  32. for (i = 0; i < memdesc->page_count; i++) {
  33. if (memdesc->pages[i])
  34. continue;
  35. page = shmem_read_mapping_page_gfp(
  36. memdesc->shmem_filp->f_mapping, i, kgsl_gfp_mask(0));
  37. if (IS_ERR(page))
  38. return PTR_ERR(page);
  39. kgsl_page_sync(memdesc->dev, page, PAGE_SIZE, DMA_BIDIRECTIONAL);
  40. /*
  41. * Update the pages array only if vmfault has not
  42. * updated it meanwhile
  43. */
  44. spin_lock(&memdesc->lock);
  45. if (!memdesc->pages[i]) {
  46. memdesc->pages[i] = page;
  47. atomic_dec(&entry->priv->unpinned_page_count);
  48. } else
  49. put_page(page);
  50. spin_unlock(&memdesc->lock);
  51. }
  52. ret = kgsl_mmu_map(memdesc->pagetable, memdesc);
  53. if (ret)
  54. return ret;
  55. trace_kgsl_reclaim_memdesc(entry, false);
  56. memdesc->priv &= ~KGSL_MEMDESC_RECLAIMED;
  57. memdesc->priv &= ~KGSL_MEMDESC_SKIP_RECLAIM;
  58. return 0;
  59. }
  60. int kgsl_reclaim_to_pinned_state(
  61. struct kgsl_process_private *process)
  62. {
  63. struct kgsl_mem_entry *entry, *valid_entry;
  64. int next = 0, ret = 0, count;
  65. mutex_lock(&process->reclaim_lock);
  66. if (test_bit(KGSL_PROC_PINNED_STATE, &process->state))
  67. goto done;
  68. count = atomic_read(&process->unpinned_page_count);
  69. for ( ; ; ) {
  70. valid_entry = NULL;
  71. spin_lock(&process->mem_lock);
  72. entry = idr_get_next(&process->mem_idr, &next);
  73. if (entry == NULL) {
  74. spin_unlock(&process->mem_lock);
  75. break;
  76. }
  77. if (entry->memdesc.priv & KGSL_MEMDESC_RECLAIMED)
  78. valid_entry = kgsl_mem_entry_get(entry);
  79. spin_unlock(&process->mem_lock);
  80. if (valid_entry) {
  81. ret = kgsl_memdesc_get_reclaimed_pages(entry);
  82. kgsl_mem_entry_put(entry);
  83. if (ret)
  84. goto done;
  85. }
  86. next++;
  87. }
  88. trace_kgsl_reclaim_process(process, count, false);
  89. set_bit(KGSL_PROC_PINNED_STATE, &process->state);
  90. done:
  91. mutex_unlock(&process->reclaim_lock);
  92. return ret;
  93. }
  94. static void kgsl_reclaim_foreground_work(struct work_struct *work)
  95. {
  96. struct kgsl_process_private *process =
  97. container_of(work, struct kgsl_process_private, fg_work);
  98. if (test_bit(KGSL_PROC_STATE, &process->state))
  99. kgsl_reclaim_to_pinned_state(process);
  100. kgsl_process_private_put(process);
  101. }
  102. static ssize_t kgsl_proc_state_show(struct kobject *kobj,
  103. struct kgsl_process_attribute *attr, char *buf)
  104. {
  105. struct kgsl_process_private *process =
  106. container_of(kobj, struct kgsl_process_private, kobj);
  107. if (test_bit(KGSL_PROC_STATE, &process->state))
  108. return scnprintf(buf, PAGE_SIZE, "foreground\n");
  109. else
  110. return scnprintf(buf, PAGE_SIZE, "background\n");
  111. }
  112. static ssize_t kgsl_proc_state_store(struct kobject *kobj,
  113. struct kgsl_process_attribute *attr, const char *buf, ssize_t count)
  114. {
  115. struct kgsl_process_private *process =
  116. container_of(kobj, struct kgsl_process_private, kobj);
  117. if (sysfs_streq(buf, "foreground")) {
  118. if (!test_and_set_bit(KGSL_PROC_STATE, &process->state) &&
  119. kgsl_process_private_get(process))
  120. kgsl_schedule_work(&process->fg_work);
  121. } else if (sysfs_streq(buf, "background")) {
  122. clear_bit(KGSL_PROC_STATE, &process->state);
  123. } else
  124. return -EINVAL;
  125. return count;
  126. }
  127. static ssize_t gpumem_reclaimed_show(struct kobject *kobj,
  128. struct kgsl_process_attribute *attr, char *buf)
  129. {
  130. struct kgsl_process_private *process =
  131. container_of(kobj, struct kgsl_process_private, kobj);
  132. return scnprintf(buf, PAGE_SIZE, "%d\n",
  133. atomic_read(&process->unpinned_page_count) << PAGE_SHIFT);
  134. }
  135. PROCESS_ATTR(state, 0644, kgsl_proc_state_show, kgsl_proc_state_store);
  136. PROCESS_ATTR(gpumem_reclaimed, 0444, gpumem_reclaimed_show, NULL);
  137. static const struct attribute *proc_reclaim_attrs[] = {
  138. &attr_state.attr,
  139. &attr_gpumem_reclaimed.attr,
  140. NULL,
  141. };
  142. void kgsl_reclaim_proc_sysfs_init(struct kgsl_process_private *process)
  143. {
  144. WARN_ON(sysfs_create_files(&process->kobj, proc_reclaim_attrs));
  145. }
  146. ssize_t kgsl_proc_max_reclaim_limit_store(struct device *dev,
  147. struct device_attribute *attr, const char *buf, size_t count)
  148. {
  149. int ret;
  150. ret = kstrtou32(buf, 0, &kgsl_reclaim_max_page_limit);
  151. return ret ? ret : count;
  152. }
  153. ssize_t kgsl_proc_max_reclaim_limit_show(struct device *dev,
  154. struct device_attribute *attr, char *buf)
  155. {
  156. return scnprintf(buf, PAGE_SIZE, "%d\n", kgsl_reclaim_max_page_limit);
  157. }
  158. ssize_t kgsl_nr_to_scan_store(struct device *dev,
  159. struct device_attribute *attr, const char *buf, size_t count)
  160. {
  161. int ret;
  162. ret = kstrtou32(buf, 0, &kgsl_nr_to_scan);
  163. return ret ? ret : count;
  164. }
  165. ssize_t kgsl_nr_to_scan_show(struct device *dev,
  166. struct device_attribute *attr, char *buf)
  167. {
  168. return scnprintf(buf, PAGE_SIZE, "%d\n", kgsl_nr_to_scan);
  169. }
  170. static void kgsl_release_page_vec(struct pagevec *pvec)
  171. {
  172. check_move_unevictable_pages(pvec);
  173. __pagevec_release(pvec);
  174. }
  175. static u32 kgsl_reclaim_process(struct kgsl_process_private *process,
  176. u32 pages_to_reclaim)
  177. {
  178. struct kgsl_memdesc *memdesc;
  179. struct kgsl_mem_entry *entry, *valid_entry;
  180. u32 next = 0, remaining = pages_to_reclaim;
  181. /*
  182. * If we do not get the lock here, it means that the buffers are
  183. * being pinned back. So do not keep waiting here as we would anyway
  184. * return empty handed once the lock is acquired.
  185. */
  186. if (!mutex_trylock(&process->reclaim_lock))
  187. return 0;
  188. while (remaining) {
  189. if (atomic_read(&process->unpinned_page_count) >=
  190. kgsl_reclaim_max_page_limit)
  191. break;
  192. /* Abort reclaim if process submitted work. */
  193. if (atomic_read(&process->cmd_count))
  194. break;
  195. /* Abort reclaim if process foreground hint is received. */
  196. if (test_bit(KGSL_PROC_STATE, &process->state))
  197. break;
  198. valid_entry = NULL;
  199. spin_lock(&process->mem_lock);
  200. entry = idr_get_next(&process->mem_idr, &next);
  201. if (entry == NULL) {
  202. spin_unlock(&process->mem_lock);
  203. break;
  204. }
  205. memdesc = &entry->memdesc;
  206. if (!entry->pending_free &&
  207. (memdesc->priv & KGSL_MEMDESC_CAN_RECLAIM) &&
  208. !(memdesc->priv & KGSL_MEMDESC_RECLAIMED) &&
  209. !(memdesc->priv & KGSL_MEMDESC_SKIP_RECLAIM))
  210. valid_entry = kgsl_mem_entry_get(entry);
  211. spin_unlock(&process->mem_lock);
  212. if (!valid_entry) {
  213. next++;
  214. continue;
  215. }
  216. /* Do not reclaim pages mapped into a VBO */
  217. if (atomic_read(&valid_entry->vbo_count)) {
  218. kgsl_mem_entry_put(entry);
  219. next++;
  220. continue;
  221. }
  222. if ((atomic_read(&process->unpinned_page_count) +
  223. memdesc->page_count) > kgsl_reclaim_max_page_limit) {
  224. kgsl_mem_entry_put(entry);
  225. next++;
  226. continue;
  227. }
  228. if (memdesc->page_count > remaining) {
  229. kgsl_mem_entry_put(entry);
  230. next++;
  231. continue;
  232. }
  233. if (!kgsl_mmu_unmap(memdesc->pagetable, memdesc)) {
  234. int i;
  235. struct pagevec pvec;
  236. /*
  237. * Pages that are first allocated are by default added to
  238. * unevictable list. To reclaim them, we first clear the
  239. * AS_UNEVICTABLE flag of the shmem file address space thus
  240. * check_move_unevictable_pages() places them on the
  241. * evictable list.
  242. *
  243. * Once reclaim is done, hint that further shmem allocations
  244. * will have to be on the unevictable list.
  245. */
  246. mapping_clear_unevictable(memdesc->shmem_filp->f_mapping);
  247. pagevec_init(&pvec);
  248. for (i = 0; i < memdesc->page_count; i++) {
  249. set_page_dirty_lock(memdesc->pages[i]);
  250. spin_lock(&memdesc->lock);
  251. pagevec_add(&pvec, memdesc->pages[i]);
  252. memdesc->pages[i] = NULL;
  253. atomic_inc(&process->unpinned_page_count);
  254. spin_unlock(&memdesc->lock);
  255. if (pagevec_count(&pvec) == PAGEVEC_SIZE)
  256. kgsl_release_page_vec(&pvec);
  257. remaining--;
  258. }
  259. if (pagevec_count(&pvec))
  260. kgsl_release_page_vec(&pvec);
  261. reclaim_shmem_address_space(memdesc->shmem_filp->f_mapping);
  262. mapping_set_unevictable(memdesc->shmem_filp->f_mapping);
  263. memdesc->priv |= KGSL_MEMDESC_RECLAIMED;
  264. trace_kgsl_reclaim_memdesc(entry, true);
  265. }
  266. kgsl_mem_entry_put(entry);
  267. next++;
  268. }
  269. if (next)
  270. clear_bit(KGSL_PROC_PINNED_STATE, &process->state);
  271. trace_kgsl_reclaim_process(process, pages_to_reclaim - remaining, true);
  272. mutex_unlock(&process->reclaim_lock);
  273. return (pages_to_reclaim - remaining);
  274. }
  275. static void kgsl_reclaim_background_work(struct work_struct *work)
  276. {
  277. u32 bg_proc = 0, nr_pages = atomic_read(&kgsl_nr_to_reclaim);
  278. u64 pp_nr_pages;
  279. struct list_head kgsl_reclaim_process_list;
  280. struct kgsl_process_private *process, *next;
  281. INIT_LIST_HEAD(&kgsl_reclaim_process_list);
  282. read_lock(&kgsl_driver.proclist_lock);
  283. list_for_each_entry(process, &kgsl_driver.process_list, list) {
  284. if (test_bit(KGSL_PROC_STATE, &process->state) ||
  285. !kgsl_process_private_get(process))
  286. continue;
  287. bg_proc++;
  288. list_add(&process->reclaim_list, &kgsl_reclaim_process_list);
  289. }
  290. read_unlock(&kgsl_driver.proclist_lock);
  291. list_for_each_entry(process, &kgsl_reclaim_process_list, reclaim_list) {
  292. if (!nr_pages)
  293. break;
  294. pp_nr_pages = nr_pages;
  295. do_div(pp_nr_pages, bg_proc--);
  296. nr_pages -= kgsl_reclaim_process(process, pp_nr_pages);
  297. }
  298. list_for_each_entry_safe(process, next,
  299. &kgsl_reclaim_process_list, reclaim_list) {
  300. list_del(&process->reclaim_list);
  301. kgsl_process_private_put(process);
  302. }
  303. }
  304. /* Shrinker callback functions */
  305. static unsigned long
  306. kgsl_reclaim_shrink_scan_objects(struct shrinker *shrinker,
  307. struct shrink_control *sc)
  308. {
  309. if (!current_is_kswapd())
  310. return 0;
  311. atomic_set(&kgsl_nr_to_reclaim, kgsl_nr_to_scan ?
  312. kgsl_nr_to_scan : sc->nr_to_scan);
  313. kgsl_schedule_work(&reclaim_work);
  314. return atomic_read(&kgsl_nr_to_reclaim);
  315. }
  316. static unsigned long
  317. kgsl_reclaim_shrink_count_objects(struct shrinker *shrinker,
  318. struct shrink_control *sc)
  319. {
  320. struct kgsl_process_private *process;
  321. unsigned long count_reclaimable = 0;
  322. if (!current_is_kswapd())
  323. return 0;
  324. read_lock(&kgsl_driver.proclist_lock);
  325. list_for_each_entry(process, &kgsl_driver.process_list, list) {
  326. if (!test_bit(KGSL_PROC_STATE, &process->state))
  327. count_reclaimable += kgsl_reclaim_max_page_limit -
  328. atomic_read(&process->unpinned_page_count);
  329. }
  330. read_unlock(&kgsl_driver.proclist_lock);
  331. return count_reclaimable;
  332. }
  333. /* Shrinker callback data*/
  334. static struct shrinker kgsl_reclaim_shrinker = {
  335. .count_objects = kgsl_reclaim_shrink_count_objects,
  336. .scan_objects = kgsl_reclaim_shrink_scan_objects,
  337. .seeks = DEFAULT_SEEKS,
  338. .batch = 0,
  339. };
  340. void kgsl_reclaim_proc_private_init(struct kgsl_process_private *process)
  341. {
  342. mutex_init(&process->reclaim_lock);
  343. INIT_WORK(&process->fg_work, kgsl_reclaim_foreground_work);
  344. set_bit(KGSL_PROC_PINNED_STATE, &process->state);
  345. set_bit(KGSL_PROC_STATE, &process->state);
  346. atomic_set(&process->unpinned_page_count, 0);
  347. }
  348. int kgsl_reclaim_start(void)
  349. {
  350. int ret;
  351. /* Initialize shrinker */
  352. #if (KERNEL_VERSION(6, 0, 0) <= LINUX_VERSION_CODE)
  353. ret = register_shrinker(&kgsl_reclaim_shrinker, "kgsl_reclaim_shrinker");
  354. #else
  355. ret = register_shrinker(&kgsl_reclaim_shrinker);
  356. #endif
  357. if (ret)
  358. pr_err("kgsl: reclaim: Failed to register shrinker\n");
  359. return ret;
  360. }
  361. int kgsl_reclaim_init(void)
  362. {
  363. int ret = kgsl_reclaim_start();
  364. if (ret)
  365. return ret;
  366. INIT_WORK(&reclaim_work, kgsl_reclaim_background_work);
  367. return 0;
  368. }
  369. void kgsl_reclaim_close(void)
  370. {
  371. /* Unregister shrinker */
  372. unregister_shrinker(&kgsl_reclaim_shrinker);
  373. cancel_work_sync(&reclaim_work);
  374. }