diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 15 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 1 |
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; |