perf_counters: make software counters work as per-cpu counters
authorPaul Mackerras <paulus@samba.org>
Mon, 9 Feb 2009 11:42:47 +0000 (22:42 +1100)
committerIngo Molnar <mingo@elte.hu>
Mon, 9 Feb 2009 11:47:16 +0000 (12:47 +0100)
commit23a185ca8abbeef64b6ffc33059b1d630e43ec10
treec5eb9454ff969377adb40532119240f6fc893fcb
parent82aa9a1829199233f9bdaf26e2ee271114f4701e
perf_counters: make software counters work as per-cpu counters

Impact: kernel crash fix

Yanmin Zhang reported that using a PERF_COUNT_TASK_CLOCK software
counter as a per-cpu counter would reliably crash the system, because
it calls __task_delta_exec with a null pointer.  The page fault,
context switch and cpu migration counters also won't function
correctly as per-cpu counters since they reference the current task.

This fixes the problem by redirecting the task_clock counter to the
cpu_clock counter when used as a per-cpu counter, and by implementing
per-cpu page fault, context switch and cpu migration counters.

Along the way, this:

- Initializes counter->ctx earlier, in perf_counter_alloc, so that
  sw_perf_counter_init can use it
- Adds code to kernel/sched.c to count task migrations into each
  cpu, in rq->nr_migrations_in
- Exports the per-cpu context switch and task migration counts
  via new functions added to kernel/sched.c
- Makes sure that if sw_perf_counter_init fails, we don't try to
  initialize the counter as a hardware counter.  Since the user has
  passed a negative, non-raw event type, they clearly don't intend
  for it to be interpreted as a hardware event.

Reported-by: "Zhang Yanmin" <yanmin_zhang@linux.intel.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/sched.h
kernel/perf_counter.c
kernel/sched.c