mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-23 18:16:01 +03:00
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 <dnibade@nvidia.com> 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 <snikam@nvidia.com>
This commit is contained in:
committed by
Sachin Nikam
parent
937de14907
commit
52753b51f1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user