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