From 1fd3de64ff47f8865f9cbd13bb8f20611beb3cfa Mon Sep 17 00:00:00 2001 From: Elena Agostini Date: Tue, 8 Mar 2022 23:59:47 +0000 Subject: [PATCH] gpudev: fix page alignment in communication list Memory allocated for CPU mapping the status flag in the communication list should be aligned to the GPU page size, which can be different of CPU page alignment. The GPU page size is added to the GPU info, and is used when creating a communication list. Fixes: 9b8cae4d991e ("gpudev: use CPU mapping in communication list") Signed-off-by: Elena Agostini --- drivers/gpu/cuda/cuda.c | 4 ++++ lib/gpudev/gpudev.c | 9 ++++++++- lib/gpudev/rte_gpudev.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/cuda/cuda.c b/drivers/gpu/cuda/cuda.c index cf9e59535c..8505d39d64 100644 --- a/drivers/gpu/cuda/cuda.c +++ b/drivers/gpu/cuda/cuda.c @@ -523,6 +523,8 @@ cuda_dev_info_get(struct rte_gpu *dev, struct rte_gpu_info *info) } dev->mpshared->info.total_memory = parent_info.total_memory; + dev->mpshared->info.page_size = parent_info.page_size; + /* * GPU Device private info */ @@ -1173,6 +1175,8 @@ cuda_gpu_probe(__rte_unused struct rte_pci_driver *pci_drv, struct rte_pci_devic return -rte_errno; } + dev->mpshared->info.page_size = (size_t)GPU_PAGE_SIZE; + /* * GPU Device private info */ diff --git a/lib/gpudev/gpudev.c b/lib/gpudev/gpudev.c index fb1bee344c..56033f4a5f 100644 --- a/lib/gpudev/gpudev.c +++ b/lib/gpudev/gpudev.c @@ -820,6 +820,7 @@ rte_gpu_comm_create_list(uint16_t dev_id, uint32_t idx_l; int ret; struct rte_gpu *dev; + struct rte_gpu_info info; if (num_comm_items == 0) { rte_errno = EINVAL; @@ -833,6 +834,12 @@ rte_gpu_comm_create_list(uint16_t dev_id, return NULL; } + ret = rte_gpu_info_get(dev_id, &info); + if (ret < 0) { + rte_errno = ENODEV; + return NULL; + } + comm_list = rte_zmalloc(NULL, sizeof(struct rte_gpu_comm_list) * num_comm_items, 0); if (comm_list == NULL) { @@ -855,7 +862,7 @@ rte_gpu_comm_create_list(uint16_t dev_id, */ comm_list[0].status_d = rte_gpu_mem_alloc(dev_id, sizeof(enum rte_gpu_comm_list_status) * num_comm_items, - rte_mem_page_size()); + info.page_size); if (ret < 0) { rte_errno = ENOMEM; return NULL; diff --git a/lib/gpudev/rte_gpudev.h b/lib/gpudev/rte_gpudev.h index 7e2401a4b7..0a94a6abc4 100644 --- a/lib/gpudev/rte_gpudev.h +++ b/lib/gpudev/rte_gpudev.h @@ -59,7 +59,9 @@ struct rte_gpu_info { uint32_t processor_count; /** Total memory available on device. */ size_t total_memory; - /* Local NUMA memory ID. -1 if unknown. */ + /** GPU memory page size. */ + size_t page_size; + /** Local NUMA memory ID. -1 if unknown. */ int16_t numa_node; }; -- 2.39.5