linux/include/linux/profile.h
<<
>>
Prefs
   1#ifndef _LINUX_PROFILE_H
   2#define _LINUX_PROFILE_H
   3
   4#include <linux/kernel.h>
   5#include <linux/init.h>
   6#include <linux/cpumask.h>
   7#include <linux/cache.h>
   8
   9#include <asm/errno.h>
  10
  11#define CPU_PROFILING   1
  12#define SCHED_PROFILING 2
  13#define SLEEP_PROFILING 3
  14#define KVM_PROFILING   4
  15
  16struct proc_dir_entry;
  17struct pt_regs;
  18struct notifier_block;
  19
  20#if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
  21void create_prof_cpu_mask(struct proc_dir_entry *de);
  22int create_proc_profile(void);
  23#else
  24static inline void create_prof_cpu_mask(struct proc_dir_entry *de)
  25{
  26}
  27
  28static inline int create_proc_profile(void)
  29{
  30        return 0;
  31}
  32#endif
  33
  34enum profile_type {
  35        PROFILE_TASK_EXIT,
  36        PROFILE_MUNMAP
  37};
  38
  39#ifdef CONFIG_PROFILING
  40
  41extern int prof_on __read_mostly;
  42
  43/* init basic kernel profiler */
  44int profile_init(void);
  45int profile_setup(char *str);
  46void profile_tick(int type);
  47
  48/*
  49 * Add multiple profiler hits to a given address:
  50 */
  51void profile_hits(int type, void *ip, unsigned int nr_hits);
  52
  53/*
  54 * Single profiler hit:
  55 */
  56static inline void profile_hit(int type, void *ip)
  57{
  58        /*
  59         * Speedup for the common (no profiling enabled) case:
  60         */
  61        if (unlikely(prof_on == type))
  62                profile_hits(type, ip, 1);
  63}
  64
  65struct task_struct;
  66struct mm_struct;
  67
  68/* task is in do_exit() */
  69void profile_task_exit(struct task_struct * task);
  70
  71/* task is dead, free task struct ? Returns 1 if
  72 * the task was taken, 0 if the task should be freed.
  73 */
  74int profile_handoff_task(struct task_struct * task);
  75
  76/* sys_munmap */
  77void profile_munmap(unsigned long addr);
  78
  79int task_handoff_register(struct notifier_block * n);
  80int task_handoff_unregister(struct notifier_block * n);
  81
  82int profile_event_register(enum profile_type, struct notifier_block * n);
  83int profile_event_unregister(enum profile_type, struct notifier_block * n);
  84
  85int register_timer_hook(int (*hook)(struct pt_regs *));
  86void unregister_timer_hook(int (*hook)(struct pt_regs *));
  87
  88struct pt_regs;
  89
  90#else
  91
  92#define prof_on 0
  93
  94static inline int profile_init(void)
  95{
  96        return 0;
  97}
  98
  99static inline void profile_tick(int type)
 100{
 101        return;
 102}
 103
 104static inline void profile_hits(int type, void *ip, unsigned int nr_hits)
 105{
 106        return;
 107}
 108
 109static inline void profile_hit(int type, void *ip)
 110{
 111        return;
 112}
 113
 114static inline int task_handoff_register(struct notifier_block * n)
 115{
 116        return -ENOSYS;
 117}
 118
 119static inline int task_handoff_unregister(struct notifier_block * n)
 120{
 121        return -ENOSYS;
 122}
 123
 124static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
 125{
 126        return -ENOSYS;
 127}
 128
 129static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
 130{
 131        return -ENOSYS;
 132}
 133
 134#define profile_task_exit(a) do { } while (0)
 135#define profile_handoff_task(a) (0)
 136#define profile_munmap(a) do { } while (0)
 137
 138static inline int register_timer_hook(int (*hook)(struct pt_regs *))
 139{
 140        return -ENOSYS;
 141}
 142
 143static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
 144{
 145        return;
 146}
 147
 148#endif /* CONFIG_PROFILING */
 149
 150#endif /* _LINUX_PROFILE_H */
 151