summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c15
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h1
2 files changed, 12 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 570a3708..4c55f8ce 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -947,6 +947,8 @@ static int gk20a_init_vidmem(struct mm_gk20a *mm)
947 mm->vidmem.bootstrap_base = bootstrap_base; 947 mm->vidmem.bootstrap_base = bootstrap_base;
948 mm->vidmem.bootstrap_size = bootstrap_size; 948 mm->vidmem.bootstrap_size = bootstrap_size;
949 949
950 mutex_init(&mm->vidmem.first_clear_mutex);
951
950 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);
951 atomic_set(&mm->vidmem.clears_pending, 0); 953 atomic_set(&mm->vidmem.clears_pending, 0);
952 INIT_LIST_HEAD(&mm->vidmem.clear_list_head); 954 INIT_LIST_HEAD(&mm->vidmem.clear_list_head);
@@ -2190,11 +2192,16 @@ int gk20a_vidmem_buf_alloc(struct gk20a *g, size_t bytes)
2190 buf->g = g; 2192 buf->g = g;
2191 2193
2192 if (!g->mm.vidmem.cleared) { 2194 if (!g->mm.vidmem.cleared) {
2193 err = gk20a_vidmem_clear_all(g); 2195 mutex_lock(&g->mm.vidmem.first_clear_mutex);
2194 if (err) { 2196 if (!g->mm.vidmem.cleared) {
2195 gk20a_err(g->dev, "failed to clear whole vidmem"); 2197 err = gk20a_vidmem_clear_all(g);
2196 goto err_kfree; 2198 if (err) {
2199 gk20a_err(g->dev,
2200 "failed to clear whole vidmem");
2201 goto err_kfree;
2202 }
2197 } 2203 }
2204 mutex_unlock(&g->mm.vidmem.first_clear_mutex);
2198 } 2205 }
2199 2206
2200 buf->mem = kzalloc(sizeof(struct mem_desc), GFP_KERNEL); 2207 buf->mem = kzalloc(sizeof(struct mem_desc), GFP_KERNEL);
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
index 8ce110a1..ee2bb61e 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
@@ -417,6 +417,7 @@ struct mm_gk20a {
417 417
418 u32 ce_ctx_id; 418 u32 ce_ctx_id;
419 bool cleared; 419 bool cleared;
420 struct mutex first_clear_mutex;
420 421
421 struct list_head clear_list_head; 422 struct list_head clear_list_head;
422 struct mutex clear_list_mutex; 423 struct mutex clear_list_mutex;