diff options
author | Debarshi Dutta <ddutta@nvidia.com> | 2018-08-08 08:06:01 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-09-20 13:50:25 -0400 |
commit | 85c323c3e89d6e1b624b839c3325ae072952e545 (patch) | |
tree | 0822589079047c74fb278f512a51f80baff07b85 /drivers/gpu/nvgpu/include | |
parent | 519948a9c664020fd0b37118749faad2dfd73d97 (diff) |
gpu: nvgpu: restrict devfreq during active clk_arb set requests
Restrict access to devfreq when there are active set requests in the
clk_arbiter. We make the following changes in the patch.
1) Add a global counter in the struct gk20a named clk_arb_global_nr which
is used to track the number of active set requests in the system.
2) Anytime a set request is successfully made by the userspace,
clk_arb_global_nr is incremented by 1 and during the completion of
request(releasing the corresponding file handle), clk_arb_global_nr is
decremented by 1.
3) gk20a_scale_target(invoked by devfreq to set the new frequency based
on load) atomically checks clk_arb_global_nr. If the value = 0, the
code simply continue or else if its > 0, it quits thus making devfreq
requests mutually exclusive with the clk_arbiter.
Bug 2061372
Change-Id: I5d19de03e45520f4ff8fccb97b1f1589d04c8ab8
Signed-off-by: Debarshi Dutta <ddutta@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1790002
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/include')
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/clk_arb.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/gk20a.h | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/include/nvgpu/clk_arb.h b/drivers/gpu/nvgpu/include/nvgpu/clk_arb.h index 81b1df1b..a04e3542 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/clk_arb.h +++ b/drivers/gpu/nvgpu/include/nvgpu/clk_arb.h | |||
@@ -295,6 +295,8 @@ int nvgpu_clk_arb_worker_init(struct gk20a *g); | |||
295 | 295 | ||
296 | int nvgpu_clk_arb_init_arbiter(struct gk20a *g); | 296 | int nvgpu_clk_arb_init_arbiter(struct gk20a *g); |
297 | 297 | ||
298 | bool nvgpu_clk_arb_has_active_req(struct gk20a *g); | ||
299 | |||
298 | int nvgpu_clk_arb_get_arbiter_clk_range(struct gk20a *g, u32 api_domain, | 300 | int nvgpu_clk_arb_get_arbiter_clk_range(struct gk20a *g, u32 api_domain, |
299 | u16 *min_mhz, u16 *max_mhz); | 301 | u16 *min_mhz, u16 *max_mhz); |
300 | 302 | ||
diff --git a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h index b8ca5754..5f875707 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h | |||
@@ -1596,6 +1596,8 @@ struct gk20a { | |||
1596 | 1596 | ||
1597 | struct nvgpu_mutex clk_arb_enable_lock; | 1597 | struct nvgpu_mutex clk_arb_enable_lock; |
1598 | 1598 | ||
1599 | nvgpu_atomic_t clk_arb_global_nr; | ||
1600 | |||
1599 | struct gk20a_ce_app ce_app; | 1601 | struct gk20a_ce_app ce_app; |
1600 | 1602 | ||
1601 | bool ltc_intr_en_illegal_compstat; | 1603 | bool ltc_intr_en_illegal_compstat; |