video: rockchip: rga3: fixup rga load

Signed-off-by: Li Huang <putin.li@rock-chips.com>
Change-Id: Id09a22819f4d118d1702b6eb7299279f0bd3fcc8
This commit is contained in:
Li Huang
2022-01-20 20:45:19 +08:00
parent 3392d01212
commit ffcf7864ac
6 changed files with 35 additions and 22 deletions

View File

@@ -288,13 +288,18 @@ struct rga_job {
struct dma_fence *out_fence;
struct dma_fence *in_fence;
spinlock_t fence_lock;
/* job time stamp */
ktime_t timestamp;
ktime_t running_time;
/* The time when the job is actually executed on the hardware */
ktime_t hw_running_time;
/* The time only for hrtimer to calculate the load */
ktime_t hw_recoder_time;
unsigned int flags;
int ctx_id;
int priority;
int core;
int ret;
pid_t pid;
bool use_batch_mode;
};

View File

@@ -2271,11 +2271,11 @@ int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
pr_err("sys_ctrl = %x, int = %x, set cmd use time = %lld\n",
rga_read(RGA2_SYS_CTRL, scheduler),
rga_read(RGA2_INT, scheduler),
ktime_to_us(ktime_sub(now, job->running_time)));
ktime_us_delta(now, job->timestamp));
}
job->timestamp = now;
job->running_time = now;
job->hw_running_time = now;
job->hw_recoder_time = now;
rga_write(1, RGA2_CMD_CTRL, scheduler);

View File

@@ -1930,10 +1930,10 @@ int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
}
if (DEBUGGER_EN(TIME))
pr_err("set cmd use time = %lld\n", ktime_to_us(ktime_sub(now, job->running_time)));
pr_err("set cmd use time = %lld\n", ktime_us_delta(now, job->timestamp));
job->timestamp = now;
job->running_time = now;
job->hw_running_time = now;
job->hw_recoder_time = now;
rga_write(1, RGA3_SYS_CTRL, scheduler);

View File

@@ -160,7 +160,7 @@ static int rga_load_show(struct seq_file *m, void *data)
spin_unlock_irqrestore(&rga_scheduler->irq_lock, flags);
load = (busy_time_total * 100000 / RGA_LOAD_INTERVAL);
seq_printf(m, "load = %d", load);
seq_printf(m, "\t load = %d\n", load);
seq_printf(m, "-----------------------------------\n");
}
return 0;

View File

@@ -158,8 +158,8 @@ static enum hrtimer_restart hrtimer_handler(struct hrtimer *timer)
/* if timer action on job running */
job = scheduler->running_job;
if (job) {
scheduler->timer.busy_time += ktime_us_delta(now, job->timestamp);
job->timestamp = now;
scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time);
job->hw_recoder_time = now;
}
scheduler->timer.busy_time_record = scheduler->timer.busy_time;

View File

@@ -136,6 +136,13 @@ static void rga_job_free(struct rga_job *job)
static int rga_job_cleanup(struct rga_job *job)
{
ktime_t now = ktime_get();
if (DEBUGGER_EN(TIME)) {
pr_err("(pid:%d) job clean use time = %lld\n", job->pid,
ktime_us_delta(now, job->timestamp));
}
rga_job_free(job);
return 0;
@@ -214,7 +221,7 @@ static struct rga_job *rga_job_alloc(struct rga_req *rga_command_base)
INIT_LIST_HEAD(&job->head);
job->timestamp = ktime_get();
job->running_time = ktime_get();
job->pid = current->pid;
job->rga_command_base = *rga_command_base;
@@ -461,15 +468,16 @@ next_job:
static void rga_job_finish_and_next(struct rga_scheduler_t *rga_scheduler,
struct rga_job *job, int ret)
{
ktime_t now = ktime_get();
ktime_t now;
job->ret = ret;
if (DEBUGGER_EN(TIME))
pr_err("%s use time = %lld\n", __func__,
ktime_us_delta(now, job->running_time));
job->running_time = now;
if (DEBUGGER_EN(TIME)) {
now = ktime_get();
pr_err("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time));
pr_err("(pid:%d) job done use time = %lld\n", job->pid,
ktime_us_delta(now, job->timestamp));
}
if (job->core == RGA2_SCHEDULER_CORE0)
rga2_dma_flush_cache_for_virtual_address(&job->vir_page_table,
@@ -510,7 +518,7 @@ void rga_job_done(struct rga_scheduler_t *rga_scheduler, int ret)
job = rga_scheduler->running_job;
rga_scheduler->running_job = NULL;
rga_scheduler->timer.busy_time += ktime_us_delta(now, job->timestamp);
rga_scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time);
spin_unlock_irqrestore(&rga_scheduler->irq_lock, flags);
@@ -527,7 +535,7 @@ static void rga_job_timeout_clean(struct rga_scheduler_t *scheduler)
job = scheduler->running_job;
if (job && (job->flags & RGA_JOB_ASYNC) &&
(ktime_to_ms(ktime_sub(now, job->timestamp)) >= RGA_ASYNC_TIMEOUT_DELAY)) {
(ktime_ms_delta(now, job->hw_running_time) >= RGA_ASYNC_TIMEOUT_DELAY)) {
scheduler->running_job = NULL;
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
@@ -665,7 +673,7 @@ static inline int rga_job_wait(struct rga_scheduler_t *rga_scheduler,
if (DEBUGGER_EN(TIME))
pr_err("%s use time = %lld\n", __func__,
ktime_to_us(ktime_sub(now, job->running_time)));
ktime_us_delta(now, job->hw_running_time));
return ret;
}
@@ -682,7 +690,7 @@ static void rga_input_fence_signaled(struct dma_fence *fence,
if (DEBUGGER_EN(TIME))
pr_err("rga job wait in_fence signal use time = %lld\n",
ktime_to_us(ktime_sub(now, waiter->job->timestamp)));
ktime_us_delta(now, waiter->job->timestamp));
scheduler = rga_job_schedule(waiter->job);
@@ -882,7 +890,7 @@ void rga_internel_ctx_kref_release(struct kref *ref)
if (job->ctx_id == ctx->id) {
scheduler->running_job = NULL;
scheduler->timer.busy_time += ktime_us_delta(now, job->timestamp);
scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time);
need_reset = true;
}
}