summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c17
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h12
2 files changed, 19 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 3cda3034..b1d709f0 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -823,7 +823,7 @@ static int gk20a_init_vidmem(struct mm_gk20a *mm)
823 823
824 INIT_WORK(&mm->vidmem.clear_mem_worker, gk20a_vidmem_clear_mem_worker); 824 INIT_WORK(&mm->vidmem.clear_mem_worker, gk20a_vidmem_clear_mem_worker);
825 atomic64_set(&mm->vidmem.bytes_pending, 0); 825 atomic64_set(&mm->vidmem.bytes_pending, 0);
826 INIT_LIST_HEAD(&mm->vidmem.clear_list_head); 826 nvgpu_init_list_node(&mm->vidmem.clear_list_head);
827 nvgpu_mutex_init(&mm->vidmem.clear_list_mutex); 827 nvgpu_mutex_init(&mm->vidmem.clear_list_mutex);
828 828
829 gk20a_dbg_info("registered vidmem: %zu MB", size / SZ_1M); 829 gk20a_dbg_info("registered vidmem: %zu MB", size / SZ_1M);
@@ -3012,7 +3012,7 @@ int gk20a_gmmu_alloc_flags_vid_at(struct gk20a *g, unsigned long flags,
3012 mem->aperture = APERTURE_VIDMEM; 3012 mem->aperture = APERTURE_VIDMEM;
3013 mem->allocator = vidmem_alloc; 3013 mem->allocator = vidmem_alloc;
3014 3014
3015 INIT_LIST_HEAD(&mem->clear_list_entry); 3015 nvgpu_init_list_node(&mem->clear_list_entry);
3016 3016
3017 gk20a_dbg_fn("done at 0x%llx size %zu", addr, size); 3017 gk20a_dbg_fn("done at 0x%llx size %zu", addr, size);
3018 3018
@@ -3038,8 +3038,8 @@ static void gk20a_gmmu_free_vid(struct gk20a *g, struct mem_desc *mem)
3038 3038
3039 if (mem->user_mem) { 3039 if (mem->user_mem) {
3040 nvgpu_mutex_acquire(&g->mm.vidmem.clear_list_mutex); 3040 nvgpu_mutex_acquire(&g->mm.vidmem.clear_list_mutex);
3041 was_empty = list_empty(&g->mm.vidmem.clear_list_head); 3041 was_empty = nvgpu_list_empty(&g->mm.vidmem.clear_list_head);
3042 list_add_tail(&mem->clear_list_entry, 3042 nvgpu_list_add_tail(&mem->clear_list_entry,
3043 &g->mm.vidmem.clear_list_head); 3043 &g->mm.vidmem.clear_list_head);
3044 atomic64_add(mem->size, &g->mm.vidmem.bytes_pending); 3044 atomic64_add(mem->size, &g->mm.vidmem.bytes_pending);
3045 nvgpu_mutex_release(&g->mm.vidmem.clear_list_mutex); 3045 nvgpu_mutex_release(&g->mm.vidmem.clear_list_mutex);
@@ -3102,10 +3102,11 @@ static struct mem_desc *get_pending_mem_desc(struct mm_gk20a *mm)
3102 struct mem_desc *mem = NULL; 3102 struct mem_desc *mem = NULL;
3103 3103
3104 nvgpu_mutex_acquire(&mm->vidmem.clear_list_mutex); 3104 nvgpu_mutex_acquire(&mm->vidmem.clear_list_mutex);
3105 mem = list_first_entry_or_null(&mm->vidmem.clear_list_head, 3105 if (!nvgpu_list_empty(&mm->vidmem.clear_list_head)) {
3106 struct mem_desc, clear_list_entry); 3106 mem = nvgpu_list_first_entry(&mm->vidmem.clear_list_head,
3107 if (mem) 3107 mem_desc, clear_list_entry);
3108 list_del_init(&mem->clear_list_entry); 3108 nvgpu_list_del(&mem->clear_list_entry);
3109 }
3109 nvgpu_mutex_release(&mm->vidmem.clear_list_mutex); 3110 nvgpu_mutex_release(&mm->vidmem.clear_list_mutex);
3110 3111
3111 return mem; 3112 return mem;
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
index 2c8eb16d..db99535a 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
@@ -27,6 +27,7 @@
27#include <asm/cacheflush.h> 27#include <asm/cacheflush.h>
28 28
29#include <nvgpu/allocator.h> 29#include <nvgpu/allocator.h>
30#include <nvgpu/list.h>
30 31
31#ifdef CONFIG_ARM64 32#ifdef CONFIG_ARM64
32#define outer_flush_range(a, b) 33#define outer_flush_range(a, b)
@@ -76,11 +77,18 @@ struct mem_desc {
76 bool fixed; /* vidmem only */ 77 bool fixed; /* vidmem only */
77 bool user_mem; /* vidmem only */ 78 bool user_mem; /* vidmem only */
78 struct nvgpu_allocator *allocator; /* vidmem only */ 79 struct nvgpu_allocator *allocator; /* vidmem only */
79 struct list_head clear_list_entry; /* vidmem only */ 80 struct nvgpu_list_node clear_list_entry; /* vidmem only */
80 bool skip_wmb; 81 bool skip_wmb;
81 unsigned long flags; 82 unsigned long flags;
82}; 83};
83 84
85static inline struct mem_desc *
86mem_desc_from_clear_list_entry(struct nvgpu_list_node *node)
87{
88 return (struct mem_desc *)
89 ((uintptr_t)node - offsetof(struct mem_desc, clear_list_entry));
90};
91
84struct mem_desc_sub { 92struct mem_desc_sub {
85 u32 offset; 93 u32 offset;
86 u32 size; 94 u32 size;
@@ -416,7 +424,7 @@ struct mm_gk20a {
416 volatile bool cleared; 424 volatile bool cleared;
417 struct nvgpu_mutex first_clear_mutex; 425 struct nvgpu_mutex first_clear_mutex;
418 426
419 struct list_head clear_list_head; 427 struct nvgpu_list_node clear_list_head;
420 struct nvgpu_mutex clear_list_mutex; 428 struct nvgpu_mutex clear_list_mutex;
421 429
422 struct work_struct clear_mem_worker; 430 struct work_struct clear_mem_worker;