From 888fbbda21af9ed9b47527cdc0b853c4397005d0 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Tue, 25 Apr 2017 13:03:38 -0700 Subject: gpu: nvgpu: Use nvgpu_cond for channel refcount Use nvgpu_cond for waiting for all channel accesses to finalize before closing a channel, and for signalling for the same event. JIRA NVGPU-14 Change-Id: Ifac14ad9afe5c44d4443b4a4a94a4d0ad2ea7053 Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/1469764 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svccoveritychecker Reviewed-by: Lakshmanan M GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 11 ++++++----- drivers/gpu/nvgpu/gk20a/channel_gk20a.h | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'drivers/gpu/nvgpu') diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index db44d11b..04765eea 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "gk20a.h" #include "debug_gk20a.h" @@ -385,11 +386,11 @@ void gk20a_channel_free_error_notifiers(struct channel_gk20a *ch) static void gk20a_wait_until_counter_is_N( struct channel_gk20a *ch, atomic_t *counter, int wait_value, - wait_queue_head_t *wq, const char *caller, const char *counter_name) + struct nvgpu_cond *c, const char *caller, const char *counter_name) { while (true) { - if (wait_event_timeout( - *wq, + if (NVGPU_COND_WAIT( + c, atomic_read(counter) == wait_value, msecs_to_jiffies(5000)) > 0) break; @@ -712,7 +713,7 @@ void _gk20a_channel_put(struct channel_gk20a *ch, const char *caller) gk20a_channel_save_ref_source(ch, channel_gk20a_ref_action_put); trace_gk20a_channel_put(ch->hw_chid, caller); atomic_dec(&ch->ref_count); - wake_up_all(&ch->ref_count_dec_wq); + nvgpu_cond_broadcast(&ch->ref_count_dec_wq); /* More puts than gets. Channel is probably going to get * stuck. */ @@ -2624,7 +2625,7 @@ int gk20a_init_channel_support(struct gk20a *g, u32 chid) nvgpu_spinlock_init(&c->ref_obtain_lock); atomic_set(&c->ref_count, 0); c->referenceable = false; - init_waitqueue_head(&c->ref_count_dec_wq); + nvgpu_cond_init(&c->ref_count_dec_wq); #if GK20A_CHANNEL_REFCOUNT_TRACKING nvgpu_spinlock_init(&c->ref_actions_lock); diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h index 3312f8f1..ea77985e 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h @@ -24,6 +24,7 @@ #include #include +#include struct gk20a; struct gr_gk20a; @@ -169,7 +170,7 @@ struct channel_gk20a { struct nvgpu_spinlock ref_obtain_lock; bool referenceable; atomic_t ref_count; - wait_queue_head_t ref_count_dec_wq; + struct nvgpu_cond ref_count_dec_wq; #if GK20A_CHANNEL_REFCOUNT_TRACKING /* * Ring buffer for most recent refcount gets and puts. Protected by -- cgit v1.2.2