From 69e032653df5aae335764f6346703a1e55c96a2d Mon Sep 17 00:00:00 2001 From: Sami Kiminki Date: Tue, 14 Nov 2017 15:56:09 +0200 Subject: gpu: nvgpu: Add synchronization to comptag alloc and clearing Comptags allocation and clearing was not synchronized for a buffer. Fix this race by serializing the operations with the gk20a_dmabuf_priv lock. While doing that, add an error check in the cbc_ctrl call. Bug 1902982 Change-Id: Icd96f1855eb5e5340651bcc85849b5ccc199b821 Signed-off-by: Sami Kiminki Reviewed-on: https://git-master.nvidia.com/r/1597904 Reviewed-by: Alex Waterman Reviewed-by: Terje Bergstrom Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/mm/vm.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'drivers/gpu/nvgpu/common/mm') diff --git a/drivers/gpu/nvgpu/common/mm/vm.c b/drivers/gpu/nvgpu/common/mm/vm.c index c3f6b79d..ebe8e381 100644 --- a/drivers/gpu/nvgpu/common/mm/vm.c +++ b/drivers/gpu/nvgpu/common/mm/vm.c @@ -874,12 +874,17 @@ struct nvgpu_mapped_buf *nvgpu_vm_map(struct vm_gk20a *vm, */ if (comptags.needs_clear) { if (g->ops.ltc.cbc_ctrl) { - g->ops.ltc.cbc_ctrl( - g, gk20a_cbc_op_clear, - comptags.offset, - (comptags.offset + - comptags.lines - 1)); - gk20a_mark_comptags_cleared(os_buf); + if (gk20a_comptags_start_clear(os_buf)) { + err = g->ops.ltc.cbc_ctrl( + g, gk20a_cbc_op_clear, + comptags.offset, + (comptags.offset + + comptags.lines - 1)); + gk20a_comptags_finish_clear( + os_buf, err == 0); + if (err) + goto clean_up; + } } else { /* * Cleared as part of gmmu map @@ -920,6 +925,9 @@ struct nvgpu_mapped_buf *nvgpu_vm_map(struct vm_gk20a *vm, goto clean_up; } + if (clear_ctags) + clear_ctags = gk20a_comptags_start_clear(os_buf); + map_addr = g->ops.mm.gmmu_map(vm, map_addr, sgt, @@ -935,14 +943,15 @@ struct nvgpu_mapped_buf *nvgpu_vm_map(struct vm_gk20a *vm, false, batch, aperture); + + if (clear_ctags) + gk20a_comptags_finish_clear(os_buf, map_addr != 0); + if (!map_addr) { err = -ENOMEM; goto clean_up; } - if (clear_ctags) - gk20a_mark_comptags_cleared(os_buf); - nvgpu_init_list_node(&mapped_buffer->buffer_list); nvgpu_ref_init(&mapped_buffer->ref); mapped_buffer->addr = map_addr; -- cgit v1.2.2