drm_pagemap.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281
  1. // SPDX-License-Identifier: GPL-2.0-only OR MIT
  2. /*
  3. * Copyright © 2024-2025 Intel Corporation
  4. */
  5. #include <linux/dma-fence.h>
  6. #include <linux/dma-mapping.h>
  7. #include <linux/migrate.h>
  8. #include <linux/pagemap.h>
  9. #include <drm/drm_drv.h>
  10. #include <drm/drm_pagemap.h>
  11. #include <drm/drm_pagemap_util.h>
  12. #include <drm/drm_print.h>
  13. /**
  14. * DOC: Overview
  15. *
  16. * The DRM pagemap layer is intended to augment the dev_pagemap functionality by
  17. * providing a way to populate a struct mm_struct virtual range with device
  18. * private pages and to provide helpers to abstract device memory allocations,
  19. * to migrate memory back and forth between device memory and system RAM and
  20. * to handle access (and in the future migration) between devices implementing
  21. * a fast interconnect that is not necessarily visible to the rest of the
  22. * system.
  23. *
  24. * Typically the DRM pagemap receives requests from one or more DRM GPU SVM
  25. * instances to populate struct mm_struct virtual ranges with memory, and the
  26. * migration is best effort only and may thus fail. The implementation should
  27. * also handle device unbinding by blocking (return an -ENODEV) error for new
  28. * population requests and after that migrate all device pages to system ram.
  29. */
  30. /**
  31. * DOC: Migration
  32. *
  33. * Migration granularity typically follows the GPU SVM range requests, but
  34. * if there are clashes, due to races or due to the fact that multiple GPU
  35. * SVM instances have different views of the ranges used, and because of that
  36. * parts of a requested range is already present in the requested device memory,
  37. * the implementation has a variety of options. It can fail and it can choose
  38. * to populate only the part of the range that isn't already in device memory,
  39. * and it can evict the range to system before trying to migrate. Ideally an
  40. * implementation would just try to migrate the missing part of the range and
  41. * allocate just enough memory to do so.
  42. *
  43. * When migrating to system memory as a response to a cpu fault or a device
  44. * memory eviction request, currently a full device memory allocation is
  45. * migrated back to system. Moving forward this might need improvement for
  46. * situations where a single page needs bouncing between system memory and
  47. * device memory due to, for example, atomic operations.
  48. *
  49. * Key DRM pagemap components:
  50. *
  51. * - Device Memory Allocations:
  52. * Embedded structure containing enough information for the drm_pagemap to
  53. * migrate to / from device memory.
  54. *
  55. * - Device Memory Operations:
  56. * Define the interface for driver-specific device memory operations
  57. * release memory, populate pfns, and copy to / from device memory.
  58. */
  59. /**
  60. * struct drm_pagemap_zdd - GPU SVM zone device data
  61. *
  62. * @refcount: Reference count for the zdd
  63. * @devmem_allocation: device memory allocation
  64. * @dpagemap: Refcounted pointer to the underlying struct drm_pagemap.
  65. *
  66. * This structure serves as a generic wrapper installed in
  67. * page->zone_device_data. It provides infrastructure for looking up a device
  68. * memory allocation upon CPU page fault and asynchronously releasing device
  69. * memory once the CPU has no page references. Asynchronous release is useful
  70. * because CPU page references can be dropped in IRQ contexts, while releasing
  71. * device memory likely requires sleeping locks.
  72. */
  73. struct drm_pagemap_zdd {
  74. struct kref refcount;
  75. struct drm_pagemap_devmem *devmem_allocation;
  76. struct drm_pagemap *dpagemap;
  77. };
  78. /**
  79. * drm_pagemap_zdd_alloc() - Allocate a zdd structure.
  80. * @dpagemap: Pointer to the underlying struct drm_pagemap.
  81. *
  82. * This function allocates and initializes a new zdd structure. It sets up the
  83. * reference count and initializes the destroy work.
  84. *
  85. * Return: Pointer to the allocated zdd on success, ERR_PTR() on failure.
  86. */
  87. static struct drm_pagemap_zdd *
  88. drm_pagemap_zdd_alloc(struct drm_pagemap *dpagemap)
  89. {
  90. struct drm_pagemap_zdd *zdd;
  91. zdd = kmalloc_obj(*zdd);
  92. if (!zdd)
  93. return NULL;
  94. kref_init(&zdd->refcount);
  95. zdd->devmem_allocation = NULL;
  96. zdd->dpagemap = drm_pagemap_get(dpagemap);
  97. return zdd;
  98. }
  99. /**
  100. * drm_pagemap_zdd_get() - Get a reference to a zdd structure.
  101. * @zdd: Pointer to the zdd structure.
  102. *
  103. * This function increments the reference count of the provided zdd structure.
  104. *
  105. * Return: Pointer to the zdd structure.
  106. */
  107. static struct drm_pagemap_zdd *drm_pagemap_zdd_get(struct drm_pagemap_zdd *zdd)
  108. {
  109. kref_get(&zdd->refcount);
  110. return zdd;
  111. }
  112. /**
  113. * drm_pagemap_zdd_destroy() - Destroy a zdd structure.
  114. * @ref: Pointer to the reference count structure.
  115. *
  116. * This function queues the destroy_work of the zdd for asynchronous destruction.
  117. */
  118. static void drm_pagemap_zdd_destroy(struct kref *ref)
  119. {
  120. struct drm_pagemap_zdd *zdd =
  121. container_of(ref, struct drm_pagemap_zdd, refcount);
  122. struct drm_pagemap_devmem *devmem = zdd->devmem_allocation;
  123. struct drm_pagemap *dpagemap = zdd->dpagemap;
  124. if (devmem) {
  125. complete_all(&devmem->detached);
  126. if (devmem->ops->devmem_release)
  127. devmem->ops->devmem_release(devmem);
  128. }
  129. kfree(zdd);
  130. drm_pagemap_put(dpagemap);
  131. }
  132. /**
  133. * drm_pagemap_zdd_put() - Put a zdd reference.
  134. * @zdd: Pointer to the zdd structure.
  135. *
  136. * This function decrements the reference count of the provided zdd structure
  137. * and schedules its destruction if the count drops to zero.
  138. */
  139. static void drm_pagemap_zdd_put(struct drm_pagemap_zdd *zdd)
  140. {
  141. kref_put(&zdd->refcount, drm_pagemap_zdd_destroy);
  142. }
  143. /**
  144. * drm_pagemap_migration_unlock_put_page() - Put a migration page
  145. * @page: Pointer to the page to put
  146. *
  147. * This function unlocks and puts a page.
  148. */
  149. static void drm_pagemap_migration_unlock_put_page(struct page *page)
  150. {
  151. unlock_page(page);
  152. put_page(page);
  153. }
  154. /**
  155. * drm_pagemap_migration_unlock_put_pages() - Put migration pages
  156. * @npages: Number of pages
  157. * @migrate_pfn: Array of migrate page frame numbers
  158. *
  159. * This function unlocks and puts an array of pages.
  160. */
  161. static void drm_pagemap_migration_unlock_put_pages(unsigned long npages,
  162. unsigned long *migrate_pfn)
  163. {
  164. unsigned long i;
  165. for (i = 0; i < npages; ++i) {
  166. struct page *page;
  167. if (!migrate_pfn[i])
  168. continue;
  169. page = migrate_pfn_to_page(migrate_pfn[i]);
  170. drm_pagemap_migration_unlock_put_page(page);
  171. migrate_pfn[i] = 0;
  172. }
  173. }
  174. /**
  175. * drm_pagemap_get_devmem_page() - Get a reference to a device memory page
  176. * @page: Pointer to the page
  177. * @zdd: Pointer to the GPU SVM zone device data
  178. *
  179. * This function associates the given page with the specified GPU SVM zone
  180. * device data and initializes it for zone device usage.
  181. */
  182. static void drm_pagemap_get_devmem_page(struct page *page,
  183. struct drm_pagemap_zdd *zdd)
  184. {
  185. page->zone_device_data = drm_pagemap_zdd_get(zdd);
  186. zone_device_page_init(page, page_pgmap(page), 0);
  187. }
  188. /**
  189. * drm_pagemap_migrate_map_pages() - Map migration pages for GPU SVM migration
  190. * @dev: The device performing the migration.
  191. * @local_dpagemap: The drm_pagemap local to the migrating device.
  192. * @pagemap_addr: Array to store DMA information corresponding to mapped pages.
  193. * @migrate_pfn: Array of page frame numbers of system pages or peer pages to map.
  194. * @npages: Number of system pages or peer pages to map.
  195. * @dir: Direction of data transfer (e.g., DMA_BIDIRECTIONAL)
  196. * @mdetails: Details governing the migration behaviour.
  197. *
  198. * This function maps pages of memory for migration usage in GPU SVM. It
  199. * iterates over each page frame number provided in @migrate_pfn, maps the
  200. * corresponding page, and stores the DMA address in the provided @dma_addr
  201. * array.
  202. *
  203. * Returns: 0 on success, -EFAULT if an error occurs during mapping.
  204. */
  205. static int drm_pagemap_migrate_map_pages(struct device *dev,
  206. struct drm_pagemap *local_dpagemap,
  207. struct drm_pagemap_addr *pagemap_addr,
  208. unsigned long *migrate_pfn,
  209. unsigned long npages,
  210. enum dma_data_direction dir,
  211. const struct drm_pagemap_migrate_details *mdetails)
  212. {
  213. unsigned long num_peer_pages = 0, num_local_pages = 0, i;
  214. for (i = 0; i < npages;) {
  215. struct page *page = migrate_pfn_to_page(migrate_pfn[i]);
  216. dma_addr_t dma_addr;
  217. struct folio *folio;
  218. unsigned int order = 0;
  219. if (!page)
  220. goto next;
  221. folio = page_folio(page);
  222. order = folio_order(folio);
  223. if (is_device_private_page(page)) {
  224. struct drm_pagemap_zdd *zdd = page->zone_device_data;
  225. struct drm_pagemap *dpagemap = zdd->dpagemap;
  226. struct drm_pagemap_addr addr;
  227. if (dpagemap == local_dpagemap) {
  228. if (!mdetails->can_migrate_same_pagemap)
  229. goto next;
  230. num_local_pages += NR_PAGES(order);
  231. } else {
  232. num_peer_pages += NR_PAGES(order);
  233. }
  234. addr = dpagemap->ops->device_map(dpagemap, dev, page, order, dir);
  235. if (dma_mapping_error(dev, addr.addr))
  236. return -EFAULT;
  237. pagemap_addr[i] = addr;
  238. } else {
  239. dma_addr = dma_map_page(dev, page, 0, page_size(page), dir);
  240. if (dma_mapping_error(dev, dma_addr))
  241. return -EFAULT;
  242. pagemap_addr[i] =
  243. drm_pagemap_addr_encode(dma_addr,
  244. DRM_INTERCONNECT_SYSTEM,
  245. order, dir);
  246. }
  247. next:
  248. i += NR_PAGES(order);
  249. }
  250. if (num_peer_pages)
  251. drm_dbg(local_dpagemap->drm, "Migrating %lu peer pages over interconnect.\n",
  252. num_peer_pages);
  253. if (num_local_pages)
  254. drm_dbg(local_dpagemap->drm, "Migrating %lu local pages over interconnect.\n",
  255. num_local_pages);
  256. return 0;
  257. }
  258. /**
  259. * drm_pagemap_migrate_unmap_pages() - Unmap pages previously mapped for GPU SVM migration
  260. * @dev: The device for which the pages were mapped
  261. * @migrate_pfn: Array of migrate pfns set up for the mapped pages. Used to
  262. * determine the drm_pagemap of a peer device private page.
  263. * @pagemap_addr: Array of DMA information corresponding to mapped pages
  264. * @npages: Number of pages to unmap
  265. * @dir: Direction of data transfer (e.g., DMA_BIDIRECTIONAL)
  266. *
  267. * This function unmaps previously mapped pages of memory for GPU Shared Virtual
  268. * Memory (SVM). It iterates over each DMA address provided in @dma_addr, checks
  269. * if it's valid and not already unmapped, and unmaps the corresponding page.
  270. */
  271. static void drm_pagemap_migrate_unmap_pages(struct device *dev,
  272. struct drm_pagemap_addr *pagemap_addr,
  273. unsigned long *migrate_pfn,
  274. unsigned long npages,
  275. enum dma_data_direction dir)
  276. {
  277. unsigned long i;
  278. for (i = 0; i < npages;) {
  279. struct page *page = migrate_pfn_to_page(migrate_pfn[i]);
  280. if (!page || !pagemap_addr[i].addr || dma_mapping_error(dev, pagemap_addr[i].addr))
  281. goto next;
  282. if (is_zone_device_page(page)) {
  283. struct drm_pagemap_zdd *zdd = page->zone_device_data;
  284. struct drm_pagemap *dpagemap = zdd->dpagemap;
  285. dpagemap->ops->device_unmap(dpagemap, dev, &pagemap_addr[i]);
  286. } else {
  287. dma_unmap_page(dev, pagemap_addr[i].addr,
  288. PAGE_SIZE << pagemap_addr[i].order, dir);
  289. }
  290. next:
  291. i += NR_PAGES(pagemap_addr[i].order);
  292. }
  293. }
  294. static unsigned long
  295. npages_in_range(unsigned long start, unsigned long end)
  296. {
  297. return (end - start) >> PAGE_SHIFT;
  298. }
  299. static int
  300. drm_pagemap_migrate_remote_to_local(struct drm_pagemap_devmem *devmem,
  301. struct device *remote_device,
  302. struct drm_pagemap *remote_dpagemap,
  303. unsigned long local_pfns[],
  304. struct page *remote_pages[],
  305. struct drm_pagemap_addr pagemap_addr[],
  306. unsigned long npages,
  307. const struct drm_pagemap_devmem_ops *ops,
  308. const struct drm_pagemap_migrate_details *mdetails)
  309. {
  310. int err = drm_pagemap_migrate_map_pages(remote_device, remote_dpagemap,
  311. pagemap_addr, local_pfns,
  312. npages, DMA_FROM_DEVICE, mdetails);
  313. if (err)
  314. goto out;
  315. err = ops->copy_to_ram(remote_pages, pagemap_addr, npages,
  316. devmem->pre_migrate_fence);
  317. out:
  318. drm_pagemap_migrate_unmap_pages(remote_device, pagemap_addr, local_pfns,
  319. npages, DMA_FROM_DEVICE);
  320. return err;
  321. }
  322. static int
  323. drm_pagemap_migrate_sys_to_dev(struct drm_pagemap_devmem *devmem,
  324. unsigned long sys_pfns[],
  325. struct page *local_pages[],
  326. struct drm_pagemap_addr pagemap_addr[],
  327. unsigned long npages,
  328. const struct drm_pagemap_devmem_ops *ops,
  329. const struct drm_pagemap_migrate_details *mdetails)
  330. {
  331. int err = drm_pagemap_migrate_map_pages(devmem->dev, devmem->dpagemap,
  332. pagemap_addr, sys_pfns, npages,
  333. DMA_TO_DEVICE, mdetails);
  334. if (err)
  335. goto out;
  336. err = ops->copy_to_devmem(local_pages, pagemap_addr, npages,
  337. devmem->pre_migrate_fence);
  338. out:
  339. drm_pagemap_migrate_unmap_pages(devmem->dev, pagemap_addr, sys_pfns, npages,
  340. DMA_TO_DEVICE);
  341. return err;
  342. }
  343. /**
  344. * struct migrate_range_loc - Cursor into the loop over migrate_pfns for migrating to
  345. * device.
  346. * @start: The current loop index.
  347. * @device: migrating device.
  348. * @dpagemap: Pointer to struct drm_pagemap used by the migrating device.
  349. * @ops: The copy ops to be used for the migrating device.
  350. */
  351. struct migrate_range_loc {
  352. unsigned long start;
  353. struct device *device;
  354. struct drm_pagemap *dpagemap;
  355. const struct drm_pagemap_devmem_ops *ops;
  356. };
  357. static int drm_pagemap_migrate_range(struct drm_pagemap_devmem *devmem,
  358. unsigned long src_pfns[],
  359. unsigned long dst_pfns[],
  360. struct page *pages[],
  361. struct drm_pagemap_addr pagemap_addr[],
  362. struct migrate_range_loc *last,
  363. const struct migrate_range_loc *cur,
  364. const struct drm_pagemap_migrate_details *mdetails)
  365. {
  366. int ret = 0;
  367. if (cur->start == 0)
  368. goto out;
  369. if (cur->start <= last->start)
  370. return 0;
  371. if (cur->dpagemap == last->dpagemap && cur->ops == last->ops)
  372. return 0;
  373. if (last->dpagemap)
  374. ret = drm_pagemap_migrate_remote_to_local(devmem,
  375. last->device,
  376. last->dpagemap,
  377. &dst_pfns[last->start],
  378. &pages[last->start],
  379. &pagemap_addr[last->start],
  380. cur->start - last->start,
  381. last->ops, mdetails);
  382. else
  383. ret = drm_pagemap_migrate_sys_to_dev(devmem,
  384. &src_pfns[last->start],
  385. &pages[last->start],
  386. &pagemap_addr[last->start],
  387. cur->start - last->start,
  388. last->ops, mdetails);
  389. out:
  390. *last = *cur;
  391. return ret;
  392. }
  393. /**
  394. * drm_pagemap_migrate_to_devmem() - Migrate a struct mm_struct range to device memory
  395. * @devmem_allocation: The device memory allocation to migrate to.
  396. * The caller should hold a reference to the device memory allocation,
  397. * and the reference is consumed by this function even if it returns with
  398. * an error.
  399. * @mm: Pointer to the struct mm_struct.
  400. * @start: Start of the virtual address range to migrate.
  401. * @end: End of the virtual address range to migrate.
  402. * @mdetails: Details to govern the migration.
  403. *
  404. * This function migrates the specified virtual address range to device memory.
  405. * It performs the necessary setup and invokes the driver-specific operations for
  406. * migration to device memory. Expected to be called while holding the mmap lock in
  407. * at least read mode.
  408. *
  409. * Note: The @timeslice_ms parameter can typically be used to force data to
  410. * remain in pagemap pages long enough for a GPU to perform a task and to prevent
  411. * a migration livelock. One alternative would be for the GPU driver to block
  412. * in a mmu_notifier for the specified amount of time, but adding the
  413. * functionality to the pagemap is likely nicer to the system as a whole.
  414. *
  415. * Return: %0 on success, negative error code on failure.
  416. */
  417. int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
  418. struct mm_struct *mm,
  419. unsigned long start, unsigned long end,
  420. const struct drm_pagemap_migrate_details *mdetails)
  421. {
  422. const struct drm_pagemap_devmem_ops *ops = devmem_allocation->ops;
  423. struct drm_pagemap *dpagemap = devmem_allocation->dpagemap;
  424. struct dev_pagemap *pagemap = dpagemap->pagemap;
  425. struct migrate_vma migrate = {
  426. .start = start,
  427. .end = end,
  428. .pgmap_owner = pagemap->owner,
  429. .flags = MIGRATE_VMA_SELECT_SYSTEM | MIGRATE_VMA_SELECT_DEVICE_COHERENT |
  430. MIGRATE_VMA_SELECT_DEVICE_PRIVATE,
  431. };
  432. unsigned long i, npages = npages_in_range(start, end);
  433. unsigned long own_pages = 0, migrated_pages = 0;
  434. struct migrate_range_loc cur, last = {.device = dpagemap->drm->dev, .ops = ops};
  435. struct vm_area_struct *vas;
  436. struct drm_pagemap_zdd *zdd = NULL;
  437. struct page **pages;
  438. struct drm_pagemap_addr *pagemap_addr;
  439. void *buf;
  440. int err;
  441. mmap_assert_locked(mm);
  442. if (!ops->populate_devmem_pfn || !ops->copy_to_devmem ||
  443. !ops->copy_to_ram)
  444. return -EOPNOTSUPP;
  445. vas = vma_lookup(mm, start);
  446. if (!vas) {
  447. err = -ENOENT;
  448. goto err_out;
  449. }
  450. if (end > vas->vm_end || start < vas->vm_start) {
  451. err = -EINVAL;
  452. goto err_out;
  453. }
  454. if (!vma_is_anonymous(vas)) {
  455. err = -EBUSY;
  456. goto err_out;
  457. }
  458. buf = kvcalloc(npages, 2 * sizeof(*migrate.src) + sizeof(*pagemap_addr) +
  459. sizeof(*pages), GFP_KERNEL);
  460. if (!buf) {
  461. err = -ENOMEM;
  462. goto err_out;
  463. }
  464. pagemap_addr = buf + (2 * sizeof(*migrate.src) * npages);
  465. pages = buf + (2 * sizeof(*migrate.src) + sizeof(*pagemap_addr)) * npages;
  466. zdd = drm_pagemap_zdd_alloc(dpagemap);
  467. if (!zdd) {
  468. err = -ENOMEM;
  469. kvfree(buf);
  470. goto err_out;
  471. }
  472. zdd->devmem_allocation = devmem_allocation; /* Owns ref */
  473. migrate.vma = vas;
  474. migrate.src = buf;
  475. migrate.dst = migrate.src + npages;
  476. err = migrate_vma_setup(&migrate);
  477. if (err)
  478. goto err_free;
  479. if (!migrate.cpages) {
  480. /* No pages to migrate. Raced or unknown device pages. */
  481. err = -EBUSY;
  482. goto err_free;
  483. }
  484. if (migrate.cpages != npages) {
  485. /*
  486. * Some pages to migrate. But we want to migrate all or
  487. * nothing. Raced or unknown device pages.
  488. */
  489. err = -EBUSY;
  490. goto err_aborted_migration;
  491. }
  492. /* Count device-private pages to migrate */
  493. for (i = 0; i < npages;) {
  494. struct page *src_page = migrate_pfn_to_page(migrate.src[i]);
  495. unsigned long nr_pages = src_page ? NR_PAGES(folio_order(page_folio(src_page))) : 1;
  496. if (src_page && is_zone_device_page(src_page)) {
  497. if (page_pgmap(src_page) == pagemap)
  498. own_pages += nr_pages;
  499. }
  500. i += nr_pages;
  501. }
  502. drm_dbg(dpagemap->drm, "Total pages %lu; Own pages: %lu.\n",
  503. npages, own_pages);
  504. if (own_pages == npages) {
  505. err = 0;
  506. drm_dbg(dpagemap->drm, "Migration wasn't necessary.\n");
  507. goto err_aborted_migration;
  508. } else if (own_pages && !mdetails->can_migrate_same_pagemap) {
  509. err = -EBUSY;
  510. drm_dbg(dpagemap->drm, "Migration aborted due to fragmentation.\n");
  511. goto err_aborted_migration;
  512. }
  513. err = ops->populate_devmem_pfn(devmem_allocation, npages, migrate.dst);
  514. if (err)
  515. goto err_aborted_migration;
  516. own_pages = 0;
  517. for (i = 0; i < npages; ++i) {
  518. struct page *page = pfn_to_page(migrate.dst[i]);
  519. struct page *src_page = migrate_pfn_to_page(migrate.src[i]);
  520. cur.start = i;
  521. pages[i] = NULL;
  522. if (src_page && is_device_private_page(src_page)) {
  523. struct drm_pagemap_zdd *src_zdd = src_page->zone_device_data;
  524. if (page_pgmap(src_page) == pagemap &&
  525. !mdetails->can_migrate_same_pagemap) {
  526. migrate.dst[i] = 0;
  527. own_pages++;
  528. continue;
  529. }
  530. if (mdetails->source_peer_migrates) {
  531. cur.dpagemap = src_zdd->dpagemap;
  532. cur.ops = src_zdd->devmem_allocation->ops;
  533. cur.device = cur.dpagemap->drm->dev;
  534. pages[i] = src_page;
  535. }
  536. }
  537. if (!pages[i]) {
  538. cur.dpagemap = NULL;
  539. cur.ops = ops;
  540. cur.device = dpagemap->drm->dev;
  541. pages[i] = page;
  542. }
  543. migrate.dst[i] = migrate_pfn(migrate.dst[i]);
  544. drm_pagemap_get_devmem_page(page, zdd);
  545. /* If we switched the migrating drm_pagemap, migrate previous pages now */
  546. err = drm_pagemap_migrate_range(devmem_allocation, migrate.src, migrate.dst,
  547. pages, pagemap_addr, &last, &cur,
  548. mdetails);
  549. if (err) {
  550. npages = i + 1;
  551. goto err_finalize;
  552. }
  553. }
  554. cur.start = npages;
  555. cur.ops = NULL; /* Force migration */
  556. err = drm_pagemap_migrate_range(devmem_allocation, migrate.src, migrate.dst,
  557. pages, pagemap_addr, &last, &cur, mdetails);
  558. if (err)
  559. goto err_finalize;
  560. drm_WARN_ON(dpagemap->drm, !!own_pages);
  561. dma_fence_put(devmem_allocation->pre_migrate_fence);
  562. devmem_allocation->pre_migrate_fence = NULL;
  563. /* Upon success bind devmem allocation to range and zdd */
  564. devmem_allocation->timeslice_expiration = get_jiffies_64() +
  565. msecs_to_jiffies(mdetails->timeslice_ms);
  566. err_finalize:
  567. if (err)
  568. drm_pagemap_migration_unlock_put_pages(npages, migrate.dst);
  569. err_aborted_migration:
  570. migrate_vma_pages(&migrate);
  571. for (i = 0; !err && i < npages;) {
  572. struct page *page = migrate_pfn_to_page(migrate.src[i]);
  573. unsigned long nr_pages = page ? NR_PAGES(folio_order(page_folio(page))) : 1;
  574. if (migrate.src[i] & MIGRATE_PFN_MIGRATE)
  575. migrated_pages += nr_pages;
  576. i += nr_pages;
  577. }
  578. if (!err && migrated_pages < npages - own_pages) {
  579. drm_dbg(dpagemap->drm, "Raced while finalizing migration.\n");
  580. err = -EBUSY;
  581. }
  582. migrate_vma_finalize(&migrate);
  583. err_free:
  584. drm_pagemap_zdd_put(zdd);
  585. kvfree(buf);
  586. return err;
  587. err_out:
  588. devmem_allocation->ops->devmem_release(devmem_allocation);
  589. return err;
  590. }
  591. EXPORT_SYMBOL_GPL(drm_pagemap_migrate_to_devmem);
  592. /**
  593. * drm_pagemap_migrate_populate_ram_pfn() - Populate RAM PFNs for a VM area
  594. * @vas: Pointer to the VM area structure, can be NULL
  595. * @fault_page: Fault page
  596. * @npages: Number of pages to populate
  597. * @mpages: Number of pages to migrate
  598. * @src_mpfn: Source array of migrate PFNs
  599. * @mpfn: Array of migrate PFNs to populate
  600. * @addr: Start address for PFN allocation
  601. *
  602. * This function populates the RAM migrate page frame numbers (PFNs) for the
  603. * specified VM area structure. It allocates and locks pages in the VM area for
  604. * RAM usage. If vas is non-NULL use alloc_page_vma for allocation, if NULL use
  605. * alloc_page for allocation.
  606. *
  607. * Return: 0 on success, negative error code on failure.
  608. */
  609. static int drm_pagemap_migrate_populate_ram_pfn(struct vm_area_struct *vas,
  610. struct page *fault_page,
  611. unsigned long npages,
  612. unsigned long *mpages,
  613. unsigned long *src_mpfn,
  614. unsigned long *mpfn,
  615. unsigned long addr)
  616. {
  617. unsigned long i;
  618. for (i = 0; i < npages;) {
  619. struct page *page = NULL, *src_page;
  620. struct folio *folio;
  621. unsigned int order = 0;
  622. if (!(src_mpfn[i] & MIGRATE_PFN_MIGRATE))
  623. goto next;
  624. src_page = migrate_pfn_to_page(src_mpfn[i]);
  625. if (!src_page)
  626. goto next;
  627. if (fault_page) {
  628. if (src_page->zone_device_data !=
  629. fault_page->zone_device_data)
  630. goto next;
  631. }
  632. order = folio_order(page_folio(src_page));
  633. /* TODO: Support fallback to single pages if THP allocation fails */
  634. if (vas)
  635. folio = vma_alloc_folio(GFP_HIGHUSER, order, vas, addr);
  636. else
  637. folio = folio_alloc(GFP_HIGHUSER, order);
  638. if (!folio)
  639. goto free_pages;
  640. page = folio_page(folio, 0);
  641. mpfn[i] = migrate_pfn(page_to_pfn(page));
  642. next:
  643. if (page)
  644. addr += page_size(page);
  645. else
  646. addr += PAGE_SIZE;
  647. i += NR_PAGES(order);
  648. }
  649. for (i = 0; i < npages;) {
  650. struct page *page = migrate_pfn_to_page(mpfn[i]);
  651. unsigned int order = 0;
  652. if (!page)
  653. goto next_lock;
  654. WARN_ON_ONCE(!folio_trylock(page_folio(page)));
  655. order = folio_order(page_folio(page));
  656. *mpages += NR_PAGES(order);
  657. next_lock:
  658. i += NR_PAGES(order);
  659. }
  660. return 0;
  661. free_pages:
  662. for (i = 0; i < npages;) {
  663. struct page *page = migrate_pfn_to_page(mpfn[i]);
  664. unsigned int order = 0;
  665. if (!page)
  666. goto next_put;
  667. put_page(page);
  668. mpfn[i] = 0;
  669. order = folio_order(page_folio(page));
  670. next_put:
  671. i += NR_PAGES(order);
  672. }
  673. return -ENOMEM;
  674. }
  675. static void drm_pagemap_dev_unhold_work(struct work_struct *work);
  676. static LLIST_HEAD(drm_pagemap_unhold_list);
  677. static DECLARE_WORK(drm_pagemap_work, drm_pagemap_dev_unhold_work);
  678. /**
  679. * struct drm_pagemap_dev_hold - Struct to aid in drm_device release.
  680. * @link: Link into drm_pagemap_unhold_list for deferred reference releases.
  681. * @drm: drm device to put.
  682. *
  683. * When a struct drm_pagemap is released, we also need to release the
  684. * reference it holds on the drm device. However, typically that needs
  685. * to be done separately from a system-wide workqueue.
  686. * Each time a struct drm_pagemap is initialized
  687. * (or re-initialized if cached) therefore allocate a separate
  688. * drm_pagemap_dev_hold item, from which we put the drm device and
  689. * associated module.
  690. */
  691. struct drm_pagemap_dev_hold {
  692. struct llist_node link;
  693. struct drm_device *drm;
  694. };
  695. static void drm_pagemap_release(struct kref *ref)
  696. {
  697. struct drm_pagemap *dpagemap = container_of(ref, typeof(*dpagemap), ref);
  698. struct drm_pagemap_dev_hold *dev_hold = dpagemap->dev_hold;
  699. /*
  700. * We know the pagemap provider is alive at this point, since
  701. * the struct drm_pagemap_dev_hold holds a reference to the
  702. * pagemap provider drm_device and its module.
  703. */
  704. dpagemap->dev_hold = NULL;
  705. drm_pagemap_shrinker_add(dpagemap);
  706. llist_add(&dev_hold->link, &drm_pagemap_unhold_list);
  707. schedule_work(&drm_pagemap_work);
  708. /*
  709. * Here, either the provider device is still alive, since if called from
  710. * page_free(), the caller is holding a reference on the dev_pagemap,
  711. * or if called from drm_pagemap_put(), the direct caller is still alive.
  712. * This ensures we can't race with THIS module unload.
  713. */
  714. }
  715. static void drm_pagemap_dev_unhold_work(struct work_struct *work)
  716. {
  717. struct llist_node *node = llist_del_all(&drm_pagemap_unhold_list);
  718. struct drm_pagemap_dev_hold *dev_hold, *next;
  719. /*
  720. * Deferred release of drm_pagemap provider device and module.
  721. * THIS module is kept alive during the release by the
  722. * flush_work() in the drm_pagemap_exit() function.
  723. */
  724. llist_for_each_entry_safe(dev_hold, next, node, link) {
  725. struct drm_device *drm = dev_hold->drm;
  726. struct module *module = drm->driver->fops->owner;
  727. drm_dbg(drm, "Releasing reference on provider device and module.\n");
  728. drm_dev_put(drm);
  729. module_put(module);
  730. kfree(dev_hold);
  731. }
  732. }
  733. static struct drm_pagemap_dev_hold *
  734. drm_pagemap_dev_hold(struct drm_pagemap *dpagemap)
  735. {
  736. struct drm_pagemap_dev_hold *dev_hold;
  737. struct drm_device *drm = dpagemap->drm;
  738. dev_hold = kzalloc_obj(*dev_hold);
  739. if (!dev_hold)
  740. return ERR_PTR(-ENOMEM);
  741. init_llist_node(&dev_hold->link);
  742. dev_hold->drm = drm;
  743. (void)try_module_get(drm->driver->fops->owner);
  744. drm_dev_get(drm);
  745. return dev_hold;
  746. }
  747. /**
  748. * drm_pagemap_reinit() - Reinitialize a drm_pagemap
  749. * @dpagemap: The drm_pagemap to reinitialize
  750. *
  751. * Reinitialize a drm_pagemap, for which drm_pagemap_release
  752. * has already been called. This interface is intended for the
  753. * situation where the driver caches a destroyed drm_pagemap.
  754. *
  755. * Return: 0 on success, negative error code on failure.
  756. */
  757. int drm_pagemap_reinit(struct drm_pagemap *dpagemap)
  758. {
  759. dpagemap->dev_hold = drm_pagemap_dev_hold(dpagemap);
  760. if (IS_ERR(dpagemap->dev_hold))
  761. return PTR_ERR(dpagemap->dev_hold);
  762. kref_init(&dpagemap->ref);
  763. return 0;
  764. }
  765. EXPORT_SYMBOL(drm_pagemap_reinit);
  766. /**
  767. * drm_pagemap_init() - Initialize a pre-allocated drm_pagemap
  768. * @dpagemap: The drm_pagemap to initialize.
  769. * @pagemap: The associated dev_pagemap providing the device
  770. * private pages.
  771. * @drm: The drm device. The drm_pagemap holds a reference on the
  772. * drm_device and the module owning the drm_device until
  773. * drm_pagemap_release(). This facilitates drm_pagemap exporting.
  774. * @ops: The drm_pagemap ops.
  775. *
  776. * Initialize and take an initial reference on a drm_pagemap.
  777. * After successful return, use drm_pagemap_put() to destroy.
  778. *
  779. ** Return: 0 on success, negative error code on error.
  780. */
  781. int drm_pagemap_init(struct drm_pagemap *dpagemap,
  782. struct dev_pagemap *pagemap,
  783. struct drm_device *drm,
  784. const struct drm_pagemap_ops *ops)
  785. {
  786. kref_init(&dpagemap->ref);
  787. dpagemap->ops = ops;
  788. dpagemap->pagemap = pagemap;
  789. dpagemap->drm = drm;
  790. dpagemap->cache = NULL;
  791. INIT_LIST_HEAD(&dpagemap->shrink_link);
  792. return drm_pagemap_reinit(dpagemap);
  793. }
  794. EXPORT_SYMBOL(drm_pagemap_init);
  795. /**
  796. * drm_pagemap_put() - Put a struct drm_pagemap reference
  797. * @dpagemap: Pointer to a struct drm_pagemap object.
  798. *
  799. * Puts a struct drm_pagemap reference and frees the drm_pagemap object
  800. * if the refount reaches zero.
  801. */
  802. void drm_pagemap_put(struct drm_pagemap *dpagemap)
  803. {
  804. if (likely(dpagemap)) {
  805. drm_pagemap_shrinker_might_lock(dpagemap);
  806. kref_put(&dpagemap->ref, drm_pagemap_release);
  807. }
  808. }
  809. EXPORT_SYMBOL(drm_pagemap_put);
  810. /**
  811. * drm_pagemap_evict_to_ram() - Evict GPU SVM range to RAM
  812. * @devmem_allocation: Pointer to the device memory allocation
  813. *
  814. * Similar to __drm_pagemap_migrate_to_ram but does not require mmap lock and
  815. * migration done via migrate_device_* functions.
  816. *
  817. * Return: 0 on success, negative error code on failure.
  818. */
  819. int drm_pagemap_evict_to_ram(struct drm_pagemap_devmem *devmem_allocation)
  820. {
  821. const struct drm_pagemap_devmem_ops *ops = devmem_allocation->ops;
  822. struct drm_pagemap_migrate_details mdetails = {};
  823. unsigned long npages, mpages = 0;
  824. struct page **pages;
  825. unsigned long *src, *dst;
  826. struct drm_pagemap_addr *pagemap_addr;
  827. void *buf;
  828. int i, err = 0;
  829. unsigned int retry_count = 2;
  830. npages = devmem_allocation->size >> PAGE_SHIFT;
  831. retry:
  832. if (!mmget_not_zero(devmem_allocation->mm))
  833. return -EFAULT;
  834. buf = kvcalloc(npages, 2 * sizeof(*src) + sizeof(*pagemap_addr) +
  835. sizeof(*pages), GFP_KERNEL);
  836. if (!buf) {
  837. err = -ENOMEM;
  838. goto err_out;
  839. }
  840. src = buf;
  841. dst = buf + (sizeof(*src) * npages);
  842. pagemap_addr = buf + (2 * sizeof(*src) * npages);
  843. pages = buf + (2 * sizeof(*src) + sizeof(*pagemap_addr)) * npages;
  844. err = ops->populate_devmem_pfn(devmem_allocation, npages, src);
  845. if (err)
  846. goto err_free;
  847. err = migrate_device_pfns(src, npages);
  848. if (err)
  849. goto err_free;
  850. err = drm_pagemap_migrate_populate_ram_pfn(NULL, NULL, npages, &mpages,
  851. src, dst, 0);
  852. if (err || !mpages)
  853. goto err_finalize;
  854. err = drm_pagemap_migrate_map_pages(devmem_allocation->dev,
  855. devmem_allocation->dpagemap, pagemap_addr,
  856. dst, npages, DMA_FROM_DEVICE,
  857. &mdetails);
  858. if (err)
  859. goto err_finalize;
  860. for (i = 0; i < npages; ++i)
  861. pages[i] = migrate_pfn_to_page(src[i]);
  862. err = ops->copy_to_ram(pages, pagemap_addr, npages, NULL);
  863. if (err)
  864. goto err_finalize;
  865. err_finalize:
  866. if (err)
  867. drm_pagemap_migration_unlock_put_pages(npages, dst);
  868. migrate_device_pages(src, dst, npages);
  869. migrate_device_finalize(src, dst, npages);
  870. drm_pagemap_migrate_unmap_pages(devmem_allocation->dev, pagemap_addr, dst, npages,
  871. DMA_FROM_DEVICE);
  872. err_free:
  873. kvfree(buf);
  874. err_out:
  875. mmput_async(devmem_allocation->mm);
  876. if (completion_done(&devmem_allocation->detached))
  877. return 0;
  878. if (retry_count--) {
  879. cond_resched();
  880. goto retry;
  881. }
  882. return err ?: -EBUSY;
  883. }
  884. EXPORT_SYMBOL_GPL(drm_pagemap_evict_to_ram);
  885. /**
  886. * __drm_pagemap_migrate_to_ram() - Migrate GPU SVM range to RAM (internal)
  887. * @vas: Pointer to the VM area structure
  888. * @page: Pointer to the page for fault handling.
  889. * @fault_addr: Fault address
  890. * @size: Size of migration
  891. *
  892. * This internal function performs the migration of the specified GPU SVM range
  893. * to RAM. It sets up the migration, populates + dma maps RAM PFNs, and
  894. * invokes the driver-specific operations for migration to RAM.
  895. *
  896. * Return: 0 on success, negative error code on failure.
  897. */
  898. static int __drm_pagemap_migrate_to_ram(struct vm_area_struct *vas,
  899. struct page *page,
  900. unsigned long fault_addr,
  901. unsigned long size)
  902. {
  903. struct migrate_vma migrate = {
  904. .vma = vas,
  905. .pgmap_owner = page_pgmap(page)->owner,
  906. .flags = MIGRATE_VMA_SELECT_DEVICE_PRIVATE |
  907. MIGRATE_VMA_SELECT_DEVICE_COHERENT,
  908. .fault_page = page,
  909. };
  910. struct drm_pagemap_migrate_details mdetails = {};
  911. struct drm_pagemap_zdd *zdd;
  912. const struct drm_pagemap_devmem_ops *ops;
  913. struct device *dev = NULL;
  914. unsigned long npages, mpages = 0;
  915. struct page **pages;
  916. struct drm_pagemap_addr *pagemap_addr;
  917. unsigned long start, end;
  918. void *buf;
  919. int i, err = 0;
  920. zdd = page->zone_device_data;
  921. if (time_before64(get_jiffies_64(), zdd->devmem_allocation->timeslice_expiration))
  922. return 0;
  923. start = ALIGN_DOWN(fault_addr, size);
  924. end = ALIGN(fault_addr + 1, size);
  925. /* Corner where VMA area struct has been partially unmapped */
  926. if (start < vas->vm_start)
  927. start = vas->vm_start;
  928. if (end > vas->vm_end)
  929. end = vas->vm_end;
  930. migrate.start = start;
  931. migrate.end = end;
  932. npages = npages_in_range(start, end);
  933. buf = kvcalloc(npages, 2 * sizeof(*migrate.src) + sizeof(*pagemap_addr) +
  934. sizeof(*pages), GFP_KERNEL);
  935. if (!buf) {
  936. err = -ENOMEM;
  937. goto err_out;
  938. }
  939. pagemap_addr = buf + (2 * sizeof(*migrate.src) * npages);
  940. pages = buf + (2 * sizeof(*migrate.src) + sizeof(*pagemap_addr)) * npages;
  941. migrate.vma = vas;
  942. migrate.src = buf;
  943. migrate.dst = migrate.src + npages;
  944. err = migrate_vma_setup(&migrate);
  945. if (err)
  946. goto err_free;
  947. /* Raced with another CPU fault, nothing to do */
  948. if (!migrate.cpages)
  949. goto err_free;
  950. ops = zdd->devmem_allocation->ops;
  951. dev = zdd->devmem_allocation->dev;
  952. err = drm_pagemap_migrate_populate_ram_pfn(vas, page, npages, &mpages,
  953. migrate.src, migrate.dst,
  954. start);
  955. if (err)
  956. goto err_finalize;
  957. err = drm_pagemap_migrate_map_pages(dev, zdd->dpagemap, pagemap_addr, migrate.dst, npages,
  958. DMA_FROM_DEVICE, &mdetails);
  959. if (err)
  960. goto err_finalize;
  961. for (i = 0; i < npages; ++i)
  962. pages[i] = migrate_pfn_to_page(migrate.src[i]);
  963. err = ops->copy_to_ram(pages, pagemap_addr, npages, NULL);
  964. if (err)
  965. goto err_finalize;
  966. err_finalize:
  967. if (err)
  968. drm_pagemap_migration_unlock_put_pages(npages, migrate.dst);
  969. migrate_vma_pages(&migrate);
  970. migrate_vma_finalize(&migrate);
  971. if (dev)
  972. drm_pagemap_migrate_unmap_pages(dev, pagemap_addr, migrate.dst,
  973. npages, DMA_FROM_DEVICE);
  974. err_free:
  975. kvfree(buf);
  976. err_out:
  977. return err;
  978. }
  979. /**
  980. * drm_pagemap_folio_free() - Put GPU SVM zone device data associated with a folio
  981. * @folio: Pointer to the folio
  982. *
  983. * This function is a callback used to put the GPU SVM zone device data
  984. * associated with a page when it is being released.
  985. */
  986. static void drm_pagemap_folio_free(struct folio *folio)
  987. {
  988. drm_pagemap_zdd_put(folio->page.zone_device_data);
  989. }
  990. /**
  991. * drm_pagemap_migrate_to_ram() - Migrate a virtual range to RAM (page fault handler)
  992. * @vmf: Pointer to the fault information structure
  993. *
  994. * This function is a page fault handler used to migrate a virtual range
  995. * to ram. The device memory allocation in which the device page is found is
  996. * migrated in its entirety.
  997. *
  998. * Returns:
  999. * VM_FAULT_SIGBUS on failure, 0 on success.
  1000. */
  1001. static vm_fault_t drm_pagemap_migrate_to_ram(struct vm_fault *vmf)
  1002. {
  1003. struct drm_pagemap_zdd *zdd = vmf->page->zone_device_data;
  1004. int err;
  1005. err = __drm_pagemap_migrate_to_ram(vmf->vma,
  1006. vmf->page, vmf->address,
  1007. zdd->devmem_allocation->size);
  1008. return err ? VM_FAULT_SIGBUS : 0;
  1009. }
  1010. static const struct dev_pagemap_ops drm_pagemap_pagemap_ops = {
  1011. .folio_free = drm_pagemap_folio_free,
  1012. .migrate_to_ram = drm_pagemap_migrate_to_ram,
  1013. };
  1014. /**
  1015. * drm_pagemap_pagemap_ops_get() - Retrieve GPU SVM device page map operations
  1016. *
  1017. * Returns:
  1018. * Pointer to the GPU SVM device page map operations structure.
  1019. */
  1020. const struct dev_pagemap_ops *drm_pagemap_pagemap_ops_get(void)
  1021. {
  1022. return &drm_pagemap_pagemap_ops;
  1023. }
  1024. EXPORT_SYMBOL_GPL(drm_pagemap_pagemap_ops_get);
  1025. /**
  1026. * drm_pagemap_devmem_init() - Initialize a drm_pagemap device memory allocation
  1027. *
  1028. * @devmem_allocation: The struct drm_pagemap_devmem to initialize.
  1029. * @dev: Pointer to the device structure which device memory allocation belongs to
  1030. * @mm: Pointer to the mm_struct for the address space
  1031. * @ops: Pointer to the operations structure for GPU SVM device memory
  1032. * @dpagemap: The struct drm_pagemap we're allocating from.
  1033. * @size: Size of device memory allocation
  1034. * @pre_migrate_fence: Fence to wait for or pipeline behind before migration starts.
  1035. * (May be NULL).
  1036. */
  1037. void drm_pagemap_devmem_init(struct drm_pagemap_devmem *devmem_allocation,
  1038. struct device *dev, struct mm_struct *mm,
  1039. const struct drm_pagemap_devmem_ops *ops,
  1040. struct drm_pagemap *dpagemap, size_t size,
  1041. struct dma_fence *pre_migrate_fence)
  1042. {
  1043. init_completion(&devmem_allocation->detached);
  1044. devmem_allocation->dev = dev;
  1045. devmem_allocation->mm = mm;
  1046. devmem_allocation->ops = ops;
  1047. devmem_allocation->dpagemap = dpagemap;
  1048. devmem_allocation->size = size;
  1049. devmem_allocation->pre_migrate_fence = pre_migrate_fence;
  1050. }
  1051. EXPORT_SYMBOL_GPL(drm_pagemap_devmem_init);
  1052. /**
  1053. * drm_pagemap_page_to_dpagemap() - Return a pointer the drm_pagemap of a page
  1054. * @page: The struct page.
  1055. *
  1056. * Return: A pointer to the struct drm_pagemap of a device private page that
  1057. * was populated from the struct drm_pagemap. If the page was *not* populated
  1058. * from a struct drm_pagemap, the result is undefined and the function call
  1059. * may result in dereferencing and invalid address.
  1060. */
  1061. struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page)
  1062. {
  1063. struct drm_pagemap_zdd *zdd = page->zone_device_data;
  1064. return zdd->devmem_allocation->dpagemap;
  1065. }
  1066. EXPORT_SYMBOL_GPL(drm_pagemap_page_to_dpagemap);
  1067. /**
  1068. * drm_pagemap_populate_mm() - Populate a virtual range with device memory pages
  1069. * @dpagemap: Pointer to the drm_pagemap managing the device memory
  1070. * @start: Start of the virtual range to populate.
  1071. * @end: End of the virtual range to populate.
  1072. * @mm: Pointer to the virtual address space.
  1073. * @timeslice_ms: The time requested for the migrated pagemap pages to
  1074. * be present in @mm before being allowed to be migrated back.
  1075. *
  1076. * Attempt to populate a virtual range with device memory pages,
  1077. * clearing them or migrating data from the existing pages if necessary.
  1078. * The function is best effort only, and implementations may vary
  1079. * in how hard they try to satisfy the request.
  1080. *
  1081. * Return: %0 on success, negative error code on error. If the hardware
  1082. * device was removed / unbound the function will return %-ENODEV.
  1083. */
  1084. int drm_pagemap_populate_mm(struct drm_pagemap *dpagemap,
  1085. unsigned long start, unsigned long end,
  1086. struct mm_struct *mm,
  1087. unsigned long timeslice_ms)
  1088. {
  1089. int err;
  1090. if (!mmget_not_zero(mm))
  1091. return -EFAULT;
  1092. mmap_read_lock(mm);
  1093. err = dpagemap->ops->populate_mm(dpagemap, start, end, mm,
  1094. timeslice_ms);
  1095. mmap_read_unlock(mm);
  1096. mmput(mm);
  1097. return err;
  1098. }
  1099. EXPORT_SYMBOL(drm_pagemap_populate_mm);
  1100. void drm_pagemap_destroy(struct drm_pagemap *dpagemap, bool is_atomic_or_reclaim)
  1101. {
  1102. if (dpagemap->ops->destroy)
  1103. dpagemap->ops->destroy(dpagemap, is_atomic_or_reclaim);
  1104. else
  1105. kfree(dpagemap);
  1106. }
  1107. static void drm_pagemap_exit(void)
  1108. {
  1109. flush_work(&drm_pagemap_work);
  1110. if (WARN_ON(!llist_empty(&drm_pagemap_unhold_list)))
  1111. disable_work_sync(&drm_pagemap_work);
  1112. }
  1113. module_exit(drm_pagemap_exit);