diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2017-05-16 06:47:58 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-06-14 19:33:32 -0400 |
commit | 7680fd689ecf7d11bf2dfdba41dc2f33cde2bbe7 (patch) | |
tree | b6df6640eaaa7e46deae7035572e7019f4311f7d /drivers/gpu/nvgpu/common | |
parent | 3c3c39dfe0d1122efeead871eec7c37617404850 (diff) |
gpu: nvgpu: hold power ref for deterministic channels
To support deterministic channels even with platforms where railgating
is supported, have each deterministic-marked channel hold a power
reference during their lifetime, and skip taking power refs for jobs in
submit path for those.
Previously, railgating blocked deterministic submits in general because
of gk20a_busy()/gk20a_idle() calls in submit path possibly taking time
and more significantly because the gpu may need turning on which takes a
nondeterministic and long amount of time.
As an exception, gk20a_do_idle() can still block deterministic submits
until gk20a_do_unidle() is called. Add a rwsem to guard this. VPR resize
needs do_idle, which conflicts with deterministic channels' requirement
to keep the GPU on. This is documented in the ioctl header now.
Make NVGPU_GPU_FLAGS_SUPPORT_DETERMINISTIC_SUBMIT_NO_JOBTRACKING always
set in the gpu characteristics now that it's supported. The only thing
left now blocking NVGPU_GPU_FLAGS_SUPPORT_DETERMINISTIC_SUBMIT_FULL is
the sync framework.
Make the channel debug dump show which channels are deterministic.
Bug 200291300
Jira NVGPU-70
Change-Id: I47b6f3a8517cd6e4255f6ca2855e3dd912e4f5f3
Signed-off-by: Konsta Holtta <kholtta@nvidia.com>
Reviewed-on: http://git-master/r/1483038
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/driver_common.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/module.c | 9 |
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index bd9a4e77..a00880ed 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.c | |||
@@ -39,6 +39,7 @@ static void nvgpu_init_vars(struct gk20a *g) | |||
39 | gk20a_init_gr(g); | 39 | gk20a_init_gr(g); |
40 | 40 | ||
41 | init_rwsem(&g->busy_lock); | 41 | init_rwsem(&g->busy_lock); |
42 | init_rwsem(&g->deterministic_busy); | ||
42 | 43 | ||
43 | nvgpu_spinlock_init(&g->mc_enable_lock); | 44 | nvgpu_spinlock_init(&g->mc_enable_lock); |
44 | 45 | ||
diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index 34a0ded6..cbad3993 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c | |||
@@ -298,6 +298,12 @@ int __gk20a_do_idle(struct device *dev, bool force_reset) | |||
298 | bool is_railgated; | 298 | bool is_railgated; |
299 | int err = 0; | 299 | int err = 0; |
300 | 300 | ||
301 | /* | ||
302 | * Hold back deterministic submits and changes to deterministic | ||
303 | * channels - this must be outside the power busy locks. | ||
304 | */ | ||
305 | gk20a_channel_deterministic_idle(g); | ||
306 | |||
301 | /* acquire busy lock to block other busy() calls */ | 307 | /* acquire busy lock to block other busy() calls */ |
302 | down_write(&g->busy_lock); | 308 | down_write(&g->busy_lock); |
303 | 309 | ||
@@ -403,6 +409,7 @@ fail_drop_usage_count: | |||
403 | fail_timeout: | 409 | fail_timeout: |
404 | nvgpu_mutex_release(&platform->railgate_lock); | 410 | nvgpu_mutex_release(&platform->railgate_lock); |
405 | up_write(&g->busy_lock); | 411 | up_write(&g->busy_lock); |
412 | gk20a_channel_deterministic_unidle(g); | ||
406 | return -EBUSY; | 413 | return -EBUSY; |
407 | } | 414 | } |
408 | 415 | ||
@@ -456,6 +463,8 @@ int __gk20a_do_unidle(struct device *dev) | |||
456 | nvgpu_mutex_release(&platform->railgate_lock); | 463 | nvgpu_mutex_release(&platform->railgate_lock); |
457 | up_write(&g->busy_lock); | 464 | up_write(&g->busy_lock); |
458 | 465 | ||
466 | gk20a_channel_deterministic_unidle(g); | ||
467 | |||
459 | return 0; | 468 | return 0; |
460 | } | 469 | } |
461 | 470 | ||