|
@@ -44,6 +44,7 @@ void disable_sched_clock_irqtime(void)
|
|
|
void irqtime_account_irq(struct task_struct *curr)
|
|
|
{
|
|
|
struct irqtime *irqtime = this_cpu_ptr(&cpu_irqtime);
|
|
|
+ u64 *cpustat = kcpustat_this_cpu->cpustat;
|
|
|
s64 delta;
|
|
|
int cpu;
|
|
|
|
|
@@ -61,49 +62,35 @@ void irqtime_account_irq(struct task_struct *curr)
|
|
|
* in that case, so as not to confuse scheduler with a special task
|
|
|
* that do not consume any time, but still wants to run.
|
|
|
*/
|
|
|
- if (hardirq_count())
|
|
|
- irqtime->hardirq_time += delta;
|
|
|
- else if (in_serving_softirq() && curr != this_cpu_ksoftirqd())
|
|
|
- irqtime->softirq_time += delta;
|
|
|
+ if (hardirq_count()) {
|
|
|
+ cpustat[CPUTIME_IRQ] += delta;
|
|
|
+ irqtime->tick_delta += delta;
|
|
|
+ } else if (in_serving_softirq() && curr != this_cpu_ksoftirqd()) {
|
|
|
+ cpustat[CPUTIME_SOFTIRQ] += delta;
|
|
|
+ irqtime->tick_delta += delta;
|
|
|
+ }
|
|
|
|
|
|
u64_stats_update_end(&irqtime->sync);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(irqtime_account_irq);
|
|
|
|
|
|
-static cputime_t irqtime_account_update(u64 irqtime, int idx, cputime_t maxtime)
|
|
|
+static cputime_t irqtime_tick_accounted(cputime_t maxtime)
|
|
|
{
|
|
|
- u64 *cpustat = kcpustat_this_cpu->cpustat;
|
|
|
- cputime_t irq_cputime;
|
|
|
-
|
|
|
- irq_cputime = nsecs_to_cputime64(irqtime - cpustat[idx]);
|
|
|
- irq_cputime = min(irq_cputime, maxtime);
|
|
|
- cpustat[idx] += cputime_to_nsecs(irq_cputime);
|
|
|
-
|
|
|
- return irq_cputime;
|
|
|
-}
|
|
|
+ struct irqtime *irqtime = this_cpu_ptr(&cpu_irqtime);
|
|
|
+ cputime_t delta;
|
|
|
|
|
|
-static cputime_t irqtime_account_hi_update(cputime_t maxtime)
|
|
|
-{
|
|
|
- return irqtime_account_update(__this_cpu_read(cpu_irqtime.hardirq_time),
|
|
|
- CPUTIME_IRQ, maxtime);
|
|
|
-}
|
|
|
+ delta = nsecs_to_cputime(irqtime->tick_delta);
|
|
|
+ delta = min(delta, maxtime);
|
|
|
+ irqtime->tick_delta -= cputime_to_nsecs(delta);
|
|
|
|
|
|
-static cputime_t irqtime_account_si_update(cputime_t maxtime)
|
|
|
-{
|
|
|
- return irqtime_account_update(__this_cpu_read(cpu_irqtime.softirq_time),
|
|
|
- CPUTIME_SOFTIRQ, maxtime);
|
|
|
+ return delta;
|
|
|
}
|
|
|
|
|
|
#else /* CONFIG_IRQ_TIME_ACCOUNTING */
|
|
|
|
|
|
#define sched_clock_irqtime (0)
|
|
|
|
|
|
-static cputime_t irqtime_account_hi_update(cputime_t dummy)
|
|
|
-{
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static cputime_t irqtime_account_si_update(cputime_t dummy)
|
|
|
+static cputime_t irqtime_tick_accounted(cputime_t dummy)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
@@ -280,10 +267,7 @@ static inline cputime_t account_other_time(cputime_t max)
|
|
|
accounted = steal_account_process_time(max);
|
|
|
|
|
|
if (accounted < max)
|
|
|
- accounted += irqtime_account_hi_update(max - accounted);
|
|
|
-
|
|
|
- if (accounted < max)
|
|
|
- accounted += irqtime_account_si_update(max - accounted);
|
|
|
+ accounted += irqtime_tick_accounted(max - accounted);
|
|
|
|
|
|
return accounted;
|
|
|
}
|