• Paul Mackerras's avatar
    perf_counters: make software counters work as per-cpu counters · 23a185ca
    Paul Mackerras authored
    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: default avatar"Zhang Yanmin" <yanmin_zhang@linux.intel.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    23a185ca
perf_counter.c 51.6 KB