diff options
author | Seema Khowala <seemaj@nvidia.com> | 2018-10-19 15:08:46 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2019-02-13 16:19:37 -0500 |
commit | 220860d04383489a8e75684802a2ced1323831df (patch) | |
tree | 123e92d8b1781afa6de32bc2615ae5835b389f4d /drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |
parent | 18643ac1357a845d204d6dabd98359a0ab0509a7 (diff) |
gpu: nvgpu: rename has_timedout and make it thread safe
Currently has_timedout variable is protected by wmb at places
where it is being set and there is no correspoding rmb whenever
has_timedout variable is read. This is prone to errors for
concurrent execution. This change is supposed to fix this issue.
Rename has_timedout variable of channel struct to ch_timedout.
Also to avoid rmb every time ch_timedout is read,
ch_timedout_spinlock is added to protect ch_timedout
variable for taking care of concurrent execution.
Bug 2404865
Bug 2092051
Change-Id: I0bee9f50af0a48720aa8b54cbc3af97ef9f6df00
Signed-off-by: Seema Khowala <seemaj@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1930935
Signed-off-by: Debarshi Dutta <ddutta@nvidia.com>
(cherry picked from commit 1f54ea09e3445d9ca3cf7a69b4967849cc9defc8
in dev-kernel)
Reviewed-on: https://git-master.nvidia.com/r/2016975
GVS: Gerrit_Virtual_Submit
Reviewed-by: Alex Waterman <alexw@nvidia.com>
Reviewed-by: Bibek Basu <bbasu@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 06db0bb0..d4e386bd 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |||
@@ -1484,8 +1484,8 @@ static void gk20a_fifo_set_has_timedout_and_wake_up_wqs(struct gk20a *g, | |||
1484 | { | 1484 | { |
1485 | if (refch) { | 1485 | if (refch) { |
1486 | /* mark channel as faulted */ | 1486 | /* mark channel as faulted */ |
1487 | refch->has_timedout = true; | 1487 | gk20a_channel_set_timedout(refch); |
1488 | nvgpu_smp_wmb(); | 1488 | |
1489 | /* unblock pending waits */ | 1489 | /* unblock pending waits */ |
1490 | nvgpu_cond_broadcast_interruptible(&refch->semaphore_wq); | 1490 | nvgpu_cond_broadcast_interruptible(&refch->semaphore_wq); |
1491 | nvgpu_cond_broadcast_interruptible(&refch->notifier_wq); | 1491 | nvgpu_cond_broadcast_interruptible(&refch->notifier_wq); |
@@ -1568,7 +1568,7 @@ void gk20a_fifo_abort_tsg(struct gk20a *g, struct tsg_gk20a *tsg, bool preempt) | |||
1568 | nvgpu_rwsem_down_read(&tsg->ch_list_lock); | 1568 | nvgpu_rwsem_down_read(&tsg->ch_list_lock); |
1569 | nvgpu_list_for_each_entry(ch, &tsg->ch_list, channel_gk20a, ch_entry) { | 1569 | nvgpu_list_for_each_entry(ch, &tsg->ch_list, channel_gk20a, ch_entry) { |
1570 | if (gk20a_channel_get(ch)) { | 1570 | if (gk20a_channel_get(ch)) { |
1571 | ch->has_timedout = true; | 1571 | gk20a_channel_set_timedout(ch); |
1572 | if (ch->g->ops.fifo.ch_abort_clean_up) { | 1572 | if (ch->g->ops.fifo.ch_abort_clean_up) { |
1573 | ch->g->ops.fifo.ch_abort_clean_up(ch); | 1573 | ch->g->ops.fifo.ch_abort_clean_up(ch); |
1574 | } | 1574 | } |
@@ -2181,7 +2181,7 @@ int gk20a_fifo_tsg_unbind_channel(struct channel_gk20a *ch) | |||
2181 | 2181 | ||
2182 | /* If one channel in TSG times out, we disable all channels */ | 2182 | /* If one channel in TSG times out, we disable all channels */ |
2183 | nvgpu_rwsem_down_write(&tsg->ch_list_lock); | 2183 | nvgpu_rwsem_down_write(&tsg->ch_list_lock); |
2184 | tsg_timedout = ch->has_timedout; | 2184 | tsg_timedout = gk20a_channel_check_timedout(ch); |
2185 | nvgpu_rwsem_up_write(&tsg->ch_list_lock); | 2185 | nvgpu_rwsem_up_write(&tsg->ch_list_lock); |
2186 | 2186 | ||
2187 | /* Disable TSG and examine status before unbinding channel */ | 2187 | /* Disable TSG and examine status before unbinding channel */ |