Re: [PATCH 3/5] cputime: allow irq time accounting to be selected as an option
From: kbuild test robot
Date: Sat Jun 25 2016 - 23:04:55 EST
Hi,
[auto build test WARNING on tip/sched/core]
[also build test WARNING on next-20160624]
[cannot apply to v4.7-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/riel-redhat-com/sched-time-fix-irq-time-accounting-with-nohz_idle/20160623-102923
config: x86_64-randconfig-a0-06260951 (attached as .config)
compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
In file included from include/linux/sched.h:17:0,
from kernel/sched/cputime.c:2:
kernel/sched/cputime.c: In function 'irqtime_account_hi_update':
include/linux/kernel.h:742:17: warning: comparison of distinct pointer types lacks a cast
(void) (&_min1 == &_min2); \
^
>> kernel/sched/cputime.c:92:17: note: in expansion of macro 'min'
irq_jiffies = min(max_jiffies, cputime_to_jiffies(irq));
^~~
kernel/sched/cputime.c: In function 'irqtime_account_si_update':
include/linux/kernel.h:742:17: warning: comparison of distinct pointer types lacks a cast
(void) (&_min1 == &_min2); \
^
kernel/sched/cputime.c:109:16: note: in expansion of macro 'min'
si_jiffies = min(max_jiffies, cputime_to_jiffies(softirq));
^~~
vim +/min +92 kernel/sched/cputime.c
73fbec604 Frederic Weisbecker 2012-06-16 1 #include <linux/export.h>
73fbec604 Frederic Weisbecker 2012-06-16 @2 #include <linux/sched.h>
73fbec604 Frederic Weisbecker 2012-06-16 3 #include <linux/tsacct_kern.h>
73fbec604 Frederic Weisbecker 2012-06-16 4 #include <linux/kernel_stat.h>
73fbec604 Frederic Weisbecker 2012-06-16 5 #include <linux/static_key.h>
abf917cd9 Frederic Weisbecker 2012-07-25 6 #include <linux/context_tracking.h>
73fbec604 Frederic Weisbecker 2012-06-16 7 #include "sched.h"
1fe7c4ef8 Stefano Stabellini 2015-11-10 8 #ifdef CONFIG_PARAVIRT
1fe7c4ef8 Stefano Stabellini 2015-11-10 9 #include <asm/paravirt.h>
1fe7c4ef8 Stefano Stabellini 2015-11-10 10 #endif
73fbec604 Frederic Weisbecker 2012-06-16 11
73fbec604 Frederic Weisbecker 2012-06-16 12
73fbec604 Frederic Weisbecker 2012-06-16 13 #ifdef CONFIG_IRQ_TIME_ACCOUNTING
73fbec604 Frederic Weisbecker 2012-06-16 14
73fbec604 Frederic Weisbecker 2012-06-16 15 /*
73fbec604 Frederic Weisbecker 2012-06-16 16 * There are no locks covering percpu hardirq/softirq time.
bf9fae9f5 Frederic Weisbecker 2012-09-08 17 * They are only modified in vtime_account, on corresponding CPU
73fbec604 Frederic Weisbecker 2012-06-16 18 * with interrupts disabled. So, writes are safe.
73fbec604 Frederic Weisbecker 2012-06-16 19 * They are read and saved off onto struct rq in update_rq_clock().
73fbec604 Frederic Weisbecker 2012-06-16 20 * This may result in other CPU reading this CPU's irq time and can
bf9fae9f5 Frederic Weisbecker 2012-09-08 21 * race with irq/vtime_account on this CPU. We would either get old
73fbec604 Frederic Weisbecker 2012-06-16 22 * or new value with a side effect of accounting a slice of irq time to wrong
73fbec604 Frederic Weisbecker 2012-06-16 23 * task when irq is in progress while we read rq->clock. That is a worthy
73fbec604 Frederic Weisbecker 2012-06-16 24 * compromise in place of having locks on each irq in account_system_time.
73fbec604 Frederic Weisbecker 2012-06-16 25 */
73fbec604 Frederic Weisbecker 2012-06-16 26 DEFINE_PER_CPU(u64, cpu_hardirq_time);
73fbec604 Frederic Weisbecker 2012-06-16 27 DEFINE_PER_CPU(u64, cpu_softirq_time);
73fbec604 Frederic Weisbecker 2012-06-16 28
73fbec604 Frederic Weisbecker 2012-06-16 29 static DEFINE_PER_CPU(u64, irq_start_time);
73fbec604 Frederic Weisbecker 2012-06-16 30 static int sched_clock_irqtime;
73fbec604 Frederic Weisbecker 2012-06-16 31
73fbec604 Frederic Weisbecker 2012-06-16 32 void enable_sched_clock_irqtime(void)
73fbec604 Frederic Weisbecker 2012-06-16 33 {
73fbec604 Frederic Weisbecker 2012-06-16 34 sched_clock_irqtime = 1;
73fbec604 Frederic Weisbecker 2012-06-16 35 }
73fbec604 Frederic Weisbecker 2012-06-16 36
73fbec604 Frederic Weisbecker 2012-06-16 37 void disable_sched_clock_irqtime(void)
73fbec604 Frederic Weisbecker 2012-06-16 38 {
73fbec604 Frederic Weisbecker 2012-06-16 39 sched_clock_irqtime = 0;
73fbec604 Frederic Weisbecker 2012-06-16 40 }
73fbec604 Frederic Weisbecker 2012-06-16 41
73fbec604 Frederic Weisbecker 2012-06-16 42 #ifndef CONFIG_64BIT
73fbec604 Frederic Weisbecker 2012-06-16 43 DEFINE_PER_CPU(seqcount_t, irq_time_seq);
73fbec604 Frederic Weisbecker 2012-06-16 44 #endif /* CONFIG_64BIT */
73fbec604 Frederic Weisbecker 2012-06-16 45
73fbec604 Frederic Weisbecker 2012-06-16 46 /*
73fbec604 Frederic Weisbecker 2012-06-16 47 * Called before incrementing preempt_count on {soft,}irq_enter
73fbec604 Frederic Weisbecker 2012-06-16 48 * and before decrementing preempt_count on {soft,}irq_exit.
73fbec604 Frederic Weisbecker 2012-06-16 49 */
3e1df4f50 Frederic Weisbecker 2012-10-06 50 void irqtime_account_irq(struct task_struct *curr)
73fbec604 Frederic Weisbecker 2012-06-16 51 {
73fbec604 Frederic Weisbecker 2012-06-16 52 unsigned long flags;
73fbec604 Frederic Weisbecker 2012-06-16 53 s64 delta;
73fbec604 Frederic Weisbecker 2012-06-16 54 int cpu;
73fbec604 Frederic Weisbecker 2012-06-16 55
73fbec604 Frederic Weisbecker 2012-06-16 56 if (!sched_clock_irqtime)
73fbec604 Frederic Weisbecker 2012-06-16 57 return;
73fbec604 Frederic Weisbecker 2012-06-16 58
73fbec604 Frederic Weisbecker 2012-06-16 59 local_irq_save(flags);
73fbec604 Frederic Weisbecker 2012-06-16 60
73fbec604 Frederic Weisbecker 2012-06-16 61 cpu = smp_processor_id();
73fbec604 Frederic Weisbecker 2012-06-16 62 delta = sched_clock_cpu(cpu) - __this_cpu_read(irq_start_time);
73fbec604 Frederic Weisbecker 2012-06-16 63 __this_cpu_add(irq_start_time, delta);
73fbec604 Frederic Weisbecker 2012-06-16 64
73fbec604 Frederic Weisbecker 2012-06-16 65 irq_time_write_begin();
73fbec604 Frederic Weisbecker 2012-06-16 66 /*
73fbec604 Frederic Weisbecker 2012-06-16 67 * We do not account for softirq time from ksoftirqd here.
73fbec604 Frederic Weisbecker 2012-06-16 68 * We want to continue accounting softirq time to ksoftirqd thread
73fbec604 Frederic Weisbecker 2012-06-16 69 * in that case, so as not to confuse scheduler with a special task
73fbec604 Frederic Weisbecker 2012-06-16 70 * that do not consume any time, but still wants to run.
73fbec604 Frederic Weisbecker 2012-06-16 71 */
73fbec604 Frederic Weisbecker 2012-06-16 72 if (hardirq_count())
73fbec604 Frederic Weisbecker 2012-06-16 73 __this_cpu_add(cpu_hardirq_time, delta);
73fbec604 Frederic Weisbecker 2012-06-16 74 else if (in_serving_softirq() && curr != this_cpu_ksoftirqd())
73fbec604 Frederic Weisbecker 2012-06-16 75 __this_cpu_add(cpu_softirq_time, delta);
73fbec604 Frederic Weisbecker 2012-06-16 76
73fbec604 Frederic Weisbecker 2012-06-16 77 irq_time_write_end();
73fbec604 Frederic Weisbecker 2012-06-16 78 local_irq_restore(flags);
73fbec604 Frederic Weisbecker 2012-06-16 79 }
3e1df4f50 Frederic Weisbecker 2012-10-06 80 EXPORT_SYMBOL_GPL(irqtime_account_irq);
73fbec604 Frederic Weisbecker 2012-06-16 81
ad7578c31 Rik van Riel 2016-06-22 82 static unsigned long irqtime_account_hi_update(unsigned long max_jiffies)
73fbec604 Frederic Weisbecker 2012-06-16 83 {
73fbec604 Frederic Weisbecker 2012-06-16 84 u64 *cpustat = kcpustat_this_cpu->cpustat;
ad7578c31 Rik van Riel 2016-06-22 85 unsigned long irq_jiffies = 0;
73fbec604 Frederic Weisbecker 2012-06-16 86 unsigned long flags;
ad7578c31 Rik van Riel 2016-06-22 87 u64 irq;
73fbec604 Frederic Weisbecker 2012-06-16 88
73fbec604 Frederic Weisbecker 2012-06-16 89 local_irq_save(flags);
ad7578c31 Rik van Riel 2016-06-22 90 irq = this_cpu_read(cpu_hardirq_time) - cpustat[CPUTIME_IRQ];
ad7578c31 Rik van Riel 2016-06-22 91 if (irq > cputime_one_jiffy) {
ad7578c31 Rik van Riel 2016-06-22 @92 irq_jiffies = min(max_jiffies, cputime_to_jiffies(irq));
ad7578c31 Rik van Riel 2016-06-22 93 cpustat[CPUTIME_IRQ] += jiffies_to_cputime(irq_jiffies);
ad7578c31 Rik van Riel 2016-06-22 94 }
73fbec604 Frederic Weisbecker 2012-06-16 95 local_irq_restore(flags);
:::::: The code at line 92 was first introduced by commit
:::::: ad7578c312973ca898de22b799774bd08ffe819f sched,time: count actually elapsed irq & softirq time
:::::: TO: Rik van Riel <riel@xxxxxxxxxx>
:::::: CC: 0day robot <fengguang.wu@xxxxxxxxx>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: Binary data