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>
This commit is contained in:
Debarshi Dutta
2018-08-08 17:36:01 +05:30
committed by mobile promotions
parent 519948a9c6
commit 85c323c3e8
9 changed files with 33 additions and 2 deletions

View File

@@ -17,6 +17,7 @@
#include <linux/seq_file.h>
#include <nvgpu/io.h>
#include <nvgpu/clk_arb.h>
#include "gm20b/clk_gm20b.h"
#include "os_linux.h"
@@ -33,6 +34,8 @@ static int rate_get(void *data, u64 *val)
static int rate_set(void *data, u64 val)
{
struct gk20a *g = (struct gk20a *)data;
if (nvgpu_clk_arb_has_active_req(g))
return 0;
return g->ops.clk.set_rate(g, CTRL_CLK_DOMAIN_GPCCLK, (u32)val);
}
DEFINE_SIMPLE_ATTRIBUTE(rate_fops, rate_get, rate_set, "%llu\n");

View File

@@ -66,6 +66,9 @@ static void nvgpu_init_vars(struct gk20a *g)
nvgpu_mutex_init(&g->tpc_pg_lock);
nvgpu_mutex_init(&g->clk_arb_enable_lock);
/* Init the clock req count to 0 */
nvgpu_atomic_set(&g->clk_arb_global_nr, 0);
l->regs_saved = l->regs;
l->bar1_saved = l->bar1;

View File

@@ -436,6 +436,7 @@ int nvgpu_clk_arb_commit_request_fd(struct gk20a *g,
clk_arb_dbg(g, "requested target = %u\n",
(u32)dev->gpc2clk_target_mhz);
nvgpu_atomic_inc(&g->clk_arb_global_nr);
nvgpu_ref_get(&dev->refcount);
nvgpu_spinlock_acquire(&session->session_lock);
nvgpu_list_add(&dev->node, &session->targets);

View File

@@ -25,6 +25,7 @@
#include <nvgpu/kmem.h>
#include <nvgpu/log.h>
#include <nvgpu/clk_arb.h>
#include "gk20a/gk20a.h"
#include "platform_gk20a.h"
@@ -154,6 +155,8 @@ static int gk20a_scale_target(struct device *dev, unsigned long *freq,
unsigned long rounded_rate;
unsigned long min_freq = 0, max_freq = 0;
if (nvgpu_clk_arb_has_active_req(g))
return 0;
/*
* Calculate floor and cap frequency values
*