msm-4.14/include/linux/profile.h
Danny Lin c9239c927e
profiling: Implement a simple task exit notifier when disabled
Some kernel code currently depends on the profiling subsystem solely for
its task exit notifier. The rest of the profiling subsystem is left
unused.

Add a simple task exit notifier implemented in kernel/exit.c to make
such code work properly even when profiling is disabled. This will allow
unnecessary profiling code to be disabled without breakage.

Signed-off-by: Danny Lin <danny@kdrag0n.dev>
Signed-off-by: azrim <mirzaspc@gmail.com>
2022-04-26 15:05:23 +07:00

129 lines
2.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_PROFILE_H
#define _LINUX_PROFILE_H
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/cpumask.h>
#include <linux/cache.h>
#include <asm/errno.h>
#define CPU_PROFILING 1
#define SCHED_PROFILING 2
#define SLEEP_PROFILING 3
#define KVM_PROFILING 4
struct proc_dir_entry;
struct pt_regs;
struct notifier_block;
#if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
void create_prof_cpu_mask(void);
int create_proc_profile(void);
#else
static inline void create_prof_cpu_mask(void)
{
}
static inline int create_proc_profile(void)
{
return 0;
}
#endif
enum profile_type {
PROFILE_TASK_EXIT,
PROFILE_MUNMAP
};
#ifdef CONFIG_PROFILING
extern int prof_on __read_mostly;
/* init basic kernel profiler */
int profile_init(void);
int profile_setup(char *str);
void profile_tick(int type);
int setup_profiling_timer(unsigned int multiplier);
/*
* Add multiple profiler hits to a given address:
*/
void profile_hits(int type, void *ip, unsigned int nr_hits);
/*
* Single profiler hit:
*/
static inline void profile_hit(int type, void *ip)
{
/*
* Speedup for the common (no profiling enabled) case:
*/
if (unlikely(prof_on == type))
profile_hits(type, ip, 1);
}
struct task_struct;
struct mm_struct;
/* task is dead, free task struct ? Returns 1 if
* the task was taken, 0 if the task should be freed.
*/
int profile_handoff_task(struct task_struct * task);
/* sys_munmap */
void profile_munmap(unsigned long addr);
int task_handoff_register(struct notifier_block * n);
int task_handoff_unregister(struct notifier_block * n);
struct pt_regs;
#else
#define prof_on 0
static inline int profile_init(void)
{
return 0;
}
static inline void profile_tick(int type)
{
return;
}
static inline void profile_hits(int type, void *ip, unsigned int nr_hits)
{
return;
}
static inline void profile_hit(int type, void *ip)
{
return;
}
static inline int task_handoff_register(struct notifier_block * n)
{
return -ENOSYS;
}
static inline int task_handoff_unregister(struct notifier_block * n)
{
return -ENOSYS;
}
#define profile_handoff_task(a) (0)
#define profile_munmap(a) do { } while (0)
#endif /* CONFIG_PROFILING */
/* task is in do_exit() */
void profile_task_exit(struct task_struct * task);
int profile_event_register(enum profile_type, struct notifier_block * n);
int profile_event_unregister(enum profile_type, struct notifier_block * n);
#endif /* _LINUX_PROFILE_H */