From 339a67b2e84cea20a59334b0640b9ab7e0d75ca9 Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Thu, 8 Dec 2016 13:02:16 +0200 Subject: gpu: nvgpu: replace tsg list mutex with rwsem Lock only for modifications to the tsg channel list, and allow multiple concurrent readers. Bug 1848834 Bug 1814773 Change-Id: Ie3938d4239cfe36a14211f4649ce72b7fc3e2fa4 Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/1269579 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/tsg_gk20a.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/tsg_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c index 0541f430..8e6f763a 100644 --- a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c @@ -43,11 +43,11 @@ int gk20a_enable_tsg(struct tsg_gk20a *tsg) struct gk20a *g = tsg->g; struct channel_gk20a *ch; - mutex_lock(&tsg->ch_list_lock); + down_read(&tsg->ch_list_lock); list_for_each_entry(ch, &tsg->ch_list, ch_entry) { g->ops.fifo.enable_channel(ch); } - mutex_unlock(&tsg->ch_list_lock); + up_read(&tsg->ch_list_lock); return 0; } @@ -57,11 +57,11 @@ int gk20a_disable_tsg(struct tsg_gk20a *tsg) struct gk20a *g = tsg->g; struct channel_gk20a *ch; - mutex_lock(&tsg->ch_list_lock); + down_read(&tsg->ch_list_lock); list_for_each_entry(ch, &tsg->ch_list, ch_entry) { g->ops.fifo.disable_channel(ch); } - mutex_unlock(&tsg->ch_list_lock); + up_read(&tsg->ch_list_lock); return 0; } @@ -126,9 +126,9 @@ int gk20a_tsg_bind_channel(struct tsg_gk20a *tsg, return -EINVAL; } - mutex_lock(&tsg->ch_list_lock); + down_write(&tsg->ch_list_lock); list_add_tail(&ch->ch_entry, &tsg->ch_list); - mutex_unlock(&tsg->ch_list_lock); + up_write(&tsg->ch_list_lock); kref_get(&tsg->refcount); @@ -144,9 +144,9 @@ int gk20a_tsg_unbind_channel(struct channel_gk20a *ch) struct fifo_gk20a *f = &ch->g->fifo; struct tsg_gk20a *tsg = &f->tsg[ch->tsgid]; - mutex_lock(&tsg->ch_list_lock); + down_write(&tsg->ch_list_lock); list_del_init(&ch->ch_entry); - mutex_unlock(&tsg->ch_list_lock); + up_write(&tsg->ch_list_lock); kref_put(&tsg->refcount, gk20a_tsg_release); @@ -168,7 +168,7 @@ int gk20a_init_tsg_support(struct gk20a *g, u32 tsgid) tsg->tsgid = tsgid; INIT_LIST_HEAD(&tsg->ch_list); - mutex_init(&tsg->ch_list_lock); + init_rwsem(&tsg->ch_list_lock); INIT_LIST_HEAD(&tsg->event_id_list); mutex_init(&tsg->event_id_list_lock); -- cgit v1.2.2