From 92ab6c3bbc4f3bd7d355981b6e13a2eebff4d7d1 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Tue, 4 Apr 2017 14:30:15 +0530 Subject: gpu: nvgpu: use nvgpu list for pending semaphore waits Use nvgpu list APIs instead of linux list APIs to store pending semaphore waits Jira NVGPU-13 Change-Id: I42fc6c6233e39f475a939ddd6a81c0cda851b6bf Signed-off-by: Deepak Nibade Reviewed-on: http://git-master/r/1454693 Reviewed-by: svccoveritychecker GVS: Gerrit_Virtual_Submit Reviewed-by: Bharat Nihalani --- drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | 29 +++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c index d9dfb133..fc5862e1 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c @@ -399,7 +399,14 @@ struct wait_fence_work { struct channel_gk20a *ch; struct nvgpu_semaphore *sema; struct gk20a *g; - struct list_head entry; + struct nvgpu_list_node entry; +}; + +static inline struct wait_fence_work * +wait_fence_work_from_entry(struct nvgpu_list_node *node) +{ + return (struct wait_fence_work *) + ((uintptr_t)node - offsetof(struct wait_fence_work, entry)); }; /* @@ -413,7 +420,7 @@ static void gk20a_add_pending_sema_wait(struct gk20a *g, struct wait_fence_work *work) { nvgpu_raw_spinlock_acquire(&g->pending_sema_waits_lock); - list_add(&work->entry, &g->pending_sema_waits); + nvgpu_list_add(&work->entry, &g->pending_sema_waits); nvgpu_raw_spinlock_release(&g->pending_sema_waits_lock); } @@ -422,10 +429,10 @@ static void gk20a_add_pending_sema_wait(struct gk20a *g, * then delete the entire pending list. */ static void gk20a_start_sema_wait_cancel(struct gk20a *g, - struct list_head *list) + struct nvgpu_list_node *list) { nvgpu_raw_spinlock_acquire(&g->pending_sema_waits_lock); - list_replace_init(&g->pending_sema_waits, list); + nvgpu_list_replace_init(&g->pending_sema_waits, list); nvgpu_raw_spinlock_release(&g->pending_sema_waits_lock); } @@ -448,18 +455,18 @@ static void gk20a_start_sema_wait_cancel(struct gk20a *g, void gk20a_channel_cancel_pending_sema_waits(struct gk20a *g) { struct wait_fence_work *work; - struct list_head local_pending_sema_waits; + struct nvgpu_list_node local_pending_sema_waits; gk20a_start_sema_wait_cancel(g, &local_pending_sema_waits); - while (!list_empty(&local_pending_sema_waits)) { + while (!nvgpu_list_empty(&local_pending_sema_waits)) { int ret; - work = list_first_entry(&local_pending_sema_waits, - struct wait_fence_work, + work = nvgpu_list_first_entry(&local_pending_sema_waits, + wait_fence_work, entry); - list_del_init(&work->entry); + nvgpu_list_del(&work->entry); /* * Only nvgpu_kfree() work if the cancel is successful. @@ -486,8 +493,8 @@ static void gk20a_channel_semaphore_launcher( * otherwise it's possible that the deterministic submit path suffers. */ nvgpu_raw_spinlock_acquire(&g->pending_sema_waits_lock); - if (!list_empty(&g->pending_sema_waits)) - list_del_init(&w->entry); + if (!nvgpu_list_empty(&g->pending_sema_waits)) + nvgpu_list_del(&w->entry); nvgpu_raw_spinlock_release(&g->pending_sema_waits_lock); gk20a_dbg_info("waiting for pre fence %p '%s'", -- cgit v1.2.2