From d13c256d5ee11da1664377481543005142d9bd30 Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Tue, 17 Oct 2017 10:55:00 -0700 Subject: gpu: nvgpu: VM unmap refactoring Re-organize the unmap code to be better split between OS specific requirements and common core requirements. The new code flow works as follows: nvgpu_vm_unmap() Is the primary entrance to the unmap path. It takes a VM and a GPU virtual address to unmap. There's also an optional batch mapping struct. This function is responsible for making sure there is a real buffer and that if it's being called on a fixed mapping then the mapping will definitely be freed (since buffers are ref-counted). Then this function decrements the ref-count and returns. If the ref-count hits zero then __nvgpu_vm_unmap_ref() is called which just calls __nvgpu_vm_unmap() with the relevant batch struct if present. This is where the real work is done. __nvgpu_vm_unmap() clears the GMMU mapping, removes the mapped buffer from the various lists and trees it may be in and then calls the nvgpu_vm_unmap_system() function. This function handles any OS specific stuff and must be defined by all VM OS implementations. There's a a short cut used by some other core VM code to free mappings without going through nvgpu_vm_map(). Mostly they just directly decrement the mapping ref-count which can then call __nvgpu_vm_unmap_ref() if the ref-count hits zero. JIRA NVGPU-30 JIRA NVGPU-71 Change-Id: Ic626d37ab936819841bab45214f027b40ffa4e5a Signed-off-by: Alex Waterman Reviewed-on: https://git-master.nvidia.com/r/1583982 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/include/nvgpu/linux/vm.h | 4 ---- drivers/gpu/nvgpu/include/nvgpu/vm.h | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'drivers/gpu/nvgpu/include') diff --git a/drivers/gpu/nvgpu/include/nvgpu/linux/vm.h b/drivers/gpu/nvgpu/include/nvgpu/linux/vm.h index 7aacf496..3d9f9ea6 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/linux/vm.h +++ b/drivers/gpu/nvgpu/include/nvgpu/linux/vm.h @@ -98,10 +98,6 @@ int nvgpu_vm_map_buffer(struct vm_gk20a *vm, u64 mapping_size, struct vm_gk20a_mapping_batch *batch); -/* Note: batch may be NULL if unmap op is not part of a batch */ -int nvgpu_vm_unmap_buffer(struct vm_gk20a *vm, u64 offset, - struct vm_gk20a_mapping_batch *batch); - /* find buffer corresponding to va */ int nvgpu_vm_find_buf(struct vm_gk20a *vm, u64 gpu_va, struct dma_buf **dmabuf, diff --git a/drivers/gpu/nvgpu/include/nvgpu/vm.h b/drivers/gpu/nvgpu/include/nvgpu/vm.h index e529512b..84c7e0c7 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/vm.h +++ b/drivers/gpu/nvgpu/include/nvgpu/vm.h @@ -207,11 +207,19 @@ void nvgpu_vm_put_buffers(struct vm_gk20a *vm, struct nvgpu_mapped_buf **mapped_buffers, int num_buffers); -void nvgpu_vm_unmap_locked(struct nvgpu_mapped_buf *mapped_buffer, - struct vm_gk20a_mapping_batch *batch); -void nvgpu_vm_unmap_locked_ref(struct nvgpu_ref *ref); +void nvgpu_vm_unmap(struct vm_gk20a *vm, u64 offset, + struct vm_gk20a_mapping_batch *batch); -void nvgpu_vm_unmap(struct vm_gk20a *vm, u64 offset); +/* + * Implemented by each OS. Called from within the core VM code to handle OS + * specific components of an nvgpu_mapped_buf. + */ +void nvgpu_vm_unmap_system(struct nvgpu_mapped_buf *mapped_buffer); + +/* + * Don't use this outside of the core VM code! + */ +void __nvgpu_vm_unmap_ref(struct nvgpu_ref *ref); /* * These all require the VM update lock to be held. -- cgit v1.2.2