XenevaOS
Loading...
Searching...
No Matches
Classes
drm_gpusvm.h File Reference
#include <linux/dma-mapping.h>
#include <linux/kref.h>
#include <linux/interval_tree.h>
#include <linux/mmu_notifier.h>
Include dependency graph for drm_gpusvm.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)
 

Macro Definition Documentation

◆ drm_gpusvm_driver_set_lock

#define drm_gpusvm_driver_set_lock (   gpusvm,
  lock 
)    do {} while (0)

◆ drm_gpusvm_for_each_notifier

#define drm_gpusvm_for_each_notifier (   notifier__,
  gpusvm__,
  start__,
  end__ 
)
Value:
for ((notifier__) = drm_gpusvm_notifier_find((gpusvm__), (start__), (end__)); \
(notifier__) && (drm_gpusvm_notifier_start(notifier__) < (end__)); \
(notifier__) = __drm_gpusvm_notifier_next(notifier__))
struct drm_gpusvm_notifier * drm_gpusvm_notifier_find(struct drm_gpusvm *gpusvm, unsigned long start, unsigned long 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.

◆ drm_gpusvm_for_each_notifier_safe

#define drm_gpusvm_for_each_notifier_safe (   notifier__,
  next__,
  gpusvm__,
  start__,
  end__ 
)
Value:
for ((notifier__) = drm_gpusvm_notifier_find((gpusvm__), (start__), (end__)), \
(next__) = __drm_gpusvm_notifier_next(notifier__); \
(notifier__) && (drm_gpusvm_notifier_start(notifier__) < (end__)); \
(notifier__) = (next__), (next__) = __drm_gpusvm_notifier_next(notifier__))

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.

◆ drm_gpusvm_for_each_range

#define drm_gpusvm_for_each_range (   range__,
  notifier__,
  start__,
  end__ 
)
Value:
for ((range__) = (range__) ?: \
drm_gpusvm_range_find((notifier__), (start__), (end__)); \
(range__) && (drm_gpusvm_range_start(range__) < (end__)); \
(range__) = __drm_gpusvm_range_next(range__))
struct drm_gpusvm_range * drm_gpusvm_range_find(struct drm_gpusvm_notifier *notifier, unsigned long start, unsigned long 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.

◆ drm_gpusvm_for_each_range_safe

#define drm_gpusvm_for_each_range_safe (   range__,
  next__,
  notifier__,
  start__,
  end__ 
)
Value:
for ((range__) = drm_gpusvm_range_find((notifier__), (start__), (end__)), \
(next__) = __drm_gpusvm_range_next(range__); \
(range__) && (drm_gpusvm_range_start(range__) < (end__)); \
(range__) = (next__), (next__) = __drm_gpusvm_range_next(range__))

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.

◆ drm_gpusvm_notifier_lock

#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

◆ drm_gpusvm_notifier_unlock

#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

Enumeration Type Documentation

◆ drm_gpusvm_scan_result

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 

Function Documentation

◆ drm_gpusvm_find_vma_start()

unsigned long drm_gpusvm_find_vma_start ( struct drm_gpusvm *  gpusvm,
unsigned long  start,
unsigned long  end 
)

◆ drm_gpusvm_fini()

void drm_gpusvm_fini ( struct drm_gpusvm *  gpusvm)

◆ drm_gpusvm_free()

void drm_gpusvm_free ( struct drm_gpusvm *  gpusvm)

◆ drm_gpusvm_free_pages()

void drm_gpusvm_free_pages ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_pages *  svm_pages,
unsigned long  npages 
)

◆ drm_gpusvm_get_pages()

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 
)

◆ drm_gpusvm_has_mapping()

bool drm_gpusvm_has_mapping ( struct drm_gpusvm *  gpusvm,
unsigned long  start,
unsigned long  end 
)

◆ drm_gpusvm_init()

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 
)

◆ drm_gpusvm_notifier_find()

struct drm_gpusvm_notifier * drm_gpusvm_notifier_find ( struct drm_gpusvm *  gpusvm,
unsigned long  start,
unsigned long  end 
)

◆ drm_gpusvm_range_evict()

int drm_gpusvm_range_evict ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_range *  range 
)

◆ drm_gpusvm_range_find()

struct drm_gpusvm_range * drm_gpusvm_range_find ( struct drm_gpusvm_notifier *  notifier,
unsigned long  start,
unsigned long  end 
)

◆ drm_gpusvm_range_find_or_insert()

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 
)

◆ drm_gpusvm_range_get()

struct drm_gpusvm_range * drm_gpusvm_range_get ( struct drm_gpusvm_range *  range)

◆ drm_gpusvm_range_get_pages()

int drm_gpusvm_range_get_pages ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_range *  range,
const struct drm_gpusvm_ctx *  ctx 
)

◆ drm_gpusvm_range_pages_valid()

bool drm_gpusvm_range_pages_valid ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_range *  range 
)

◆ drm_gpusvm_range_put()

void drm_gpusvm_range_put ( struct drm_gpusvm_range *  range)

◆ drm_gpusvm_range_remove()

void drm_gpusvm_range_remove ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_range *  range 
)

◆ drm_gpusvm_range_set_unmapped()

void drm_gpusvm_range_set_unmapped ( struct drm_gpusvm_range *  range,
const struct mmu_notifier_range *  mmu_range 
)

◆ drm_gpusvm_range_unmap_pages()

void drm_gpusvm_range_unmap_pages ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_range *  range,
const struct drm_gpusvm_ctx *  ctx 
)

◆ drm_gpusvm_scan_mm()

enum drm_gpusvm_scan_result drm_gpusvm_scan_mm ( struct drm_gpusvm_range *  range,
void *  dev_private_owner,
const struct dev_pagemap *  pagemap 
)

◆ drm_gpusvm_unmap_pages()

void drm_gpusvm_unmap_pages ( struct drm_gpusvm *  gpusvm,
struct drm_gpusvm_pages *  svm_pages,
unsigned long  npages,
const struct drm_gpusvm_ctx *  ctx 
)