summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2016-10-04 09:21:35 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-10-14 11:12:17 -0400
commita4e4466a0cb3cf3bca369ca09013d68fe8102baf (patch)
tree4c1dba42db80ac124e9be9a6b75f1774503b3480 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent6760e3c33125bfca0b9b37e802a80452159863a9 (diff)
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 <kholtta@nvidia.com> Reviewed-on: http://git-master/r/1231422 (cherry picked from commit 025e765f312c253b201ecf2dbbe0f4972fe1d4bc) Reviewed-on: http://git-master/r/1235957 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c9
1 files changed, 5 insertions, 4 deletions
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)
950 mutex_init(&mm->vidmem.first_clear_mutex); 950 mutex_init(&mm->vidmem.first_clear_mutex);
951 951
952 INIT_WORK(&mm->vidmem.clear_mem_worker, gk20a_vidmem_clear_mem_worker); 952 INIT_WORK(&mm->vidmem.clear_mem_worker, gk20a_vidmem_clear_mem_worker);
953 atomic_set(&mm->vidmem.clears_pending, 0); 953 atomic64_set(&mm->vidmem.bytes_pending, 0);
954 INIT_LIST_HEAD(&mm->vidmem.clear_list_head); 954 INIT_LIST_HEAD(&mm->vidmem.clear_list_head);
955 mutex_init(&mm->vidmem.clear_list_mutex); 955 mutex_init(&mm->vidmem.clear_list_mutex);
956 956
@@ -3093,7 +3093,7 @@ int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr,
3093 WARN_ON(attr != 0 && attr != DMA_ATTR_NO_KERNEL_MAPPING); 3093 WARN_ON(attr != 0 && attr != DMA_ATTR_NO_KERNEL_MAPPING);
3094 3094
3095 mutex_lock(&g->mm.vidmem.clear_list_mutex); 3095 mutex_lock(&g->mm.vidmem.clear_list_mutex);
3096 before_pending = atomic_read(&g->mm.vidmem.clears_pending); 3096 before_pending = atomic64_read(&g->mm.vidmem.bytes_pending);
3097 addr = __gk20a_gmmu_alloc(vidmem_alloc, at, size); 3097 addr = __gk20a_gmmu_alloc(vidmem_alloc, at, size);
3098 mutex_unlock(&g->mm.vidmem.clear_list_mutex); 3098 mutex_unlock(&g->mm.vidmem.clear_list_mutex);
3099 if (!addr) { 3099 if (!addr) {
@@ -3156,7 +3156,7 @@ static void gk20a_gmmu_free_attr_vid(struct gk20a *g, enum dma_attr attr,
3156 was_empty = list_empty(&g->mm.vidmem.clear_list_head); 3156 was_empty = list_empty(&g->mm.vidmem.clear_list_head);
3157 list_add_tail(&mem->clear_list_entry, 3157 list_add_tail(&mem->clear_list_entry,
3158 &g->mm.vidmem.clear_list_head); 3158 &g->mm.vidmem.clear_list_head);
3159 atomic_inc(&g->mm.vidmem.clears_pending); 3159 atomic64_add(mem->size, &g->mm.vidmem.bytes_pending);
3160 mutex_unlock(&g->mm.vidmem.clear_list_mutex); 3160 mutex_unlock(&g->mm.vidmem.clear_list_mutex);
3161 3161
3162 if (was_empty) { 3162 if (was_empty) {
@@ -3245,7 +3245,8 @@ static void gk20a_vidmem_clear_mem_worker(struct work_struct *work)
3245 (u64)get_vidmem_page_alloc(mem->sgt->sgl)); 3245 (u64)get_vidmem_page_alloc(mem->sgt->sgl));
3246 gk20a_free_sgtable(&mem->sgt); 3246 gk20a_free_sgtable(&mem->sgt);
3247 3247
3248 WARN_ON(atomic_dec_return(&mm->vidmem.clears_pending) < 0); 3248 WARN_ON(atomic64_sub_return(mem->size,
3249 &g->mm.vidmem.bytes_pending) < 0);
3249 mem->size = 0; 3250 mem->size = 0;
3250 mem->aperture = APERTURE_INVALID; 3251 mem->aperture = APERTURE_INVALID;
3251 3252