gpudev: pin GPU memory
PATCH v2 1/1 gpudev: pin GPU memory
From: Elena Agostini <[email protected]>
Enable the possibility to make a GPU memory area accessible from the CPU.
GPU memory has to be allocated via rte_gpu_mem_alloc().
This patch allows the gpudev library to pin, through the GPU driver, a chunk of GPU memory and to return a memory pointer usable by the CPU to access the GPU memory area.
Signed-off-by Elena Agostini <[email protected]>
--- lib/gpudev/gpudev.c | 47 +++++++++++++++++++++++++++++++++++ lib/gpudev/gpudev_driver.h | 6 +++++ lib/gpudev/rte_gpudev.h | 50 ++++++++++++++++++++++++++++++++++++++ lib/gpudev/version.map | 2 ++ 4 files changed, 105 insertions(+)
lib/gpudev/gpudev.c +47 -0
@@ -634,6 +634,53 @@ rte_gpu_mem_unregister(int16_t dev_id, void *ptr)return GPU_DRV_RET (dev->ops.mem_unregister (dev, ptr)); } +int +rte_gpu_mem_pin (int16_t dev_id,size_t size,void *ptr) +{ +struct rte_gpu *dev; + + dev =gpu_get_by_id (dev_id); +if (dev ==NULL ) { +GPU_LOG (ERR ,"pin mem for invalid device ID %d" , dev_id); + rte_errno =ENODEV ; +return -rte_errno; + } + +if (dev->ops.mem_pin ==NULL ) { +GPU_LOG (ERR ,"mem pinning not supported" ); + rte_errno =ENOTSUP ; +return -rte_errno; + } + +if (ptr ==NULL || size ==0 )/* dry-run */ +return 0 ; + +return GPU_DRV_RET (dev->ops.mem_pin (dev, size, ptr)); +} + +int +rte_gpu_mem_unpin (int16_t dev_id,void *ptr) +{ +struct rte_gpu *dev; + + dev =gpu_get_by_id (dev_id); +if (dev ==NULL ) { +GPU_LOG (ERR ,"unpin mem for invalid device ID %d" , dev_id); + rte_errno =ENODEV ; +return -rte_errno; + } + +if (dev->ops.mem_unpin ==NULL ) { + rte_errno =ENOTSUP ; +return -rte_errno; + } + +if (ptr ==NULL )/* dry-run */ +return 0 ; + +return GPU_DRV_RET (dev->ops.mem_unpin (dev, ptr)); +} +int rte_gpu_wmb (int16_t dev_id) {
lib/gpudev/gpudev_driver.h +6 -0
@@ -31,6 +31,8 @@ typedef int (rte_gpu_mem_alloc_t)(struct rte_gpu *dev, size_t size, void **ptr);typedef int (rte_gpu_mem_free_t )(struct rte_gpu *dev,void *ptr);typedef int (rte_gpu_mem_register_t )(struct rte_gpu *dev,size_t size,void *ptr);typedef int (rte_gpu_mem_unregister_t )(struct rte_gpu *dev,void *ptr); +typedef int (rte_gpu_mem_pin_t )(struct rte_gpu *dev,size_t size,void *ptr); +typedef int (rte_gpu_mem_unpin_t )(struct rte_gpu *dev,void *ptr);typedef int (rte_gpu_wmb_t )(struct rte_gpu *dev);struct rte_gpu_ops {
@@ -46,6 +48,10 @@ struct rte_gpu_ops {rte_gpu_mem_register_t *mem_register;/* Unregister CPU memory from device. */ rte_gpu_mem_unregister_t *mem_unregister; +/* Pin GPU memory. */ +rte_gpu_mem_pin_t *mem_pin; +/* Unpin GPU memory. */ +rte_gpu_mem_unpin_t *mem_unpin;/* Enforce GPU write memory barrier. */ rte_gpu_wmb_t *wmb; };
lib/gpudev/rte_gpudev.h +50 -0
56 lines not on this page · raw message
lib/gpudev/version.map +2 -0
@@ -21,7 +21,9 @@ EXPERIMENTAL { rte_gpu_is_valid; rte_gpu_mem_alloc; rte_gpu_mem_free; + rte_gpu_mem_pin; rte_gpu_mem_register; + rte_gpu_mem_unpin; rte_gpu_mem_unregister; rte_gpu_wmb; };
Signature · 1 line
2.17.1