summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fence_gk20a.c
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2016-01-21 17:50:23 -0500
committerAlex Waterman <alexw@nvidia.com>2016-01-27 13:59:00 -0500
commitf7d219dd1c95ba9de2349b4de9f8cb510ec001cb (patch)
treeae250744ba1c042b9ac82630af89d4e1b8a16e82 /drivers/gpu/nvgpu/gk20a/fence_gk20a.c
parentaa74098f29b3027111baf17c21d6e30a3656e2d0 (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.c6
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