Blame view

include/linux/kernel.h 19.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  #ifndef _LINUX_KERNEL_H
  #define _LINUX_KERNEL_H
  
  /*
   * 'kernel.h' contains some often-used function prototypes etc
   */
a79ff731a   Alexey Dobriyan   netfilter: xtable...
7
8
  #define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
  #define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
  
  #ifdef __KERNEL__
  
  #include <stdarg.h>
  #include <linux/linkage.h>
  #include <linux/stddef.h>
  #include <linux/types.h>
  #include <linux/compiler.h>
  #include <linux/bitops.h>
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
18
  #include <linux/log2.h>
e0deaff47   Andrew Morton   split the typeche...
19
  #include <linux/typecheck.h>
968ab1838   Linus Torvalds   include/linux/ker...
20
  #include <linux/printk.h>
e9d376f0f   Jason Baron   dynamic debug: co...
21
  #include <linux/dynamic_debug.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  #include <asm/byteorder.h>
  #include <asm/bug.h>
4be929be3   Alexey Dobriyan   kernel-wide: repl...
24
25
26
  #define USHRT_MAX	((u16)(~0U))
  #define SHRT_MAX	((s16)(USHRT_MAX>>1))
  #define SHRT_MIN	((s16)(-SHRT_MAX - 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
30
31
32
  #define INT_MAX		((int)(~0U>>1))
  #define INT_MIN		(-INT_MAX - 1)
  #define UINT_MAX	(~0U)
  #define LONG_MAX	((long)(~0UL>>1))
  #define LONG_MIN	(-LONG_MAX - 1)
  #define ULONG_MAX	(~0UL)
111ebb6e6   OGAWA Hirofumi   [PATCH] writeback...
33
34
35
  #define LLONG_MAX	((long long)(~0ULL>>1))
  #define LLONG_MIN	(-LLONG_MAX - 1)
  #define ULLONG_MAX	(~0ULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
  
  #define STACK_MAGIC	0xdeadbeef
a79ff731a   Alexey Dobriyan   netfilter: xtable...
38
  #define ALIGN(x, a)		__ALIGN_KERNEL((x), (a))
9f93ff5be   Alexey Dobriyan   Restore __ALIGN_M...
39
  #define __ALIGN_MASK(x, mask)	__ALIGN_KERNEL_MASK((x), (mask))
a83308e60   Matthew Wilcox   PTR_ALIGN
40
  #define PTR_ALIGN(p, a)		((typeof(p))ALIGN((unsigned long)(p), (a)))
f10db6277   Herbert Xu   Avoid divide in I...
41
  #define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a) - 1)) == 0)
2ea581447   Linus Torvalds   Fix 'ALIGN()' mac...
42

c5e631cf6   Rusty Russell   ARRAY_SIZE: check...
43
  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
9b3be9f99   Yinghai Lu   Move round_up/dow...
44
45
46
47
48
49
50
51
52
  /*
   * This looks more complex than it should be. But we need to
   * get the type for the ~ right in round_down (it needs to be
   * as wide as the result!), and we want to evaluate the macro
   * arguments just once each.
   */
  #define __round_mask(x, y) ((__typeof__(x))((y)-1))
  #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
  #define round_down(x, y) ((x) & ~__round_mask(x, y))
4552d5dc0   Jan Beulich   [PATCH] x86_64: r...
53
  #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
930631edd   Steven Whitehouse   [PATCH] add DIV_R...
54
  #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
074e61ec3   James Morris   kernel: add round...
55
56
  
  /* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
b28efd54d   Eric Paris   kernel: roundup s...
57
58
  #define roundup(x, y) (					\
  {							\
6070bf359   Tetsuo Handa   kernel: Constify ...
59
  	const typeof(y) __y = y;			\
b28efd54d   Eric Paris   kernel: roundup s...
60
61
62
  	(((x) + (__y - 1)) / __y) * __y;		\
  }							\
  )
686a0f3d7   Eric Paris   kernel: rounddown...
63
64
65
66
67
68
  #define rounddown(x, y) (				\
  {							\
  	typeof(x) __x = (x);				\
  	__x - (__x % (y));				\
  }							\
  )
9fe06081e   Darrick J. Wong   Create a DIV_ROUN...
69
70
71
72
73
74
  #define DIV_ROUND_CLOSEST(x, divisor)(			\
  {							\
  	typeof(divisor) __divisor = divisor;		\
  	(((x) + ((__divisor) / 2)) / (__divisor));	\
  }							\
  )
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75

ca31e146d   Eduard - Gabriel Munteanu   Move _RET_IP_ and...
76
77
  #define _RET_IP_		(unsigned long)__builtin_return_address(0)
  #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
90c699a9e   Bartlomiej Zolnierkiewicz   block: rename CON...
78
  #ifdef CONFIG_LBDAF
2da96acde   Jens Axboe   [BLOCK] Move sect...
79
80
81
82
83
84
85
86
87
88
89
90
  # include <asm/div64.h>
  # define sector_div(a, b) do_div(a, b)
  #else
  # define sector_div(n, b)( \
  { \
  	int _res; \
  	_res = (n) % (b); \
  	(n) /= (b); \
  	_res; \
  } \
  )
  #endif
218e180e7   Andrew Morton   add upper-32-bits...
91
92
93
94
95
96
97
98
99
  /**
   * upper_32_bits - return bits 32-63 of a number
   * @n: the number we're accessing
   *
   * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
   * the "right shift count >= width of type" warning when that quantity is
   * 32-bits.
   */
  #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
204b885e7   Joerg Roedel   introduce lower_3...
100
101
102
103
104
  /**
   * lower_32_bits - return bits 0-31 of a number
   * @n: the number we're accessing
   */
  #define lower_32_bits(n) ((u32)(n))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  struct completion;
df2e71fb9   Andrew Morton   [PATCH] dump_thre...
106
107
  struct pt_regs;
  struct user;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108

070cb0659   Uwe Kleine-König   move kernel-doc c...
109
110
111
112
113
114
  #ifdef CONFIG_PREEMPT_VOLUNTARY
  extern int _cond_resched(void);
  # define might_resched() _cond_resched()
  #else
  # define might_resched() do { } while (0)
  #endif
7106a27b5   Randy Dunlap   kernel.h: fix mig...
115
  #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
d894837f2   Simon Kagstrom   sched: might_slee...
116
    void __might_sleep(const char *file, int line, int preempt_offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
  /**
   * might_sleep - annotation for functions that can sleep
   *
   * this macro will print a stack trace if it is executed in an atomic
   * context (spinlock, irq-handler, ...).
   *
   * This is a useful debugging help to be able to catch problems early and not
e20ec9911   Jim Cromie   fix spelling erro...
124
   * be bitten later when the calling function happens to sleep when it is not
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
   * supposed to.
   */
f8cbd99bd   Ingo Molnar   [PATCH] sched: vo...
127
  # define might_sleep() \
e4aafea2d   Frederic Weisbecker   sched: Add a pree...
128
  	do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  #else
d894837f2   Simon Kagstrom   sched: might_slee...
130
131
    static inline void __might_sleep(const char *file, int line,
  				   int preempt_offset) { }
f8cbd99bd   Ingo Molnar   [PATCH] sched: vo...
132
  # define might_sleep() do { might_resched(); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  #endif
368a5fa1f   Hua Zhong   [PATCH] remove un...
134
  #define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0)
f8cbd99bd   Ingo Molnar   [PATCH] sched: vo...
135

71a904844   Andrew Morton   include/linux/ker...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  /*
   * abs() handles unsigned and signed longs, ints, shorts and chars.  For all
   * input types abs() returns a signed long.
   * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
   * for those.
   */
  #define abs(x) ({						\
  		long ret;					\
  		if (sizeof(x) == sizeof(long)) {		\
  			long __x = (x);				\
  			ret = (__x < 0) ? -__x : __x;		\
  		} else {					\
  			int __x = (x);				\
  			ret = (__x < 0) ? -__x : __x;		\
  		}						\
  		ret;						\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
  	})
658716d19   Brian Behlendorf   div64_u64(): impr...
153
154
155
156
  #define abs64(x) ({				\
  		s64 __x = (x);			\
  		(__x < 0) ? -__x : __x;		\
  	})
3ee1afa30   Nick Piggin   x86: some lock an...
157
158
159
160
161
162
163
164
  #ifdef CONFIG_PROVE_LOCKING
  void might_fault(void);
  #else
  static inline void might_fault(void)
  {
  	might_sleep();
  }
  #endif
e041c6834   Alan Stern   [PATCH] Notifier ...
165
  extern struct atomic_notifier_head panic_notifier_list;
c7ff0d9c9   TAMUKI Shoichi   panic: keep blink...
166
  extern long (*panic_blink)(int state);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
  NORET_TYPE void panic(const char * fmt, ...)
a586df067   Andi Kleen   x86: Support __at...
168
  	__attribute__ ((NORET_AND format (printf, 1, 2))) __cold;
dd287796d   Andrew Morton   [PATCH] pause_on_...
169
170
  extern void oops_enter(void);
  extern void oops_exit(void);
863a60492   Anton Blanchard   lib/bug.c: add oo...
171
  void print_oops_end_marker(void);
dd287796d   Andrew Morton   [PATCH] pause_on_...
172
  extern int oops_may_print(void);
ec7015840   Harvey Harrison   Remove fastcall f...
173
  NORET_TYPE void do_exit(long error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
178
179
180
  	ATTRIB_NORET;
  NORET_TYPE void complete_and_exit(struct completion *, long)
  	ATTRIB_NORET;
  extern unsigned long simple_strtoul(const char *,char **,unsigned int);
  extern long simple_strtol(const char *,char **,unsigned int);
  extern unsigned long long simple_strtoull(const char *,char **,unsigned int);
  extern long long simple_strtoll(const char *,char **,unsigned int);
a55621f15   Andrew Morton   include/linux/ker...
181
182
183
184
  extern int __must_check strict_strtoul(const char *, unsigned int, unsigned long *);
  extern int __must_check strict_strtol(const char *, unsigned int, long *);
  extern int __must_check strict_strtoull(const char *, unsigned int, unsigned long long *);
  extern int __must_check strict_strtoll(const char *, unsigned int, long long *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
187
188
189
190
191
192
193
194
195
196
  extern int sprintf(char * buf, const char * fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern int vsprintf(char *buf, const char *, va_list)
  	__attribute__ ((format (printf, 2, 0)));
  extern int snprintf(char * buf, size_t size, const char * fmt, ...)
  	__attribute__ ((format (printf, 3, 4)));
  extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
  	__attribute__ ((format (printf, 3, 0)));
  extern int scnprintf(char * buf, size_t size, const char * fmt, ...)
  	__attribute__ ((format (printf, 3, 4)));
  extern int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
  	__attribute__ ((format (printf, 3, 0)));
e905914f9   Jeremy Fitzhardinge   [PATCH] Implement...
197
198
  extern char *kasprintf(gfp_t gfp, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
11443ec7d   Jeremy Fitzhardinge   Add kvasprintf()
199
  extern char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
201
202
203
204
205
206
207
  
  extern int sscanf(const char *, const char *, ...)
  	__attribute__ ((format (scanf, 2, 3)));
  extern int vsscanf(const char *, const char *, va_list)
  	__attribute__ ((format (scanf, 2, 0)));
  
  extern int get_option(char **str, int *pint);
  extern char *get_options(const char *str, int nints, int *ints);
d974ae379   Jeremy Fitzhardinge   generic, memparse...
208
  extern unsigned long long memparse(const char *ptr, char **retptr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209

5e3766138   Trent Piepho   [PATCH] symbol_pu...
210
  extern int core_kernel_text(unsigned long addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
  extern int __kernel_text_address(unsigned long addr);
  extern int kernel_text_address(unsigned long addr);
ab7476cf7   Arjan van de Ven   debug: add notifi...
213
  extern int func_ptr_is_kernel_text(void *ptr);
ab7476cf7   Arjan van de Ven   debug: add notifi...
214

04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
215
216
  struct pid;
  extern struct pid *session_of_pgrp(struct pid *pgrp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
  unsigned long int_sqrt(unsigned long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
  extern void bust_spinlocks(int yes);
e3e8a75d2   Kirill Korotaev   [PATCH] Extract a...
220
  extern void wake_up_klogd(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */
aa7271076   Adrian Bunk   [PATCH] the sched...
222
  extern int panic_timeout;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
  extern int panic_on_oops;
8da5adda9   Don Zickus   [PATCH] x86: Allo...
224
  extern int panic_on_unrecovered_nmi;
5211a242d   Kurt Garloff   x86: Add sysctl t...
225
  extern int panic_on_io_nmi;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
  extern const char *print_tainted(void);
25ddbb18a   Andi Kleen   Make the taint fl...
227
228
229
  extern void add_taint(unsigned flag);
  extern int test_taint(unsigned flag);
  extern unsigned long get_taint(void);
b920de1b7   David Howells   mn10300: add the ...
230
  extern int root_mountflags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231

2ce802f62   Tejun Heo   lockdep: Move ear...
232
  extern bool early_boot_irqs_disabled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
235
236
237
238
239
  /* Values used for system_state */
  extern enum system_states {
  	SYSTEM_BOOTING,
  	SYSTEM_RUNNING,
  	SYSTEM_HALT,
  	SYSTEM_POWER_OFF,
  	SYSTEM_RESTART,
729b4d4ce   Alexey Starikovskiy   [ACPI] fix reboot...
240
  	SYSTEM_SUSPEND_DISK,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
  } system_state;
25ddbb18a   Andi Kleen   Make the taint fl...
242
243
244
245
246
247
248
249
250
251
  #define TAINT_PROPRIETARY_MODULE	0
  #define TAINT_FORCED_MODULE		1
  #define TAINT_UNSAFE_SMP		2
  #define TAINT_FORCED_RMMOD		3
  #define TAINT_MACHINE_CHECK		4
  #define TAINT_BAD_PAGE			5
  #define TAINT_USER			6
  #define TAINT_DIE			7
  #define TAINT_OVERRIDDEN_ACPI_TABLE	8
  #define TAINT_WARN			9
26e9a3977   Linus Torvalds   Merge git://git.k...
252
  #define TAINT_CRAP			10
92946bc72   Ben Hutchings   panic: Add taint ...
253
  #define TAINT_FIRMWARE_WORKAROUND	11
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254

3fc957721   Harvey Harrison   lib: create commo...
255
256
257
258
259
260
261
262
263
264
  extern const char hex_asc[];
  #define hex_asc_lo(x)	hex_asc[((x) & 0x0f)]
  #define hex_asc_hi(x)	hex_asc[((x) & 0xf0) >> 4]
  
  static inline char *pack_hex_byte(char *buf, u8 byte)
  {
  	*buf++ = hex_asc_hi(byte);
  	*buf++ = hex_asc_lo(byte);
  	return buf;
  }
99eaf3c45   Randy Dunlap   lib/hexdump
265

903788892   Andy Shevchenko   lib: introduce co...
266
  extern int hex_to_bin(char ch);
dc88e4602   Mimi Zohar   lib: hex2bin conv...
267
  extern void hex2bin(u8 *dst, const char *src, size_t count);
903788892   Andy Shevchenko   lib: introduce co...
268

8a64f336b   Joe Perches   kernel.h: add pri...
269
  /*
526211bc5   Ingo Molnar   tracing: move uti...
270
   * General tracing related utility functions - trace_printk(),
2002c258f   Steven Rostedt   tracing: add trac...
271
272
273
274
   * tracing_on/tracing_off and tracing_start()/tracing_stop
   *
   * Use tracing_on/tracing_off when you want to quickly turn on or off
   * tracing. It simply enables or disables the recording of the trace events.
156f5a780   GeunSik Lim   debugfs: Fix term...
275
   * This also corresponds to the user space /sys/kernel/debug/tracing/tracing_on
2002c258f   Steven Rostedt   tracing: add trac...
276
277
278
279
280
281
282
283
284
285
286
   * file, which gives a means for the kernel and userspace to interact.
   * Place a tracing_off() in the kernel where you want tracing to end.
   * From user space, examine the trace, and then echo 1 > tracing_on
   * to continue tracing.
   *
   * tracing_stop/tracing_start has slightly more overhead. It is used
   * by things like suspend to ram where disabling the recording of the
   * trace is not enough, but tracing must actually stop because things
   * like calling smp_processor_id() may crash the system.
   *
   * Most likely, you want to use tracing_on/tracing_off.
526211bc5   Ingo Molnar   tracing: move uti...
287
   */
2002c258f   Steven Rostedt   tracing: add trac...
288
289
290
291
292
293
294
295
296
297
298
299
  #ifdef CONFIG_RING_BUFFER
  void tracing_on(void);
  void tracing_off(void);
  /* trace_off_permanent stops recording with no way to bring it back */
  void tracing_off_permanent(void);
  int tracing_is_on(void);
  #else
  static inline void tracing_on(void) { }
  static inline void tracing_off(void) { }
  static inline void tracing_off_permanent(void) { }
  static inline int tracing_is_on(void) { return 0; }
  #endif
cecbca96d   Frederic Weisbecker   tracing: Dump eit...
300
301
302
303
304
305
  
  enum ftrace_dump_mode {
  	DUMP_NONE,
  	DUMP_ALL,
  	DUMP_ORIG,
  };
526211bc5   Ingo Molnar   tracing: move uti...
306
307
308
309
  #ifdef CONFIG_TRACING
  extern void tracing_start(void);
  extern void tracing_stop(void);
  extern void ftrace_off_permanent(void);
769b0441f   Frederic Weisbecker   tracing/core: dro...
310
311
312
313
314
315
316
317
318
  static inline void __attribute__ ((format (printf, 1, 2)))
  ____trace_printk_check_format(const char *fmt, ...)
  {
  }
  #define __trace_printk_check_format(fmt, args...)			\
  do {									\
  	if (0)								\
  		____trace_printk_check_format(fmt, ##args);		\
  } while (0)
526211bc5   Ingo Molnar   tracing: move uti...
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
  /**
   * trace_printk - printf formatting in the ftrace buffer
   * @fmt: the printf format for printing
   *
   * Note: __trace_printk is an internal function for trace_printk and
   *       the @ip is passed in via the trace_printk macro.
   *
   * This function allows a kernel developer to debug fast path sections
   * that printk is not appropriate for. By scattering in various
   * printk like tracing in the code, a developer can quickly see
   * where problems are occurring.
   *
   * This is intended as a debugging tool for the developer only.
   * Please refrain from leaving trace_printks scattered around in
   * your code.
   */
769b0441f   Frederic Weisbecker   tracing/core: dro...
335
336
337
  
  #define trace_printk(fmt, args...)					\
  do {									\
769b0441f   Frederic Weisbecker   tracing/core: dro...
338
  	__trace_printk_check_format(fmt, ##args);			\
48ead0203   Frederic Weisbecker   tracing/core: bri...
339
340
341
342
343
344
345
346
  	if (__builtin_constant_p(fmt)) {				\
  		static const char *trace_printk_fmt			\
  		  __attribute__((section("__trace_printk_fmt"))) =	\
  			__builtin_constant_p(fmt) ? fmt : NULL;		\
  									\
  		__trace_bprintk(_THIS_IP_, trace_printk_fmt, ##args);	\
  	} else								\
  		__trace_printk(_THIS_IP_, fmt, ##args);		\
769b0441f   Frederic Weisbecker   tracing/core: dro...
347
  } while (0)
526211bc5   Ingo Molnar   tracing: move uti...
348
  extern int
48ead0203   Frederic Weisbecker   tracing/core: bri...
349
350
351
352
  __trace_bprintk(unsigned long ip, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  
  extern int
526211bc5   Ingo Molnar   tracing: move uti...
353
354
  __trace_printk(unsigned long ip, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
769b0441f   Frederic Weisbecker   tracing/core: dro...
355

03889384c   Steven Rostedt   tracing: Add trac...
356
  extern void trace_dump_stack(void);
48ead0203   Frederic Weisbecker   tracing/core: bri...
357
358
359
360
361
  /*
   * The double __builtin_constant_p is because gcc will give us an error
   * if we try to allocate the static variable to fmt if it is not a
   * constant. Even with the outer if statement.
   */
769b0441f   Frederic Weisbecker   tracing/core: dro...
362
363
  #define ftrace_vprintk(fmt, vargs)					\
  do {									\
48ead0203   Frederic Weisbecker   tracing/core: bri...
364
365
366
367
  	if (__builtin_constant_p(fmt)) {				\
  		static const char *trace_printk_fmt			\
  		  __attribute__((section("__trace_printk_fmt"))) =	\
  			__builtin_constant_p(fmt) ? fmt : NULL;		\
7bffc23e5   Ingo Molnar   tracing: optimize...
368
  									\
48ead0203   Frederic Weisbecker   tracing/core: bri...
369
370
371
  		__ftrace_vbprintk(_THIS_IP_, trace_printk_fmt, vargs);	\
  	} else								\
  		__ftrace_vprintk(_THIS_IP_, fmt, vargs);		\
769b0441f   Frederic Weisbecker   tracing/core: dro...
372
  } while (0)
526211bc5   Ingo Molnar   tracing: move uti...
373
  extern int
48ead0203   Frederic Weisbecker   tracing/core: bri...
374
375
376
  __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap);
  
  extern int
526211bc5   Ingo Molnar   tracing: move uti...
377
  __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap);
769b0441f   Frederic Weisbecker   tracing/core: dro...
378

cecbca96d   Frederic Weisbecker   tracing: Dump eit...
379
  extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode);
526211bc5   Ingo Molnar   tracing: move uti...
380
  #else
526211bc5   Ingo Molnar   tracing: move uti...
381
382
383
384
385
386
  static inline int
  trace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
  
  static inline void tracing_start(void) { }
  static inline void tracing_stop(void) { }
  static inline void ftrace_off_permanent(void) { }
e36c54582   Steven Rostedt   tracing: Fix retu...
387
  static inline void trace_dump_stack(void) { }
526211bc5   Ingo Molnar   tracing: move uti...
388
389
390
391
392
393
394
395
396
397
  static inline int
  trace_printk(const char *fmt, ...)
  {
  	return 0;
  }
  static inline int
  ftrace_vprintk(const char *fmt, va_list ap)
  {
  	return 0;
  }
cecbca96d   Frederic Weisbecker   tracing: Dump eit...
398
  static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
769b0441f   Frederic Weisbecker   tracing/core: dro...
399
  #endif /* CONFIG_TRACING */
526211bc5   Ingo Molnar   tracing: move uti...
400
401
  
  /*
bdf4bbaae   Harvey Harrison   Add macros simila...
402
   * min()/max()/clamp() macros that also do
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
404
405
   * strict type-checking.. See the
   * "unnecessary" pointer comparison.
   */
bdf4bbaae   Harvey Harrison   Add macros simila...
406
407
408
409
410
411
412
413
414
415
416
  #define min(x, y) ({				\
  	typeof(x) _min1 = (x);			\
  	typeof(y) _min2 = (y);			\
  	(void) (&_min1 == &_min2);		\
  	_min1 < _min2 ? _min1 : _min2; })
  
  #define max(x, y) ({				\
  	typeof(x) _max1 = (x);			\
  	typeof(y) _max2 = (y);			\
  	(void) (&_max1 == &_max2);		\
  	_max1 > _max2 ? _max1 : _max2; })
f27c85c56   Hagen Paul Pfeifer   kernel.h: add {mi...
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
  #define min3(x, y, z) ({			\
  	typeof(x) _min1 = (x);			\
  	typeof(y) _min2 = (y);			\
  	typeof(z) _min3 = (z);			\
  	(void) (&_min1 == &_min2);		\
  	(void) (&_min1 == &_min3);		\
  	_min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \
  		(_min2 < _min3 ? _min2 : _min3); })
  
  #define max3(x, y, z) ({			\
  	typeof(x) _max1 = (x);			\
  	typeof(y) _max2 = (y);			\
  	typeof(z) _max3 = (z);			\
  	(void) (&_max1 == &_max2);		\
  	(void) (&_max1 == &_max3);		\
  	_max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \
  		(_max2 > _max3 ? _max2 : _max3); })
bdf4bbaae   Harvey Harrison   Add macros simila...
434
  /**
c8bf13368   Martin K. Petersen   Consolidate min_n...
435
436
437
438
439
440
441
442
443
444
   * min_not_zero - return the minimum that is _not_ zero, unless both are zero
   * @x: value1
   * @y: value2
   */
  #define min_not_zero(x, y) ({			\
  	typeof(x) __x = (x);			\
  	typeof(y) __y = (y);			\
  	__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
  
  /**
bdf4bbaae   Harvey Harrison   Add macros simila...
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
   * clamp - return a value clamped to a given range with strict typechecking
   * @val: current value
   * @min: minimum allowable value
   * @max: maximum allowable value
   *
   * This macro does strict typechecking of min/max to make sure they are of the
   * same type as val.  See the unnecessary pointer comparisons.
   */
  #define clamp(val, min, max) ({			\
  	typeof(val) __val = (val);		\
  	typeof(min) __min = (min);		\
  	typeof(max) __max = (max);		\
  	(void) (&__val == &__min);		\
  	(void) (&__val == &__max);		\
  	__val = __val < __min ? __min: __val;	\
  	__val > __max ? __max: __val; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
463
464
465
  
  /*
   * ..and if you can't take the strict
   * types, you can specify one yourself.
   *
bdf4bbaae   Harvey Harrison   Add macros simila...
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
   * Or not use min/max/clamp at all, of course.
   */
  #define min_t(type, x, y) ({			\
  	type __min1 = (x);			\
  	type __min2 = (y);			\
  	__min1 < __min2 ? __min1: __min2; })
  
  #define max_t(type, x, y) ({			\
  	type __max1 = (x);			\
  	type __max2 = (y);			\
  	__max1 > __max2 ? __max1: __max2; })
  
  /**
   * clamp_t - return a value clamped to a given range using a given type
   * @type: the type of variable to use
   * @val: current value
   * @min: minimum allowable value
   * @max: maximum allowable value
   *
   * This macro does no typechecking and uses temporary variables of type
   * 'type' to make all the comparisons.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
487
   */
bdf4bbaae   Harvey Harrison   Add macros simila...
488
489
490
491
492
493
  #define clamp_t(type, val, min, max) ({		\
  	type __val = (val);			\
  	type __min = (min);			\
  	type __max = (max);			\
  	__val = __val < __min ? __min: __val;	\
  	__val > __max ? __max: __val; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494

bdf4bbaae   Harvey Harrison   Add macros simila...
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
  /**
   * clamp_val - return a value clamped to a given range using val's type
   * @val: current value
   * @min: minimum allowable value
   * @max: maximum allowable value
   *
   * This macro does no typechecking and uses temporary variables of whatever
   * type the input argument 'val' is.  This is useful when val is an unsigned
   * type and min and max are literals that will otherwise be assigned a signed
   * integer type.
   */
  #define clamp_val(val, min, max) ({		\
  	typeof(val) __val = (val);		\
  	typeof(val) __min = (min);		\
  	typeof(val) __max = (max);		\
  	__val = __val < __min ? __min: __val;	\
  	__val > __max ? __max: __val; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512

91f68b735   Wu Fengguang   generic swap(): i...
513
514
515
516
  
  /*
   * swap - swap value of @a and @b
   */
ac7b90049   Peter Zijlstra   generic swap(): d...
517
518
  #define swap(a, b) \
  	do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
91f68b735   Wu Fengguang   generic swap(): i...
519

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
  /**
   * container_of - cast a member of a structure out to the containing structure
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
523
524
525
526
527
   * @ptr:	the pointer to the member.
   * @type:	the type of the container struct this is embedded in.
   * @member:	the name of the member within the struct.
   *
   */
  #define container_of(ptr, type, member) ({			\
78db2ad6f   Daniel Walker   include/linux: tr...
528
529
  	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
  	(type *)( (char *)__mptr - offsetof(type,member) );})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
530

d4d23add3   Kyle McMartin   [PATCH] Common co...
531
532
  struct sysinfo;
  extern int do_sysinfo(struct sysinfo *info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
  #endif /* __KERNEL__ */
  
  #define SI_LOAD_SHIFT	16
  struct sysinfo {
  	long uptime;			/* Seconds since boot */
  	unsigned long loads[3];		/* 1, 5, and 15 minute load averages */
  	unsigned long totalram;		/* Total usable main memory size */
  	unsigned long freeram;		/* Available memory size */
  	unsigned long sharedram;	/* Amount of shared memory */
  	unsigned long bufferram;	/* Memory used by buffers */
  	unsigned long totalswap;	/* Total swap space size */
  	unsigned long freeswap;		/* swap space still available */
  	unsigned short procs;		/* Number of current processes */
  	unsigned short pad;		/* explicit padding for m68k */
  	unsigned long totalhigh;	/* Total high memory size */
  	unsigned long freehigh;		/* Available high memory size */
  	unsigned int mem_unit;		/* Memory unit size in bytes */
  	char _f[20-2*sizeof(long)-sizeof(int)];	/* Padding: libc5 uses this.. */
  };
cc8ef6eb2   Roland Dreier   kernel.h: add BUI...
552
553
554
  /* Force a compilation error if a constant expression is not a power of 2 */
  #define BUILD_BUG_ON_NOT_POWER_OF_2(n)			\
  	BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0))
4552d5dc0   Jan Beulich   [PATCH] x86_64: r...
555
556
557
558
  /* Force a compilation error if condition is true, but also produce a
     result (of value 0 and type size_t), so the expression can be used
     e.g. in a structure initializer (or where-ever else comma expressions
     aren't permitted). */
8c87df457   Jan Beulich   BUILD_BUG_ON(): f...
559
560
  #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
  #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
4552d5dc0   Jan Beulich   [PATCH] x86_64: r...
561

7ef88ad56   Rusty Russell   BUILD_BUG_ON: mak...
562
563
  /**
   * BUILD_BUG_ON - break compile if a condition is true.
ffbbf2da9   Randy Dunlap   kernel.h: fix ker...
564
   * @condition: the condition which the compiler should know is false.
7ef88ad56   Rusty Russell   BUILD_BUG_ON: mak...
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
   *
   * If you have some code which relies on certain constants being equal, or
   * other compile-time-evaluated condition, you should use BUILD_BUG_ON to
   * detect if someone changes it.
   *
   * The implementation uses gcc's reluctance to create a negative array, but
   * gcc (as of 4.4) only emits that error for obvious cases (eg. not arguments
   * to inline functions).  So as a fallback we use the optimizer; if it can't
   * prove the condition is false, it will cause a link error on the undefined
   * "__build_bug_on_failed".  This error message can be harder to track down
   * though, hence the two different methods.
   */
  #ifndef __OPTIMIZE__
  #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
  #else
  extern int __build_bug_on_failed;
  #define BUILD_BUG_ON(condition)					\
  	do {							\
  		((void)sizeof(char[1 - 2*!!(condition)]));	\
  		if (condition) __build_bug_on_failed = 1;	\
  	} while(0)
  #endif
7ef88ad56   Rusty Russell   BUILD_BUG_ON: mak...
587

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
  /* Trap pasters of __FUNCTION__ at compile-time */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
589
  #define __FUNCTION__ (__func__)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590

08e0f6a97   Christoph Lameter   [PATCH] Add NUMA_...
591
592
593
594
595
596
  /* This helps us to avoid #ifdef CONFIG_NUMA */
  #ifdef CONFIG_NUMA
  #define NUMA_BUILD 1
  #else
  #define NUMA_BUILD 0
  #endif
3e7d34497   Mel Gorman   mm: vmscan: recla...
597
598
599
600
601
602
  /* This helps us avoid #ifdef CONFIG_COMPACTION */
  #ifdef CONFIG_COMPACTION
  #define COMPACTION_BUILD 1
  #else
  #define COMPACTION_BUILD 0
  #endif
29e71abf5   Steven Rostedt   ftrace: rebuild e...
603
604
605
606
  /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
  #endif