From a4e4466a0cb3cf3bca369ca09013d68fe8102baf Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Tue, 4 Oct 2016 16:21:35 +0300 Subject: gpu: nvgpu: track pending bytes for vidmem clears Change clears_pending to bytes_pending and track accordingly the number of bytes to be freed instead of the number of buffers. This, atomically combined with the amount of space in the allocator, is the total amount of free memory available. Bug 200233138 Change-Id: Ibbb4e80a32728781ba19a74307d8a8ac1a4d7431 Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/1231422 (cherry picked from commit 025e765f312c253b201ecf2dbbe0f4972fe1d4bc) Reviewed-on: http://git-master/r/1235957 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index f327294a..f46f7a81 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -950,7 +950,7 @@ static int gk20a_init_vidmem(struct mm_gk20a *mm) mutex_init(&mm->vidmem.first_clear_mutex); INIT_WORK(&mm->vidmem.clear_mem_worker, gk20a_vidmem_clear_mem_worker); - atomic_set(&mm->vidmem.clears_pending, 0); + atomic64_set(&mm->vidmem.bytes_pending, 0); INIT_LIST_HEAD(&mm->vidmem.clear_list_head); mutex_init(&mm->vidmem.clear_list_mutex); @@ -3093,7 +3093,7 @@ int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr, WARN_ON(attr != 0 && attr != DMA_ATTR_NO_KERNEL_MAPPING); mutex_lock(&g->mm.vidmem.clear_list_mutex); - before_pending = atomic_read(&g->mm.vidmem.clears_pending); + before_pending = atomic64_read(&g->mm.vidmem.bytes_pending); addr = __gk20a_gmmu_alloc(vidmem_alloc, at, size); mutex_unlock(&g->mm.vidmem.clear_list_mutex); if (!addr) { @@ -3156,7 +3156,7 @@ static void gk20a_gmmu_free_attr_vid(struct gk20a *g, enum dma_attr attr, was_empty = list_empty(&g->mm.vidmem.clear_list_head); list_add_tail(&mem->clear_list_entry, &g->mm.vidmem.clear_list_head); - atomic_inc(&g->mm.vidmem.clears_pending); + atomic64_add(mem->size, &g->mm.vidmem.bytes_pending); mutex_unlock(&g->mm.vidmem.clear_list_mutex); if (was_empty) { @@ -3245,7 +3245,8 @@ static void gk20a_vidmem_clear_mem_worker(struct work_struct *work) (u64)get_vidmem_page_alloc(mem->sgt->sgl)); gk20a_free_sgtable(&mem->sgt); - WARN_ON(atomic_dec_return(&mm->vidmem.clears_pending) < 0); + WARN_ON(atomic64_sub_return(mem->size, + &g->mm.vidmem.bytes_pending) < 0); mem->size = 0; mem->aperture = APERTURE_INVALID; -- cgit v1.2.2