gpu: nvgpu: Greatly simplify the semaphore detection

Greatly simplify and make more robust the gpu semaphore detection
in sync_fences. Instead of using a magic number use the parent
timeline of sync_pts.

This will also work with multi-GPU setups using nvgpu since the
timeline ops pointer will be the same across all instances of
nvgpu.

Bug 1732449

Reviewed-on: http://git-master/r/1203834
(cherry picked from commit 66eeb577eae5d10741fd15f3659e843c70792cd6)
Change-Id: I4c6619d70b5531e2676e18d1330724e8f8b9bcb3
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/1221042
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
This commit is contained in:
Alex Waterman
2016-07-28 11:22:53 -07:00
committed by mobile promotions
parent 9bd76b7fa0
commit 7b8cbd2be3
3 changed files with 51 additions and 101 deletions

View File

@@ -510,24 +510,7 @@ static int gk20a_channel_semaphore_wait_syncpt(
return -ENODEV;
}
/*
* UGHHH - the sync_fence underlying implementation changes from 3.10 to 3.18.
* But since there's no API for getting the underlying sync_pts we have to do
* some conditional compilation.
*/
#ifdef CONFIG_SYNC
static struct gk20a_semaphore *sema_from_sync_fence(struct sync_fence *f)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,0)
struct sync_pt *pt;
pt = list_first_entry(&f->pt_list_head, struct sync_pt, pt_list);
return gk20a_sync_pt_inst_get_sema(pt);
#else
return gk20a_sync_pt_inst_get_sema(f->cbs[0].sync_pt);
#endif
}
/*
* Attempt a fast path for waiting on a sync_fence. Basically if the passed
* sync_fence is backed by a gk20a_semaphore then there's no reason to go
@@ -551,7 +534,7 @@ static int __semaphore_wait_fd_fast_path(struct channel_gk20a *c,
if (!gk20a_is_sema_backed_sync_fence(fence))
return -ENODEV;
sema = sema_from_sync_fence(fence);
sema = gk20a_sync_fence_get_sema(fence);
/*
* If there's no underlying sema then that means the underlying sema has