xref: /linux/drivers/gpu/drm/drm_pagemap.c (revision fab183d632628381b466a41479489541ac0e29a0)
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