From 371b173c12df8828df74da2c8edfc94182dccfae Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Fri, 31 Mar 2017 17:51:55 +0530 Subject: gpu: nvgpu: use nvgpu list for vidmem clear list Use nvgpu list APIs instead of linux list APIs for vidmem clear list Jira NVGPU-13 Change-Id: I13f7c5a54fb199d15ad1402216f3275f0f0474af Signed-off-by: Deepak Nibade Reviewed-on: http://git-master/r/1454012 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svccoveritychecker GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 17 +++++++++-------- drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 12 ++++++++++-- 2 files changed, 19 insertions(+), 10 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a') 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) INIT_WORK(&mm->vidmem.clear_mem_worker, gk20a_vidmem_clear_mem_worker); atomic64_set(&mm->vidmem.bytes_pending, 0); - INIT_LIST_HEAD(&mm->vidmem.clear_list_head); + nvgpu_init_list_node(&mm->vidmem.clear_list_head); nvgpu_mutex_init(&mm->vidmem.clear_list_mutex); 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, mem->aperture = APERTURE_VIDMEM; mem->allocator = vidmem_alloc; - INIT_LIST_HEAD(&mem->clear_list_entry); + nvgpu_init_list_node(&mem->clear_list_entry); gk20a_dbg_fn("done at 0x%llx size %zu", addr, size); @@ -3038,8 +3038,8 @@ static void gk20a_gmmu_free_vid(struct gk20a *g, struct mem_desc *mem) if (mem->user_mem) { nvgpu_mutex_acquire(&g->mm.vidmem.clear_list_mutex); - was_empty = list_empty(&g->mm.vidmem.clear_list_head); - list_add_tail(&mem->clear_list_entry, + was_empty = nvgpu_list_empty(&g->mm.vidmem.clear_list_head); + nvgpu_list_add_tail(&mem->clear_list_entry, &g->mm.vidmem.clear_list_head); atomic64_add(mem->size, &g->mm.vidmem.bytes_pending); 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) struct mem_desc *mem = NULL; nvgpu_mutex_acquire(&mm->vidmem.clear_list_mutex); - mem = list_first_entry_or_null(&mm->vidmem.clear_list_head, - struct mem_desc, clear_list_entry); - if (mem) - list_del_init(&mem->clear_list_entry); + if (!nvgpu_list_empty(&mm->vidmem.clear_list_head)) { + mem = nvgpu_list_first_entry(&mm->vidmem.clear_list_head, + mem_desc, clear_list_entry); + nvgpu_list_del(&mem->clear_list_entry); + } nvgpu_mutex_release(&mm->vidmem.clear_list_mutex); 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 @@ #include #include +#include #ifdef CONFIG_ARM64 #define outer_flush_range(a, b) @@ -76,11 +77,18 @@ struct mem_desc { bool fixed; /* vidmem only */ bool user_mem; /* vidmem only */ struct nvgpu_allocator *allocator; /* vidmem only */ - struct list_head clear_list_entry; /* vidmem only */ + struct nvgpu_list_node clear_list_entry; /* vidmem only */ bool skip_wmb; unsigned long flags; }; +static inline struct mem_desc * +mem_desc_from_clear_list_entry(struct nvgpu_list_node *node) +{ + return (struct mem_desc *) + ((uintptr_t)node - offsetof(struct mem_desc, clear_list_entry)); +}; + struct mem_desc_sub { u32 offset; u32 size; @@ -416,7 +424,7 @@ struct mm_gk20a { volatile bool cleared; struct nvgpu_mutex first_clear_mutex; - struct list_head clear_list_head; + struct nvgpu_list_node clear_list_head; struct nvgpu_mutex clear_list_mutex; struct work_struct clear_mem_worker; -- cgit v1.2.2