From 52753b51f1dbf51221d7856a9288aad1ab2d351a Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Wed, 7 Oct 2015 16:20:07 +0530 Subject: gpu: nvgpu: create sync_fence only if needed Currently, we create sync_fence (from nvhost_sync_create_fence()) for every submit But not all submits request for a sync_fence. Also, nvhost_sync_create_fence() API takes about 1/3rd of the total submit path. Hence to optimize, we can allocate sync_fence only when user explicitly asks for it using (NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET && NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE) Also, in CDE path from gk20a_prepare_compressible_read(), we reuse existing fence stored in "state" and that can result into not returning sync_fence_fd when user asked for it Hence, force allocation of sync_fence when job submission comes from CDE path Bug 200141116 Change-Id: Ia921701bf0e2432d6b8a5e8b7d91160e7f52db1e Signed-off-by: Deepak Nibade Reviewed-on: http://git-master/r/812845 (cherry picked from commit 5fd47015eeed00352cc8473eff969a66c94fee98) Reviewed-on: http://git-master/r/837662 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Sachin Nikam --- drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | 32 +++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c index 95647774..c0c8ec6d 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c @@ -166,7 +166,8 @@ static int __gk20a_channel_syncpt_incr(struct gk20a_channel_sync *s, bool wfi_cmd, bool register_irq, struct priv_cmd_entry **entry, - struct gk20a_fence **fence) + struct gk20a_fence **fence, + bool need_sync_fence) { u32 thresh; int incr_cmd_size; @@ -239,7 +240,7 @@ static int __gk20a_channel_syncpt_incr(struct gk20a_channel_sync *s, } *fence = gk20a_fence_from_syncpt(sp->host1x_pdev, sp->id, thresh, - wfi_cmd); + wfi_cmd, need_sync_fence); *entry = incr_cmd; return 0; } @@ -251,33 +252,35 @@ static int gk20a_channel_syncpt_incr_wfi(struct gk20a_channel_sync *s, return __gk20a_channel_syncpt_incr(s, true /* wfi */, false /* no irq handler */, - entry, fence); + entry, fence, true); } static int gk20a_channel_syncpt_incr(struct gk20a_channel_sync *s, struct priv_cmd_entry **entry, - struct gk20a_fence **fence) + struct gk20a_fence **fence, + bool need_sync_fence) { /* Don't put wfi cmd to this one since we're not returning * a fence to user space. */ return __gk20a_channel_syncpt_incr(s, false /* no wfi */, true /* register irq */, - entry, fence); + entry, fence, need_sync_fence); } static int gk20a_channel_syncpt_incr_user(struct gk20a_channel_sync *s, int wait_fence_fd, struct priv_cmd_entry **entry, struct gk20a_fence **fence, - bool wfi) + bool wfi, + bool need_sync_fence) { /* Need to do 'wfi + host incr' since we return the fence * to user space. */ return __gk20a_channel_syncpt_incr(s, wfi, true /* register irq */, - entry, fence); + entry, fence, need_sync_fence); } static void gk20a_channel_syncpt_set_min_eq_max(struct gk20a_channel_sync *s) @@ -513,7 +516,8 @@ static int __gk20a_channel_semaphore_incr( struct gk20a_channel_sync *s, bool wfi_cmd, struct sync_fence *dependency, struct priv_cmd_entry **entry, - struct gk20a_fence **fence) + struct gk20a_fence **fence, + bool need_sync_fence) { u64 va; int incr_cmd_size; @@ -560,18 +564,19 @@ static int gk20a_channel_semaphore_incr_wfi( return __gk20a_channel_semaphore_incr(s, true /* wfi */, NULL, - entry, fence); + entry, fence, true); } static int gk20a_channel_semaphore_incr( struct gk20a_channel_sync *s, struct priv_cmd_entry **entry, - struct gk20a_fence **fence) + struct gk20a_fence **fence, + bool need_sync_fence) { /* Don't put wfi cmd to this one since we're not returning * a fence to user space. */ return __gk20a_channel_semaphore_incr(s, false /* no wfi */, - NULL, entry, fence); + NULL, entry, fence, need_sync_fence); } static int gk20a_channel_semaphore_incr_user( @@ -579,7 +584,8 @@ static int gk20a_channel_semaphore_incr_user( int wait_fence_fd, struct priv_cmd_entry **entry, struct gk20a_fence **fence, - bool wfi) + bool wfi, + bool need_sync_fence) { #ifdef CONFIG_SYNC struct sync_fence *dependency = NULL; @@ -592,7 +598,7 @@ static int gk20a_channel_semaphore_incr_user( } err = __gk20a_channel_semaphore_incr(s, wfi, dependency, - entry, fence); + entry, fence, need_sync_fence); if (err) { if (dependency) sync_fence_put(dependency); -- cgit v1.2.2