diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-arm/ftrace.h | 14 | ||||
| -rw-r--r-- | include/asm-arm/kprobes.h | 1 | ||||
| -rw-r--r-- | include/asm-powerpc/ftrace.h | 14 | ||||
| -rw-r--r-- | include/asm-powerpc/hw_irq.h | 10 | ||||
| -rw-r--r-- | include/asm-sparc64/ftrace.h | 14 | ||||
| -rw-r--r-- | include/asm-x86/alternative.h | 2 | ||||
| -rw-r--r-- | include/asm-x86/ftrace.h | 14 | ||||
| -rw-r--r-- | include/asm-x86/irqflags.h | 24 | ||||
| -rw-r--r-- | include/asm-x86/vsyscall.h | 3 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 144 | ||||
| -rw-r--r-- | include/linux/irqflags.h | 13 | ||||
| -rw-r--r-- | include/linux/kprobes.h | 4 | ||||
| -rw-r--r-- | include/linux/linkage.h | 2 | ||||
| -rw-r--r-- | include/linux/marker.h | 40 | ||||
| -rw-r--r-- | include/linux/mmiotrace.h | 85 | ||||
| -rw-r--r-- | include/linux/preempt.h | 34 | ||||
| -rw-r--r-- | include/linux/sched.h | 16 | ||||
| -rw-r--r-- | include/linux/writeback.h | 2 | 
18 files changed, 399 insertions, 37 deletions
diff --git a/include/asm-arm/ftrace.h b/include/asm-arm/ftrace.h new file mode 100644 index 00000000000..584ef9a8e5a --- /dev/null +++ b/include/asm-arm/ftrace.h @@ -0,0 +1,14 @@ +#ifndef _ASM_ARM_FTRACE +#define _ASM_ARM_FTRACE + +#ifdef CONFIG_FTRACE +#define MCOUNT_ADDR		((long)(mcount)) +#define MCOUNT_INSN_SIZE	4 /* sizeof mcount call */ + +#ifndef __ASSEMBLY__ +extern void mcount(void); +#endif + +#endif + +#endif /* _ASM_ARM_FTRACE */ diff --git a/include/asm-arm/kprobes.h b/include/asm-arm/kprobes.h index c042194d3ab..b1a37876942 100644 --- a/include/asm-arm/kprobes.h +++ b/include/asm-arm/kprobes.h @@ -59,6 +59,7 @@ struct kprobe_ctlblk {  };  void arch_remove_kprobe(struct kprobe *); +void kretprobe_trampoline(void);  int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr);  int kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr); diff --git a/include/asm-powerpc/ftrace.h b/include/asm-powerpc/ftrace.h new file mode 100644 index 00000000000..de921326cca --- /dev/null +++ b/include/asm-powerpc/ftrace.h @@ -0,0 +1,14 @@ +#ifndef _ASM_POWERPC_FTRACE +#define _ASM_POWERPC_FTRACE + +#ifdef CONFIG_FTRACE +#define MCOUNT_ADDR		((long)(_mcount)) +#define MCOUNT_INSN_SIZE	4 /* sizeof mcount call */ + +#ifndef __ASSEMBLY__ +extern void _mcount(void); +#endif + +#endif + +#endif /* _ASM_POWERPC_FTRACE */ diff --git a/include/asm-powerpc/hw_irq.h b/include/asm-powerpc/hw_irq.h index ad8c9f7fd0e..f75a5fc64d2 100644 --- a/include/asm-powerpc/hw_irq.h +++ b/include/asm-powerpc/hw_irq.h @@ -59,6 +59,11 @@ extern void iseries_handle_interrupts(void);  		get_paca()->hard_enabled = 0;	\  	} while(0) +static inline int irqs_disabled_flags(unsigned long flags) +{ +	return flags == 0; +} +  #else  #if defined(CONFIG_BOOKE) @@ -113,6 +118,11 @@ static inline void local_irq_save_ptr(unsigned long *flags)  #define hard_irq_enable()	local_irq_enable()  #define hard_irq_disable()	local_irq_disable() +static inline int irqs_disabled_flags(unsigned long flags) +{ +	return (flags & MSR_EE) == 0; +} +  #endif /* CONFIG_PPC64 */  /* diff --git a/include/asm-sparc64/ftrace.h b/include/asm-sparc64/ftrace.h new file mode 100644 index 00000000000..d27716cd38c --- /dev/null +++ b/include/asm-sparc64/ftrace.h @@ -0,0 +1,14 @@ +#ifndef _ASM_SPARC64_FTRACE +#define _ASM_SPARC64_FTRACE + +#ifdef CONFIG_MCOUNT +#define MCOUNT_ADDR		((long)(_mcount)) +#define MCOUNT_INSN_SIZE	4 /* sizeof mcount call */ + +#ifndef __ASSEMBLY__ +extern void _mcount(void); +#endif + +#endif + +#endif /* _ASM_SPARC64_FTRACE */ diff --git a/include/asm-x86/alternative.h b/include/asm-x86/alternative.h index 1f6a9ca1012..f6aa18eadf7 100644 --- a/include/asm-x86/alternative.h +++ b/include/asm-x86/alternative.h @@ -72,6 +72,8 @@ static inline void alternatives_smp_module_del(struct module *mod) {}  static inline void alternatives_smp_switch(int smp) {}  #endif	/* CONFIG_SMP */ +const unsigned char *const *find_nop_table(void); +  /*   * Alternative instructions for different CPU types or capabilities.   * diff --git a/include/asm-x86/ftrace.h b/include/asm-x86/ftrace.h new file mode 100644 index 00000000000..c184441133f --- /dev/null +++ b/include/asm-x86/ftrace.h @@ -0,0 +1,14 @@ +#ifndef _ASM_X86_FTRACE +#define _ASM_SPARC64_FTRACE + +#ifdef CONFIG_FTRACE +#define MCOUNT_ADDR		((long)(mcount)) +#define MCOUNT_INSN_SIZE	5 /* sizeof mcount call */ + +#ifndef __ASSEMBLY__ +extern void mcount(void); +#endif + +#endif /* CONFIG_FTRACE */ + +#endif /* _ASM_X86_FTRACE */ diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h index 17e7a1701c9..424acb48cd6 100644 --- a/include/asm-x86/irqflags.h +++ b/include/asm-x86/irqflags.h @@ -190,8 +190,6 @@ static inline void trace_hardirqs_fixup(void)  #else  #ifdef CONFIG_X86_64 -#define ARCH_TRACE_IRQS_ON		call trace_hardirqs_on_thunk -#define ARCH_TRACE_IRQS_OFF		call trace_hardirqs_off_thunk  #define ARCH_LOCKDEP_SYS_EXIT		call lockdep_sys_exit_thunk  #define ARCH_LOCKDEP_SYS_EXIT_IRQ	\  	TRACE_IRQS_ON; \ @@ -203,24 +201,6 @@ static inline void trace_hardirqs_fixup(void)  	TRACE_IRQS_OFF;  #else -#define ARCH_TRACE_IRQS_ON			\ -	pushl %eax;				\ -	pushl %ecx;				\ -	pushl %edx;				\ -	call trace_hardirqs_on;			\ -	popl %edx;				\ -	popl %ecx;				\ -	popl %eax; - -#define ARCH_TRACE_IRQS_OFF			\ -	pushl %eax;				\ -	pushl %ecx;				\ -	pushl %edx;				\ -	call trace_hardirqs_off;		\ -	popl %edx;				\ -	popl %ecx;				\ -	popl %eax; -  #define ARCH_LOCKDEP_SYS_EXIT			\  	pushl %eax;				\  	pushl %ecx;				\ @@ -234,8 +214,8 @@ static inline void trace_hardirqs_fixup(void)  #endif  #ifdef CONFIG_TRACE_IRQFLAGS -#  define TRACE_IRQS_ON		ARCH_TRACE_IRQS_ON -#  define TRACE_IRQS_OFF	ARCH_TRACE_IRQS_OFF +#  define TRACE_IRQS_ON		call trace_hardirqs_on_thunk; +#  define TRACE_IRQS_OFF	call trace_hardirqs_off_thunk;  #else  #  define TRACE_IRQS_ON  #  define TRACE_IRQS_OFF diff --git a/include/asm-x86/vsyscall.h b/include/asm-x86/vsyscall.h index 17b3700949b..6b66ff905af 100644 --- a/include/asm-x86/vsyscall.h +++ b/include/asm-x86/vsyscall.h @@ -24,7 +24,8 @@ enum vsyscall_num {  	((unused, __section__ (".vsyscall_gtod_data"),aligned(16)))  #define __section_vsyscall_clock __attribute__ \  	((unused, __section__ (".vsyscall_clock"),aligned(16))) -#define __vsyscall_fn __attribute__ ((unused,__section__(".vsyscall_fn"))) +#define __vsyscall_fn \ +	__attribute__ ((unused, __section__(".vsyscall_fn"))) notrace  #define VGETCPU_RDTSCP	1  #define VGETCPU_LSL	2 diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h new file mode 100644 index 00000000000..f368d041e02 --- /dev/null +++ b/include/linux/ftrace.h @@ -0,0 +1,144 @@ +#ifndef _LINUX_FTRACE_H +#define _LINUX_FTRACE_H + +#ifdef CONFIG_FTRACE + +#include <linux/linkage.h> +#include <linux/fs.h> + +extern int ftrace_enabled; +extern int +ftrace_enable_sysctl(struct ctl_table *table, int write, +		     struct file *filp, void __user *buffer, size_t *lenp, +		     loff_t *ppos); + +typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip); + +struct ftrace_ops { +	ftrace_func_t	  func; +	struct ftrace_ops *next; +}; + +/* + * The ftrace_ops must be a static and should also + * be read_mostly.  These functions do modify read_mostly variables + * so use them sparely. Never free an ftrace_op or modify the + * next pointer after it has been registered. Even after unregistering + * it, the next pointer may still be used internally. + */ +int register_ftrace_function(struct ftrace_ops *ops); +int unregister_ftrace_function(struct ftrace_ops *ops); +void clear_ftrace_function(void); + +extern void ftrace_stub(unsigned long a0, unsigned long a1); + +#else /* !CONFIG_FTRACE */ +# define register_ftrace_function(ops) do { } while (0) +# define unregister_ftrace_function(ops) do { } while (0) +# define clear_ftrace_function(ops) do { } while (0) +#endif /* CONFIG_FTRACE */ + +#ifdef CONFIG_DYNAMIC_FTRACE +# define FTRACE_HASHBITS	10 +# define FTRACE_HASHSIZE	(1<<FTRACE_HASHBITS) + +enum { +	FTRACE_FL_FREE		= (1 << 0), +	FTRACE_FL_FAILED	= (1 << 1), +	FTRACE_FL_FILTER	= (1 << 2), +	FTRACE_FL_ENABLED	= (1 << 3), +	FTRACE_FL_NOTRACE	= (1 << 4), +	FTRACE_FL_CONVERTED	= (1 << 5), +	FTRACE_FL_FROZEN	= (1 << 6), +}; + +struct dyn_ftrace { +	struct hlist_node node; +	unsigned long	  ip; /* address of mcount call-site */ +	unsigned long	  flags; +}; + +int ftrace_force_update(void); +void ftrace_set_filter(unsigned char *buf, int len, int reset); + +/* defined in arch */ +extern int ftrace_ip_converted(unsigned long ip); +extern unsigned char *ftrace_nop_replace(void); +extern unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr); +extern int ftrace_dyn_arch_init(void *data); +extern int ftrace_mcount_set(unsigned long *data); +extern int ftrace_modify_code(unsigned long ip, unsigned char *old_code, +			      unsigned char *new_code); +extern int ftrace_update_ftrace_func(ftrace_func_t func); +extern void ftrace_caller(void); +extern void ftrace_call(void); +extern void mcount_call(void); + +extern int skip_trace(unsigned long ip); + +void ftrace_disable_daemon(void); +void ftrace_enable_daemon(void); + +#else +# define skip_trace(ip)				({ 0; }) +# define ftrace_force_update()			({ 0; }) +# define ftrace_set_filter(buf, len, reset)	do { } while (0) +# define ftrace_disable_daemon()		do { } while (0) +# define ftrace_enable_daemon()			do { } while (0) +#endif /* CONFIG_DYNAMIC_FTRACE */ + +/* totally disable ftrace - can not re-enable after this */ +void ftrace_kill(void); +void ftrace_kill_atomic(void); + +static inline void tracer_disable(void) +{ +#ifdef CONFIG_FTRACE +	ftrace_enabled = 0; +#endif +} + +#ifdef CONFIG_FRAME_POINTER +/* TODO: need to fix this for ARM */ +# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) +# define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1)) +# define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2)) +# define CALLER_ADDR3 ((unsigned long)__builtin_return_address(3)) +# define CALLER_ADDR4 ((unsigned long)__builtin_return_address(4)) +# define CALLER_ADDR5 ((unsigned long)__builtin_return_address(5)) +# define CALLER_ADDR6 ((unsigned long)__builtin_return_address(6)) +#else +# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) +# define CALLER_ADDR1 0UL +# define CALLER_ADDR2 0UL +# define CALLER_ADDR3 0UL +# define CALLER_ADDR4 0UL +# define CALLER_ADDR5 0UL +# define CALLER_ADDR6 0UL +#endif + +#ifdef CONFIG_IRQSOFF_TRACER +  extern void time_hardirqs_on(unsigned long a0, unsigned long a1); +  extern void time_hardirqs_off(unsigned long a0, unsigned long a1); +#else +# define time_hardirqs_on(a0, a1)		do { } while (0) +# define time_hardirqs_off(a0, a1)		do { } while (0) +#endif + +#ifdef CONFIG_PREEMPT_TRACER +  extern void trace_preempt_on(unsigned long a0, unsigned long a1); +  extern void trace_preempt_off(unsigned long a0, unsigned long a1); +#else +# define trace_preempt_on(a0, a1)		do { } while (0) +# define trace_preempt_off(a0, a1)		do { } while (0) +#endif + +#ifdef CONFIG_TRACING +extern void +ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3); +#else +static inline void +ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { } +#endif + +#endif /* _LINUX_FTRACE_H */ diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h index e600c4e9b8c..2b1c2e58566 100644 --- a/include/linux/irqflags.h +++ b/include/linux/irqflags.h @@ -12,10 +12,10 @@  #define _LINUX_TRACE_IRQFLAGS_H  #ifdef CONFIG_TRACE_IRQFLAGS -  extern void trace_hardirqs_on(void); -  extern void trace_hardirqs_off(void);    extern void trace_softirqs_on(unsigned long ip);    extern void trace_softirqs_off(unsigned long ip); +  extern void trace_hardirqs_on(void); +  extern void trace_hardirqs_off(void);  # define trace_hardirq_context(p)	((p)->hardirq_context)  # define trace_softirq_context(p)	((p)->softirq_context)  # define trace_hardirqs_enabled(p)	((p)->hardirqs_enabled) @@ -41,6 +41,15 @@  # define INIT_TRACE_IRQFLAGS  #endif +#if defined(CONFIG_IRQSOFF_TRACER) || \ +	defined(CONFIG_PREEMPT_TRACER) + extern void stop_critical_timings(void); + extern void start_critical_timings(void); +#else +# define stop_critical_timings() do { } while (0) +# define start_critical_timings() do { } while (0) +#endif +  #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT  #include <asm/irqflags.h> diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 1036631ff4f..04a3556bdea 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -259,6 +259,10 @@ void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);  struct jprobe;  struct kretprobe; +static inline struct kprobe *get_kprobe(void *addr) +{ +	return NULL; +}  static inline struct kprobe *kprobe_running(void)  {  	return NULL; diff --git a/include/linux/linkage.h b/include/linux/linkage.h index 9fd1f859021..56ba3739465 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -4,6 +4,8 @@  #include <linux/compiler.h>  #include <asm/linkage.h> +#define notrace __attribute__((no_instrument_function)) +  #ifdef __cplusplus  #define CPP_ASMLINKAGE extern "C"  #else diff --git a/include/linux/marker.h b/include/linux/marker.h index 430f6adf976..1290653f924 100644 --- a/include/linux/marker.h +++ b/include/linux/marker.h @@ -44,8 +44,8 @@ struct marker {  				 */  	char state;		/* Marker state. */  	char ptype;		/* probe type : 0 : single, 1 : multi */ -	void (*call)(const struct marker *mdata,	/* Probe wrapper */ -		void *call_private, const char *fmt, ...); +				/* Probe wrapper */ +	void (*call)(const struct marker *mdata, void *call_private, ...);  	struct marker_probe_closure single;  	struct marker_probe_closure *multi;  } __attribute__((aligned(8))); @@ -58,8 +58,12 @@ struct marker {   * Make sure the alignment of the structure in the __markers section will   * not add unwanted padding between the beginning of the section and the   * structure. Force alignment to the same alignment as the section start. + * + * The "generic" argument controls which marker enabling mechanism must be used. + * If generic is true, a variable read is used. + * If generic is false, immediate values are used.   */ -#define __trace_mark(name, call_private, format, args...)		\ +#define __trace_mark(generic, name, call_private, format, args...)	\  	do {								\  		static const char __mstrtab_##name[]			\  		__attribute__((section("__markers_strings")))		\ @@ -72,15 +76,14 @@ struct marker {  		__mark_check_format(format, ## args);			\  		if (unlikely(__mark_##name.state)) {			\  			(*__mark_##name.call)				\ -				(&__mark_##name, call_private,		\ -				format, ## args);			\ +				(&__mark_##name, call_private, ## args);\  		}							\  	} while (0)  extern void marker_update_probe_range(struct marker *begin,  	struct marker *end);  #else /* !CONFIG_MARKERS */ -#define __trace_mark(name, call_private, format, args...) \ +#define __trace_mark(generic, name, call_private, format, args...) \  		__mark_check_format(format, ## args)  static inline void marker_update_probe_range(struct marker *begin,  	struct marker *end) @@ -88,15 +91,30 @@ static inline void marker_update_probe_range(struct marker *begin,  #endif /* CONFIG_MARKERS */  /** - * trace_mark - Marker + * trace_mark - Marker using code patching   * @name: marker name, not quoted.   * @format: format string   * @args...: variable argument list   * - * Places a marker. + * Places a marker using optimized code patching technique (imv_read()) + * to be enabled when immediate values are present.   */  #define trace_mark(name, format, args...) \ -	__trace_mark(name, NULL, format, ## args) +	__trace_mark(0, name, NULL, format, ## args) + +/** + * _trace_mark - Marker using variable read + * @name: marker name, not quoted. + * @format: format string + * @args...: variable argument list + * + * Places a marker using a standard memory read (_imv_read()) to be + * enabled. Should be used for markers in code paths where instruction + * modification based enabling is not welcome. (__init and __exit functions, + * lockdep, some traps, printk). + */ +#define _trace_mark(name, format, args...) \ +	__trace_mark(1, name, NULL, format, ## args)  /**   * MARK_NOARGS - Format string for a marker with no argument. @@ -117,9 +135,9 @@ static inline void __printf(1, 2) ___mark_check_format(const char *fmt, ...)  extern marker_probe_func __mark_empty_function;  extern void marker_probe_cb(const struct marker *mdata, -	void *call_private, const char *fmt, ...); +	void *call_private, ...);  extern void marker_probe_cb_noarg(const struct marker *mdata, -	void *call_private, const char *fmt, ...); +	void *call_private, ...);  /*   * Connect a probe to a marker. diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h new file mode 100644 index 00000000000..61d19e1b7a0 --- /dev/null +++ b/include/linux/mmiotrace.h @@ -0,0 +1,85 @@ +#ifndef MMIOTRACE_H +#define MMIOTRACE_H + +#include <linux/types.h> +#include <linux/list.h> + +struct kmmio_probe; +struct pt_regs; + +typedef void (*kmmio_pre_handler_t)(struct kmmio_probe *, +				struct pt_regs *, unsigned long addr); +typedef void (*kmmio_post_handler_t)(struct kmmio_probe *, +				unsigned long condition, struct pt_regs *); + +struct kmmio_probe { +	struct list_head list; /* kmmio internal list */ +	unsigned long addr; /* start location of the probe point */ +	unsigned long len; /* length of the probe region */ +	kmmio_pre_handler_t pre_handler; /* Called before addr is executed. */ +	kmmio_post_handler_t post_handler; /* Called after addr is executed */ +	void *private; +}; + +/* kmmio is active by some kmmio_probes? */ +static inline int is_kmmio_active(void) +{ +	extern unsigned int kmmio_count; +	return kmmio_count; +} + +extern int register_kmmio_probe(struct kmmio_probe *p); +extern void unregister_kmmio_probe(struct kmmio_probe *p); + +/* Called from page fault handler. */ +extern int kmmio_handler(struct pt_regs *regs, unsigned long addr); + +/* Called from ioremap.c */ +#ifdef CONFIG_MMIOTRACE +extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size, +							void __iomem *addr); +extern void mmiotrace_iounmap(volatile void __iomem *addr); +#else +static inline void mmiotrace_ioremap(resource_size_t offset, +					unsigned long size, void __iomem *addr) +{ +} + +static inline void mmiotrace_iounmap(volatile void __iomem *addr) +{ +} +#endif /* CONFIG_MMIOTRACE_HOOKS */ + +enum mm_io_opcode { +	MMIO_READ = 0x1,     /* struct mmiotrace_rw */ +	MMIO_WRITE = 0x2,    /* struct mmiotrace_rw */ +	MMIO_PROBE = 0x3,    /* struct mmiotrace_map */ +	MMIO_UNPROBE = 0x4,  /* struct mmiotrace_map */ +	MMIO_MARKER = 0x5,   /* raw char data */ +	MMIO_UNKNOWN_OP = 0x6, /* struct mmiotrace_rw */ +}; + +struct mmiotrace_rw { +	resource_size_t phys;	/* PCI address of register */ +	unsigned long value; +	unsigned long pc;	/* optional program counter */ +	int map_id; +	unsigned char opcode;	/* one of MMIO_{READ,WRITE,UNKNOWN_OP} */ +	unsigned char width;	/* size of register access in bytes */ +}; + +struct mmiotrace_map { +	resource_size_t phys;	/* base address in PCI space */ +	unsigned long virt;	/* base virtual address */ +	unsigned long len;	/* mapping size */ +	int map_id; +	unsigned char opcode;	/* MMIO_PROBE or MMIO_UNPROBE */ +}; + +/* in kernel/trace/trace_mmiotrace.c */ +extern void enable_mmiotrace(void); +extern void disable_mmiotrace(void); +extern void mmio_trace_rw(struct mmiotrace_rw *rw); +extern void mmio_trace_mapping(struct mmiotrace_map *map); + +#endif /* MMIOTRACE_H */ diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 23f0c54175c..72b1a10a59b 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -10,7 +10,7 @@  #include <linux/linkage.h>  #include <linux/list.h> -#ifdef CONFIG_DEBUG_PREEMPT +#if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER)    extern void add_preempt_count(int val);    extern void sub_preempt_count(int val);  #else @@ -52,6 +52,34 @@ do { \  	preempt_check_resched(); \  } while (0) +/* For debugging and tracer internals only! */ +#define add_preempt_count_notrace(val)			\ +	do { preempt_count() += (val); } while (0) +#define sub_preempt_count_notrace(val)			\ +	do { preempt_count() -= (val); } while (0) +#define inc_preempt_count_notrace() add_preempt_count_notrace(1) +#define dec_preempt_count_notrace() sub_preempt_count_notrace(1) + +#define preempt_disable_notrace() \ +do { \ +	inc_preempt_count_notrace(); \ +	barrier(); \ +} while (0) + +#define preempt_enable_no_resched_notrace() \ +do { \ +	barrier(); \ +	dec_preempt_count_notrace(); \ +} while (0) + +/* preempt_check_resched is OK to trace */ +#define preempt_enable_notrace() \ +do { \ +	preempt_enable_no_resched_notrace(); \ +	barrier(); \ +	preempt_check_resched(); \ +} while (0) +  #else  #define preempt_disable()		do { } while (0) @@ -59,6 +87,10 @@ do { \  #define preempt_enable()		do { } while (0)  #define preempt_check_resched()		do { } while (0) +#define preempt_disable_notrace()		do { } while (0) +#define preempt_enable_no_resched_notrace()	do { } while (0) +#define preempt_enable_notrace()		do { } while (0) +  #endif  #ifdef CONFIG_PREEMPT_NOTIFIERS diff --git a/include/linux/sched.h b/include/linux/sched.h index f6cd60f2de6..5d1af10b90c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -245,6 +245,8 @@ extern asmlinkage void schedule_tail(struct task_struct *prev);  extern void init_idle(struct task_struct *idle, int cpu);  extern void init_idle_bootup_task(struct task_struct *idle); +extern int runqueue_is_locked(void); +  extern cpumask_t nohz_cpu_mask;  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)  extern int select_nohz_load_balancer(int cpu); @@ -2132,6 +2134,18 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm)  }  #endif +#ifdef CONFIG_TRACING +extern void +__trace_special(void *__tr, void *__data, +		unsigned long arg1, unsigned long arg2, unsigned long arg3); +#else +static inline void +__trace_special(void *__tr, void *__data, +		unsigned long arg1, unsigned long arg2, unsigned long arg3) +{ +} +#endif +  extern long sched_setaffinity(pid_t pid, const cpumask_t *new_mask);  extern long sched_getaffinity(pid_t pid, cpumask_t *mask); @@ -2226,6 +2240,8 @@ static inline void mm_init_owner(struct mm_struct *mm, struct task_struct *p)  }  #endif /* CONFIG_MM_OWNER */ +#define TASK_STATE_TO_CHAR_STR "RSDTtZX" +  #endif /* __KERNEL__ */  #endif diff --git a/include/linux/writeback.h b/include/linux/writeback.h index f462439cc28..bd91987c065 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -105,6 +105,8 @@ extern int vm_highmem_is_dirtyable;  extern int block_dump;  extern int laptop_mode; +extern unsigned long determine_dirtyable_memory(void); +  extern int dirty_ratio_handler(struct ctl_table *table, int write,  		struct file *filp, void __user *buffer, size_t *lenp,  		loff_t *ppos);  |