From 64e1782aee550670fedcf8b8b012fc1281ae9172 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Wed, 22 Feb 2017 15:00:18 +0530 Subject: gpu: nvgpu: optimize duplicate buffer lookup in case of fixed offsets In gk20a_vm_map_duplicate_locked(), we always do a linear search in rb-tree to find a duplicate entry of the buffer In case NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET is set, we first traverse whole rb-tree linearly and then compare offset_align with the address searched from rb-tree If size of rb-tree is very large this linear lookup takes upto 7mS and causes huge delays Hence in case of NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET, we can use offset_align to perform a binary search on rb-tree and then verify that dmabuf and kind match with the node obtained from the search This saves a lot of time per-lookup Bug 1874516 Change-Id: Ia4924b64d66e586c14341ae2e2283beac394bf6f Signed-off-by: Deepak Nibade Reviewed-on: http://git-master/r/1309343 Reviewed-by: svccoveritychecker GVS: Gerrit_Virtual_Submit Reviewed-by: Konsta Holtta Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'drivers/gpu/nvgpu') diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index c91acbd2..c95e744e 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -2061,19 +2061,26 @@ static u64 gk20a_vm_map_duplicate_locked(struct vm_gk20a *vm, struct gk20a *g = gk20a_from_vm(vm); struct mapped_buffer_node *mapped_buffer = NULL; - mapped_buffer = - find_mapped_buffer_reverse_locked(&vm->mapped_buffers, + if (flags & NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET) { + mapped_buffer = find_mapped_buffer_locked(&vm->mapped_buffers, + offset_align); + if (!mapped_buffer) + return 0; + + if (mapped_buffer->dmabuf != dmabuf || + mapped_buffer->kind != (u32)kind) + return 0; + } else { + mapped_buffer = + find_mapped_buffer_reverse_locked(&vm->mapped_buffers, dmabuf, kind); - if (!mapped_buffer) - return 0; + if (!mapped_buffer) + return 0; + } if (mapped_buffer->flags != flags) return 0; - if (flags & NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET && - mapped_buffer->addr != offset_align) - return 0; - BUG_ON(mapped_buffer->vm != vm); /* mark the buffer as used */ -- cgit v1.2.2