|
XenevaOS
|
#include <linux/dma-mapping.h>#include <linux/kref.h>#include <linux/interval_tree.h>#include <linux/mmu_notifier.h>
Go to the source code of this file.
Classes | |
| struct | drm_gpusvm_ops |
| struct | drm_gpusvm_notifier |
| struct | drm_gpusvm_pages_flags |
| struct | drm_gpusvm_pages |
| struct | drm_gpusvm_range |
| struct | drm_gpusvm |
| struct | drm_gpusvm_ctx |
: Name of the GPU SVM | |
struct drm_gpusvm - GPU SVM structure @drm: Pointer to the DRM device structure @mm: Pointer to the mm_struct for the address space @mm_start: Start address of GPU SVM @mm_range: Range of the GPU SVM @notifier_size: Size of individual notifiers @ops: Pointer to the operations structure for GPU SVM @chunk_sizes: Pointer to the array of chunk sizes used in range allocation. Entries should be powers of 2 in descending order. @num_chunks: Number of chunks @notifier_lock: Read-write semaphore for protecting notifier operations @root: Cached root node of the Red-Black tree containing GPU SVM notifiers @notifier_list: list head containing of notifiers in the same order they appear in interval tree. This is useful to keep iterating notifiers while doing modifications to RB tree. This structure represents a GPU SVM (Shared Virtual Memory) used for tracking memory ranges mapped in a DRM (Direct Rendering Manager) device. No reference counting is provided, as this is expected to be embedded in the driver VM structure along with the struct drm_gpuvm, which handles reference counting. | |
| #define | drm_gpusvm_driver_set_lock(gpusvm, lock) do {} while (0) |
| #define | drm_gpusvm_notifier_lock(gpusvm__) down_read(&(gpusvm__)->notifier_lock) |
| #define | drm_gpusvm_notifier_unlock(gpusvm__) up_read(&(gpusvm__)->notifier_lock) |
| #define | drm_gpusvm_for_each_range(range__, notifier__, start__, end__) |
| #define | drm_gpusvm_for_each_range_safe(range__, next__, notifier__, start__, end__) |
| #define | drm_gpusvm_for_each_notifier(notifier__, gpusvm__, start__, end__) |
| #define | drm_gpusvm_for_each_notifier_safe(notifier__, next__, gpusvm__, start__, end__) |
| enum | drm_gpusvm_scan_result { DRM_GPUSVM_SCAN_UNPOPULATED , DRM_GPUSVM_SCAN_EQUAL , DRM_GPUSVM_SCAN_OTHER , DRM_GPUSVM_SCAN_SYSTEM , DRM_GPUSVM_SCAN_MIXED_DEVICE , DRM_GPUSVM_SCAN_MIXED } |
| int | drm_gpusvm_init (struct drm_gpusvm *gpusvm, const char *name, struct drm_device *drm, struct mm_struct *mm, unsigned long mm_start, unsigned long mm_range, unsigned long notifier_size, const struct drm_gpusvm_ops *ops, const unsigned long *chunk_sizes, int num_chunks) |
| void | drm_gpusvm_fini (struct drm_gpusvm *gpusvm) |
| void | drm_gpusvm_free (struct drm_gpusvm *gpusvm) |
| unsigned long | drm_gpusvm_find_vma_start (struct drm_gpusvm *gpusvm, unsigned long start, unsigned long end) |
| struct drm_gpusvm_range * | drm_gpusvm_range_find_or_insert (struct drm_gpusvm *gpusvm, unsigned long fault_addr, unsigned long gpuva_start, unsigned long gpuva_end, const struct drm_gpusvm_ctx *ctx) |
| void | drm_gpusvm_range_remove (struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range) |
| int | drm_gpusvm_range_evict (struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range) |
| struct drm_gpusvm_range * | drm_gpusvm_range_get (struct drm_gpusvm_range *range) |
| void | drm_gpusvm_range_put (struct drm_gpusvm_range *range) |
| bool | drm_gpusvm_range_pages_valid (struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range) |
| int | drm_gpusvm_range_get_pages (struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range, const struct drm_gpusvm_ctx *ctx) |
| void | drm_gpusvm_range_unmap_pages (struct drm_gpusvm *gpusvm, struct drm_gpusvm_range *range, const struct drm_gpusvm_ctx *ctx) |
| bool | drm_gpusvm_has_mapping (struct drm_gpusvm *gpusvm, unsigned long start, unsigned long end) |
| struct drm_gpusvm_notifier * | drm_gpusvm_notifier_find (struct drm_gpusvm *gpusvm, unsigned long start, unsigned long end) |
| struct drm_gpusvm_range * | drm_gpusvm_range_find (struct drm_gpusvm_notifier *notifier, unsigned long start, unsigned long end) |
| void | drm_gpusvm_range_set_unmapped (struct drm_gpusvm_range *range, const struct mmu_notifier_range *mmu_range) |
| int | drm_gpusvm_get_pages (struct drm_gpusvm *gpusvm, struct drm_gpusvm_pages *svm_pages, struct mm_struct *mm, struct mmu_interval_notifier *notifier, unsigned long pages_start, unsigned long pages_end, const struct drm_gpusvm_ctx *ctx) |
| void | drm_gpusvm_unmap_pages (struct drm_gpusvm *gpusvm, struct drm_gpusvm_pages *svm_pages, unsigned long npages, const struct drm_gpusvm_ctx *ctx) |
| void | drm_gpusvm_free_pages (struct drm_gpusvm *gpusvm, struct drm_gpusvm_pages *svm_pages, unsigned long npages) |
| enum drm_gpusvm_scan_result | drm_gpusvm_scan_mm (struct drm_gpusvm_range *range, void *dev_private_owner, const struct dev_pagemap *pagemap) |
| #define drm_gpusvm_driver_set_lock | ( | gpusvm, | |
| lock | |||
| ) | do {} while (0) |
| #define drm_gpusvm_for_each_notifier | ( | notifier__, | |
| gpusvm__, | |||
| start__, | |||
| end__ | |||
| ) |
drm_gpusvm_for_each_notifier() - Iterate over GPU SVM notifiers in a gpusvm @notifier__: Iterator variable for the notifiers @gpusvm__: Pointer to the GPU SVM notifier @start__: Start address of the notifier @end__: End address of the notifier
This macro is used to iterate over GPU SVM notifiers in a gpusvm.
| #define drm_gpusvm_for_each_notifier_safe | ( | notifier__, | |
| next__, | |||
| gpusvm__, | |||
| start__, | |||
| end__ | |||
| ) |
drm_gpusvm_for_each_notifier_safe() - Safely iterate over GPU SVM notifiers in a gpusvm @notifier__: Iterator variable for the notifiers @next__: Iterator variable for the notifiers temporay storage @gpusvm__: Pointer to the GPU SVM notifier @start__: Start address of the notifier @end__: End address of the notifier
This macro is used to iterate over GPU SVM notifiers in a gpusvm while removing notifiers from it.
| #define drm_gpusvm_for_each_range | ( | range__, | |
| notifier__, | |||
| start__, | |||
| end__ | |||
| ) |
drm_gpusvm_for_each_range() - Iterate over GPU SVM ranges in a notifier @range__: Iterator variable for the ranges. If set, it indicates the start of the iterator. If NULL, call drm_gpusvm_range_find() to get the range. @notifier__: Pointer to the GPU SVM notifier @start__: Start address of the range @end__: End address of the range
This macro is used to iterate over GPU SVM ranges in a notifier. It is safe to use while holding the driver SVM lock or the notifier lock.
| #define drm_gpusvm_for_each_range_safe | ( | range__, | |
| next__, | |||
| notifier__, | |||
| start__, | |||
| end__ | |||
| ) |
drm_gpusvm_for_each_range_safe() - Safely iterate over GPU SVM ranges in a notifier @range__: Iterator variable for the ranges @next__: Iterator variable for the ranges temporay storage @notifier__: Pointer to the GPU SVM notifier @start__: Start address of the range @end__: End address of the range
This macro is used to iterate over GPU SVM ranges in a notifier while removing ranges from it.
| #define drm_gpusvm_notifier_lock | ( | gpusvm__ | ) | down_read(&(gpusvm__)->notifier_lock) |
drm_gpusvm_notifier_lock() - Lock GPU SVM notifier @gpusvm__: Pointer to the GPU SVM structure.
Abstract client usage GPU SVM notifier lock, take lock
| #define drm_gpusvm_notifier_unlock | ( | gpusvm__ | ) | up_read(&(gpusvm__)->notifier_lock) |
drm_gpusvm_notifier_unlock() - Unlock GPU SVM notifier @gpusvm__: Pointer to the GPU SVM structure.
Abstract client usage GPU SVM notifier lock, drop lock
enum drm_gpusvm_scan_result - Scan result from the drm_gpusvm_scan_mm() function. @DRM_GPUSVM_SCAN_UNPOPULATED: At least one page was not present or inaccessible. @DRM_GPUSVM_SCAN_EQUAL: All pages belong to the struct dev_pagemap indicated as the @pagemap argument to the drm_gpusvm_scan_mm() function. @DRM_GPUSVM_SCAN_OTHER: All pages belong to exactly one dev_pagemap, which is NOT the @pagemap argument to the drm_gpusvm_scan_mm(). All pages belong to the same device private owner. @DRM_GPUSVM_SCAN_SYSTEM: All pages are present and system pages. @DRM_GPUSVM_SCAN_MIXED_DEVICE: All pages are device pages and belong to at least two different struct dev_pagemaps. All pages belong to the same device private owner. @DRM_GPUSVM_SCAN_MIXED: Pages are present and are a mix of system pages and device-private pages. All device-private pages belong to the same device private owner.
| Enumerator | |
|---|---|
| DRM_GPUSVM_SCAN_UNPOPULATED | |
| DRM_GPUSVM_SCAN_EQUAL | |
| DRM_GPUSVM_SCAN_OTHER | |
| DRM_GPUSVM_SCAN_SYSTEM | |
| DRM_GPUSVM_SCAN_MIXED_DEVICE | |
| DRM_GPUSVM_SCAN_MIXED | |
| unsigned long drm_gpusvm_find_vma_start | ( | struct drm_gpusvm * | gpusvm, |
| unsigned long | start, | ||
| unsigned long | end | ||
| ) |
| void drm_gpusvm_fini | ( | struct drm_gpusvm * | gpusvm | ) |
| void drm_gpusvm_free | ( | struct drm_gpusvm * | gpusvm | ) |
| void drm_gpusvm_free_pages | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_pages * | svm_pages, | ||
| unsigned long | npages | ||
| ) |
| int drm_gpusvm_get_pages | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_pages * | svm_pages, | ||
| struct mm_struct * | mm, | ||
| struct mmu_interval_notifier * | notifier, | ||
| unsigned long | pages_start, | ||
| unsigned long | pages_end, | ||
| const struct drm_gpusvm_ctx * | ctx | ||
| ) |
| bool drm_gpusvm_has_mapping | ( | struct drm_gpusvm * | gpusvm, |
| unsigned long | start, | ||
| unsigned long | end | ||
| ) |
| int drm_gpusvm_init | ( | struct drm_gpusvm * | gpusvm, |
| const char * | name, | ||
| struct drm_device * | drm, | ||
| struct mm_struct * | mm, | ||
| unsigned long | mm_start, | ||
| unsigned long | mm_range, | ||
| unsigned long | notifier_size, | ||
| const struct drm_gpusvm_ops * | ops, | ||
| const unsigned long * | chunk_sizes, | ||
| int | num_chunks | ||
| ) |
| struct drm_gpusvm_notifier * drm_gpusvm_notifier_find | ( | struct drm_gpusvm * | gpusvm, |
| unsigned long | start, | ||
| unsigned long | end | ||
| ) |
| int drm_gpusvm_range_evict | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_range * | range | ||
| ) |
| struct drm_gpusvm_range * drm_gpusvm_range_find | ( | struct drm_gpusvm_notifier * | notifier, |
| unsigned long | start, | ||
| unsigned long | end | ||
| ) |
| struct drm_gpusvm_range * drm_gpusvm_range_find_or_insert | ( | struct drm_gpusvm * | gpusvm, |
| unsigned long | fault_addr, | ||
| unsigned long | gpuva_start, | ||
| unsigned long | gpuva_end, | ||
| const struct drm_gpusvm_ctx * | ctx | ||
| ) |
| struct drm_gpusvm_range * drm_gpusvm_range_get | ( | struct drm_gpusvm_range * | range | ) |
| int drm_gpusvm_range_get_pages | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_range * | range, | ||
| const struct drm_gpusvm_ctx * | ctx | ||
| ) |
| bool drm_gpusvm_range_pages_valid | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_range * | range | ||
| ) |
| void drm_gpusvm_range_put | ( | struct drm_gpusvm_range * | range | ) |
| void drm_gpusvm_range_remove | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_range * | range | ||
| ) |
| void drm_gpusvm_range_set_unmapped | ( | struct drm_gpusvm_range * | range, |
| const struct mmu_notifier_range * | mmu_range | ||
| ) |
| void drm_gpusvm_range_unmap_pages | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_range * | range, | ||
| const struct drm_gpusvm_ctx * | ctx | ||
| ) |
| enum drm_gpusvm_scan_result drm_gpusvm_scan_mm | ( | struct drm_gpusvm_range * | range, |
| void * | dev_private_owner, | ||
| const struct dev_pagemap * | pagemap | ||
| ) |
| void drm_gpusvm_unmap_pages | ( | struct drm_gpusvm * | gpusvm, |
| struct drm_gpusvm_pages * | svm_pages, | ||
| unsigned long | npages, | ||
| const struct drm_gpusvm_ctx * | ctx | ||
| ) |