diff options
author | Alex Waterman <alexw@nvidia.com> | 2016-01-21 17:50:23 -0500 |
---|---|---|
committer | Alex Waterman <alexw@nvidia.com> | 2016-01-27 13:59:00 -0500 |
commit | f7d219dd1c95ba9de2349b4de9f8cb510ec001cb (patch) | |
tree | ae250744ba1c042b9ac82630af89d4e1b8a16e82 /drivers/gpu/nvgpu/gk20a/fence_gk20a.c | |
parent | aa74098f29b3027111baf17c21d6e30a3656e2d0 (diff) |
gpu: nvgpu: Fix semaphore race condition
A race condition existed in gk20a_channel_semaphore_wait_fd().
In some instances the semaphore underlying the sync_fence being
waited on would have already signaled. This would cause the
subsequent sync_fence_wait_async() call to return 1 and do
nothing. Normally, the sync_fence_wait_async() call would
release the newly created semaphore but in the above case that
would not happen and hang any channel waiting on that semaphore.
To fix this problem if sync_fence_wait_async() returns 1
immediately release the newly created semaphore.
Bug 1604892
Change-Id: I1f5e811695bb099f71b7762835aba4a7e27362ec
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/935910
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fence_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fence_gk20a.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fence_gk20a.c b/drivers/gpu/nvgpu/gk20a/fence_gk20a.c index 7a3f90e9..70666407 100644 --- a/drivers/gpu/nvgpu/gk20a/fence_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fence_gk20a.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. | 2 | * Copyright (c) 2014-2016, NVIDIA CORPORATION. All rights reserved. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -154,7 +154,9 @@ struct gk20a_fence *gk20a_fence_from_semaphore( | |||
154 | 154 | ||
155 | #ifdef CONFIG_SYNC | 155 | #ifdef CONFIG_SYNC |
156 | sync_fence = gk20a_sync_fence_create(timeline, semaphore, | 156 | sync_fence = gk20a_sync_fence_create(timeline, semaphore, |
157 | dependency, "fence"); | 157 | dependency, "f-gk20a-0x%04llx", |
158 | ((u64)(void *)semaphore->value) & | ||
159 | 0xffff); | ||
158 | if (!sync_fence) | 160 | if (!sync_fence) |
159 | return NULL; | 161 | return NULL; |
160 | #endif | 162 | #endif |