From ac4d8b9bff3d570032b2a971ec97502cd00e1248 Mon Sep 17 00:00:00 2001 From: Scott Long Date: Thu, 16 Jun 2022 12:46:42 -0700 Subject: [PATCH] gpu: nvgpu: fix remap page size flag handling When destroying a virtual memory pool the associated page size must be set in the nvgpu_vm_remap_op structure. This patch adds a new nvgpu_vm_remap_page_size_flag() routine that converts the page size derived from the vm/vm_area structs to the corresponding NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE bit. Bug 3669908 Change-Id: Idca77cc36d353777b399c872f68a1f5231ddb8dd Signed-off-by: Scott Long Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2734822 Tested-by: Sagar Kamble Reviewed-by: Sagar Kamble Reviewed-by: Vijayakumar Subbu GVS: Gerrit_Virtual_Submit (cherry picked from commit 868b723b1666fcfacc592ae183971dc32e8dfa83) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2740035 Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-cert --- drivers/gpu/nvgpu/common/mm/vm_remap.c | 2 ++ drivers/gpu/nvgpu/include/nvgpu/vm_remap.h | 25 ++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/nvgpu/common/mm/vm_remap.c b/drivers/gpu/nvgpu/common/mm/vm_remap.c index f729d688b..e08cfbf4c 100644 --- a/drivers/gpu/nvgpu/common/mm/vm_remap.c +++ b/drivers/gpu/nvgpu/common/mm/vm_remap.c @@ -778,6 +778,8 @@ void nvgpu_vm_remap_vpool_destroy(struct vm_gk20a *vm, u32 num_ops = 1; int err; + op.flags = nvgpu_vm_remap_page_size_flag( + vm->gmmu_page_sizes[vm_area->pgsz_idx]); op.virt_offset_in_pages = vpool->base_offset_in_pages; op.num_pages = vpool->num_pages; diff --git a/drivers/gpu/nvgpu/include/nvgpu/vm_remap.h b/drivers/gpu/nvgpu/include/nvgpu/vm_remap.h index 767ce41b1..e2d7a6950 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/vm_remap.h +++ b/drivers/gpu/nvgpu/include/nvgpu/vm_remap.h @@ -155,18 +155,35 @@ static inline u64 nvgpu_vm_remap_page_size(struct nvgpu_vm_remap_op *op) { u64 pagesize = 0; - /* validate_map/unmap_op ensures a single pagesize flag */ - if (op->flags & NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_4K) + /* validate map/unmap_op ensures a single pagesize flag */ + if (op->flags & NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_4K) { pagesize = SZ_4K; - if (op->flags & NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_64K) + } else if (op->flags & NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_64K) { pagesize = SZ_64K; - if (op->flags & NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_128K) + } else if (op->flags & NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_128K) { pagesize = SZ_128K; + } nvgpu_assert(pagesize); return pagesize; } +static inline u32 nvgpu_vm_remap_page_size_flag(u64 pagesize) +{ + u32 flag = 0; + + if (pagesize == SZ_4K) { + flag = NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_4K; + } else if (pagesize == SZ_64K) { + flag = NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_64K; + } else if (pagesize == SZ_128K) { + flag = NVGPU_VM_REMAP_OP_FLAGS_PAGESIZE_128K; + } + + nvgpu_assert(flag); + return flag; +} + /** * This structure describes a virtual memory pool. * There is one virtual memory pool for each sparse VM area allocation.