summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/mm/vm.c
diff options
context:
space:
mode:
authorSami Kiminki <skiminki@nvidia.com>2017-11-14 08:56:09 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-11-15 16:26:19 -0500
commit69e032653df5aae335764f6346703a1e55c96a2d (patch)
tree4554eb5596bed720865e70a448674c7b1da4e1b9 /drivers/gpu/nvgpu/common/mm/vm.c
parent44f8b11f47bc31aafd0e3d2486125e1d87725fd4 (diff)
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 <skiminki@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1597904 Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/mm/vm.c')
-rw-r--r--drivers/gpu/nvgpu/common/mm/vm.c27
1 files changed, 18 insertions, 9 deletions
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,
874 */ 874 */
875 if (comptags.needs_clear) { 875 if (comptags.needs_clear) {
876 if (g->ops.ltc.cbc_ctrl) { 876 if (g->ops.ltc.cbc_ctrl) {
877 g->ops.ltc.cbc_ctrl( 877 if (gk20a_comptags_start_clear(os_buf)) {
878 g, gk20a_cbc_op_clear, 878 err = g->ops.ltc.cbc_ctrl(
879 comptags.offset, 879 g, gk20a_cbc_op_clear,
880 (comptags.offset + 880 comptags.offset,
881 comptags.lines - 1)); 881 (comptags.offset +
882 gk20a_mark_comptags_cleared(os_buf); 882 comptags.lines - 1));
883 gk20a_comptags_finish_clear(
884 os_buf, err == 0);
885 if (err)
886 goto clean_up;
887 }
883 } else { 888 } else {
884 /* 889 /*
885 * Cleared as part of gmmu map 890 * Cleared as part of gmmu map
@@ -920,6 +925,9 @@ struct nvgpu_mapped_buf *nvgpu_vm_map(struct vm_gk20a *vm,
920 goto clean_up; 925 goto clean_up;
921 } 926 }
922 927
928 if (clear_ctags)
929 clear_ctags = gk20a_comptags_start_clear(os_buf);
930
923 map_addr = g->ops.mm.gmmu_map(vm, 931 map_addr = g->ops.mm.gmmu_map(vm,
924 map_addr, 932 map_addr,
925 sgt, 933 sgt,
@@ -935,14 +943,15 @@ struct nvgpu_mapped_buf *nvgpu_vm_map(struct vm_gk20a *vm,
935 false, 943 false,
936 batch, 944 batch,
937 aperture); 945 aperture);
946
947 if (clear_ctags)
948 gk20a_comptags_finish_clear(os_buf, map_addr != 0);
949
938 if (!map_addr) { 950 if (!map_addr) {
939 err = -ENOMEM; 951 err = -ENOMEM;
940 goto clean_up; 952 goto clean_up;
941 } 953 }
942 954
943 if (clear_ctags)
944 gk20a_mark_comptags_cleared(os_buf);
945
946 nvgpu_init_list_node(&mapped_buffer->buffer_list); 955 nvgpu_init_list_node(&mapped_buffer->buffer_list);
947 nvgpu_ref_init(&mapped_buffer->ref); 956 nvgpu_ref_init(&mapped_buffer->ref);
948 mapped_buffer->addr = map_addr; 957 mapped_buffer->addr = map_addr;