Lines Matching full:range

46  *	space is chosen for the range size. Ranges are expected to be
53 * range allocation, notifier allocation, and invalidations.
74 * optionally migrate the range to device memory, and create GPU bindings.
92 * range RB tree and list, as well as the range's DMA mappings and sequence
94 * except for the recheck range's pages being valid
115 * being that a subset of the range still has CPU and GPU mappings. If the
116 * backing store for the range is in device memory, a subset of the backing
117 * store has references. One option would be to split the range and device
119 * complicated. Given that partial unmappings are rare and driver-defined range
122 * With no support for range splitting, upon partial unmapping of a range, the
123 * driver is expected to invalidate and destroy the entire range. If the range
143 * int driver_bind_range(struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range)
147 * driver_alloc_and_setup_memory_for_bind(gpusvm, range);
150 * if (drm_gpusvm_range_pages_valid(range))
151 * driver_commit_bind(gpusvm, range);
170 * range = drm_gpusvm_range_find_or_insert(gpusvm, fault_addr,
173 * if (IS_ERR(range)) {
174 * err = PTR_ERR(range);
178 * if (driver_migration_policy(range)) {
186 * err = drm_gpusvm_range_get_pages(gpusvm, range, &ctx);
189 * drm_gpusvm_range_evict(gpusvm, range);
195 * err = driver_bind_range(gpusvm, range);
209 * struct drm_gpusvm_range *range)
214 * if (range->flags.partial_unmap)
215 * drm_gpusvm_range_evict(gpusvm, range);
217 * driver_unbind_range(range);
218 * drm_gpusvm_range_remove(gpusvm, range);
225 * for_each_range_in_garbage_collector(gpusvm, range)
226 * __driver_garbage_collector(gpusvm, range);
238 * struct drm_gpusvm_range *range = NULL;
242 * drm_gpusvm_for_each_range(range, notifier, mmu_range->start,
244 * drm_gpusvm_range_unmap_pages(gpusvm, range, &ctx);
249 * drm_gpusvm_range_set_unmapped(range, mmu_range);
250 * driver_garbage_collector_add(gpusvm, range);
256 * npages_in_range() - Calculate the number of pages in a given range
257 * @start: The start address of the range
258 * @end: The end address of the range
260 * This macro calculates the number of pages in a given memory range,
263 * determine the number of pages in the range.
265 * Return: The number of pages in the specified range.
297 * drm_gpusvm_range_find() - Find GPU SVM range from GPU SVM notifier
299 * @start: Start address of the range
300 * @end: End address of the range
365 * @mm_range: Range of the GPU SVM.
368 * @chunk_sizes: Pointer to the array of chunk sizes used in range allocation.
489 struct drm_gpusvm_range *range, *__next; in drm_gpusvm_fini() local
497 drm_gpusvm_for_each_range_safe(range, __next, notifier, 0, in drm_gpusvm_fini()
499 drm_gpusvm_range_remove(gpusvm, range); in drm_gpusvm_fini()
570 * drm_gpusvm_range_insert() - Insert GPU SVM range
572 * @range: Pointer to the GPU SVM range structure
574 * This function inserts the GPU SVM range into the notifier RB tree and list.
577 struct drm_gpusvm_range *range) in drm_gpusvm_range_insert() argument
583 interval_tree_insert(&range->itree, &notifier->root); in drm_gpusvm_range_insert()
585 node = rb_prev(&range->itree.rb); in drm_gpusvm_range_insert()
591 list_add(&range->entry, head); in drm_gpusvm_range_insert()
596 * __drm_gpusvm_range_remove() - Remove GPU SVM range
598 * @range: Pointer to the GPU SVM range structure
600 * This macro removes the GPU SVM range from the notifier RB tree and list.
603 struct drm_gpusvm_range *range) in __drm_gpusvm_range_remove() argument
605 interval_tree_remove(&range->itree, &notifier->root); in __drm_gpusvm_range_remove()
606 list_del(&range->entry); in __drm_gpusvm_range_remove()
610 * drm_gpusvm_range_alloc() - Allocate GPU SVM range
617 * This function allocates and initializes the GPU SVM range structure.
619 * Return: Pointer to the allocated GPU SVM range on success, ERR_PTR() on failure.
627 struct drm_gpusvm_range *range; in drm_gpusvm_range_alloc() local
630 range = gpusvm->ops->range_alloc(gpusvm); in drm_gpusvm_range_alloc()
632 range = kzalloc(sizeof(*range), GFP_KERNEL); in drm_gpusvm_range_alloc()
634 if (!range) in drm_gpusvm_range_alloc()
637 kref_init(&range->refcount); in drm_gpusvm_range_alloc()
638 range->gpusvm = gpusvm; in drm_gpusvm_range_alloc()
639 range->notifier = notifier; in drm_gpusvm_range_alloc()
640 range->itree.start = ALIGN_DOWN(fault_addr, chunk_size); in drm_gpusvm_range_alloc()
641 range->itree.last = ALIGN(fault_addr + 1, chunk_size) - 1; in drm_gpusvm_range_alloc()
642 INIT_LIST_HEAD(&range->entry); in drm_gpusvm_range_alloc()
643 range->pages.notifier_seq = LONG_MAX; in drm_gpusvm_range_alloc()
644 range->pages.flags.migrate_devmem = migrate_devmem ? 1 : 0; in drm_gpusvm_range_alloc()
646 return range; in drm_gpusvm_range_alloc()
653 * @npages: Number of pages within the pfn array i.e the hmm range size.
658 * crucially accounting for the original hmm range boundaries.
747 * drm_gpusvm_range_chunk_size() - Determine chunk size for GPU SVM range
757 * This function determines the chunk size for the GPU SVM range based on the
796 struct drm_gpusvm_range *range; in drm_gpusvm_range_chunk_size() local
798 range = drm_gpusvm_range_find(notifier, start, end); in drm_gpusvm_range_chunk_size()
799 if (range) { in drm_gpusvm_range_chunk_size()
805 * XXX: Only create range on pages CPU has faulted in. Without in drm_gpusvm_range_chunk_size()
846 * drm_gpusvm_find_vma_start() - Find start address for first VMA in range
851 * Returns: The start address of first VMA within the provided range,
880 * drm_gpusvm_range_find_or_insert() - Find or insert GPU SVM range
887 * This function finds or inserts a newly allocated a GPU SVM range based on the
888 * fault address. Caller must hold a lock to protect range lookup and insertion.
890 * Return: Pointer to the GPU SVM range on success, ERR_PTR() on failure.
900 struct drm_gpusvm_range *range; in drm_gpusvm_range_find_or_insert() local
947 range = drm_gpusvm_range_find(notifier, fault_addr, fault_addr + 1); in drm_gpusvm_range_find_or_insert()
948 if (range) in drm_gpusvm_range_find_or_insert()
968 range = drm_gpusvm_range_alloc(gpusvm, notifier, fault_addr, chunk_size, in drm_gpusvm_range_find_or_insert()
970 if (IS_ERR(range)) { in drm_gpusvm_range_find_or_insert()
971 err = PTR_ERR(range); in drm_gpusvm_range_find_or_insert()
975 drm_gpusvm_range_insert(notifier, range); in drm_gpusvm_range_find_or_insert()
983 return range; in drm_gpusvm_range_find_or_insert()
1050 * This function frees the dma address array associated with a GPU SVM range.
1085 * drm_gpusvm_range_remove() - Remove GPU SVM range
1087 * @range: Pointer to the GPU SVM range to be removed
1089 * This function removes the specified GPU SVM range and also removes the parent
1091 * hold a lock to protect range and notifier removal.
1094 struct drm_gpusvm_range *range) in drm_gpusvm_range_remove() argument
1096 unsigned long npages = npages_in_range(drm_gpusvm_range_start(range), in drm_gpusvm_range_remove()
1097 drm_gpusvm_range_end(range)); in drm_gpusvm_range_remove()
1103 drm_gpusvm_range_start(range), in drm_gpusvm_range_remove()
1104 drm_gpusvm_range_start(range) + 1); in drm_gpusvm_range_remove()
1109 __drm_gpusvm_unmap_pages(gpusvm, &range->pages, npages); in drm_gpusvm_range_remove()
1110 __drm_gpusvm_free_pages(gpusvm, &range->pages); in drm_gpusvm_range_remove()
1111 __drm_gpusvm_range_remove(notifier, range); in drm_gpusvm_range_remove()
1114 drm_gpusvm_range_put(range); in drm_gpusvm_range_remove()
1126 * drm_gpusvm_range_get() - Get a reference to GPU SVM range
1127 * @range: Pointer to the GPU SVM range
1129 * This function increments the reference count of the specified GPU SVM range.
1131 * Return: Pointer to the GPU SVM range.
1134 drm_gpusvm_range_get(struct drm_gpusvm_range *range) in drm_gpusvm_range_get() argument
1136 kref_get(&range->refcount); in drm_gpusvm_range_get()
1138 return range; in drm_gpusvm_range_get()
1143 * drm_gpusvm_range_destroy() - Destroy GPU SVM range
1144 * @refcount: Pointer to the reference counter embedded in the GPU SVM range
1146 * This function destroys the specified GPU SVM range when its reference count
1147 * reaches zero. If a custom range-free function is provided, it is invoked to
1148 * free the range; otherwise, the range is deallocated using kfree().
1152 struct drm_gpusvm_range *range = in drm_gpusvm_range_destroy() local
1154 struct drm_gpusvm *gpusvm = range->gpusvm; in drm_gpusvm_range_destroy()
1157 gpusvm->ops->range_free(range); in drm_gpusvm_range_destroy()
1159 kfree(range); in drm_gpusvm_range_destroy()
1163 * drm_gpusvm_range_put() - Put a reference to GPU SVM range
1164 * @range: Pointer to the GPU SVM range
1166 * This function decrements the reference count of the specified GPU SVM range
1169 void drm_gpusvm_range_put(struct drm_gpusvm_range *range) in drm_gpusvm_range_put() argument
1171 kref_put(&range->refcount, drm_gpusvm_range_destroy); in drm_gpusvm_range_put()
1176 * drm_gpusvm_pages_valid() - GPU SVM range pages valid
1180 * This function determines if a GPU SVM range pages are valid. Expected be
1184 * function is required for finer grained checking (i.e., per range) if pages
1187 * Return: True if GPU SVM range has valid pages, False otherwise
1198 * drm_gpusvm_range_pages_valid() - GPU SVM range pages valid
1200 * @range: Pointer to the GPU SVM range structure
1202 * This function determines if a GPU SVM range pages are valid. Expected be
1206 * function is required for finer grained checking (i.e., per range) if pages
1209 * Return: True if GPU SVM range has valid pages, False otherwise
1212 struct drm_gpusvm_range *range) in drm_gpusvm_range_pages_valid() argument
1214 return drm_gpusvm_pages_valid(gpusvm, &range->pages); in drm_gpusvm_range_pages_valid()
1219 * drm_gpusvm_range_pages_valid_unlocked() - GPU SVM range pages valid unlocked
1221 * @range: Pointer to the GPU SVM range structure
1223 * This function determines if a GPU SVM range pages are valid. Expected be
1226 * Return: True if GPU SVM range has valid pages, False otherwise
1249 * @mm: The mm corresponding to the CPU range
1250 * @notifier: The corresponding notifier for the given CPU range
1255 * This function gets and maps pages for CPU range and ensures they are
1457 * drm_gpusvm_range_get_pages() - Get pages for a GPU SVM range
1459 * @range: Pointer to the GPU SVM range structure
1462 * This function gets pages for a GPU SVM range and ensures they are mapped for
1468 struct drm_gpusvm_range *range, in drm_gpusvm_range_get_pages() argument
1471 return drm_gpusvm_get_pages(gpusvm, &range->pages, gpusvm->mm, in drm_gpusvm_range_get_pages()
1472 &range->notifier->notifier, in drm_gpusvm_range_get_pages()
1473 drm_gpusvm_range_start(range), in drm_gpusvm_range_get_pages()
1474 drm_gpusvm_range_end(range), ctx); in drm_gpusvm_range_get_pages()
1509 * drm_gpusvm_range_unmap_pages() - Unmap pages associated with a GPU SVM range
1511 * @range: Pointer to the GPU SVM range structure
1514 * This function unmaps pages associated with a GPU SVM range. If @in_notifier
1517 * each GPU SVM range attached to notifier in gpusvm->ops->invalidate for IOMMU
1521 struct drm_gpusvm_range *range, in drm_gpusvm_range_unmap_pages() argument
1524 unsigned long npages = npages_in_range(drm_gpusvm_range_start(range), in drm_gpusvm_range_unmap_pages()
1525 drm_gpusvm_range_end(range)); in drm_gpusvm_range_unmap_pages()
1527 return drm_gpusvm_unmap_pages(gpusvm, &range->pages, npages, ctx); in drm_gpusvm_range_unmap_pages()
1532 * drm_gpusvm_range_evict() - Evict GPU SVM range
1534 * @range: Pointer to the GPU SVM range to be removed
1536 * This function evicts the specified GPU SVM range.
1541 struct drm_gpusvm_range *range) in drm_gpusvm_range_evict() argument
1543 struct mmu_interval_notifier *notifier = &range->notifier->notifier; in drm_gpusvm_range_evict()
1547 .start = drm_gpusvm_range_start(range), in drm_gpusvm_range_evict()
1548 .end = drm_gpusvm_range_end(range), in drm_gpusvm_range_evict()
1554 unsigned long npages = npages_in_range(drm_gpusvm_range_start(range), in drm_gpusvm_range_evict()
1555 drm_gpusvm_range_end(range)); in drm_gpusvm_range_evict()
1589 * drm_gpusvm_has_mapping() - Check if GPU SVM has mapping for the given address range
1602 struct drm_gpusvm_range *range = NULL; in drm_gpusvm_has_mapping() local
1604 drm_gpusvm_for_each_range(range, notifier, start, end) in drm_gpusvm_has_mapping()
1613 * drm_gpusvm_range_set_unmapped() - Mark a GPU SVM range as unmapped
1614 * @range: Pointer to the GPU SVM range structure.
1615 * @mmu_range: Pointer to the MMU notifier range structure.
1617 * This function marks a GPU SVM range as unmapped and sets the partial_unmap flag
1618 * if the range partially falls within the provided MMU notifier range.
1620 void drm_gpusvm_range_set_unmapped(struct drm_gpusvm_range *range, in drm_gpusvm_range_set_unmapped() argument
1623 lockdep_assert_held_write(&range->gpusvm->notifier_lock); in drm_gpusvm_range_set_unmapped()
1625 range->pages.flags.unmapped = true; in drm_gpusvm_range_set_unmapped()
1626 if (drm_gpusvm_range_start(range) < mmu_range->start || in drm_gpusvm_range_set_unmapped()
1627 drm_gpusvm_range_end(range) > mmu_range->end) in drm_gpusvm_range_set_unmapped()
1628 range->pages.flags.partial_unmap = true; in drm_gpusvm_range_set_unmapped()