diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2016-10-04 09:21:35 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2016-10-14 11:12:17 -0400 |
commit | a4e4466a0cb3cf3bca369ca09013d68fe8102baf (patch) | |
tree | 4c1dba42db80ac124e9be9a6b75f1774503b3480 /drivers/gpu/nvgpu | |
parent | 6760e3c33125bfca0b9b37e802a80452159863a9 (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 9 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 2 |
2 files changed, 6 insertions, 5 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 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 75209063..b25a7789 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h | |||
@@ -424,7 +424,7 @@ struct mm_gk20a { | |||
424 | struct mutex clear_list_mutex; | 424 | struct mutex clear_list_mutex; |
425 | 425 | ||
426 | struct work_struct clear_mem_worker; | 426 | struct work_struct clear_mem_worker; |
427 | atomic_t clears_pending; | 427 | atomic64_t bytes_pending; |
428 | } vidmem; | 428 | } vidmem; |
429 | }; | 429 | }; |
430 | 430 | ||