diff options
Diffstat (limited to 'include/linux/kernel.h')
| -rw-r--r-- | include/linux/kernel.h | 91 | 
1 files changed, 75 insertions, 16 deletions
| diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 0ad4c3044cf9..4b484ab9e163 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LINUX_KERNEL_H  #define _LINUX_KERNEL_H @@ -44,6 +45,12 @@  #define STACK_MAGIC	0xdeadbeef +/** + * REPEAT_BYTE - repeat the value @x multiple times as an unsigned long value + * @x: value to repeat + * + * NOTE: @x is not checked for > 0xff; larger values produce odd results. + */  #define REPEAT_BYTE(x)	((~0ul / 0xff) * (x))  /* @a is a power of 2 value */ @@ -57,6 +64,10 @@  #define READ			0  #define WRITE			1 +/** + * ARRAY_SIZE - get the number of elements in array @arr + * @arr: array to be sized + */  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))  #define u64_to_user_ptr(x) (		\ @@ -76,7 +87,15 @@  #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)  #define round_down(x, y) ((x) & ~__round_mask(x, y)) +/** + * FIELD_SIZEOF - get the size of a struct's field + * @t: the target struct + * @f: the target struct's field + * Return: the size of @f in the struct definition without having a + * declared instance of @t. + */  #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) +  #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP  #define DIV_ROUND_DOWN_ULL(ll, d) \ @@ -107,7 +126,7 @@  /*   * Divide positive or negative dividend by positive or negative divisor   * and round to closest integer. Result is undefined for negative - * divisors if he dividend variable type is unsigned and for negative + * divisors if the dividend variable type is unsigned and for negative   * dividends if the divisor variable type is unsigned.   */  #define DIV_ROUND_CLOSEST(x, divisor)(			\ @@ -247,13 +266,13 @@ extern int _cond_resched(void);   * @ep_ro: right open interval endpoint   *   * Perform a "reciprocal multiplication" in order to "scale" a value into - * range [0, ep_ro), where the upper interval endpoint is right-open. + * range [0, @ep_ro), where the upper interval endpoint is right-open.   * This is useful, e.g. for accessing a index of an array containing - * ep_ro elements, for example. Think of it as sort of modulus, only that + * @ep_ro elements, for example. Think of it as sort of modulus, only that   * the result isn't that of modulo. ;) Note that if initial input is a   * small value, then result will return 0.   * - * Return: a result based on val in interval [0, ep_ro). + * Return: a result based on @val in interval [0, @ep_ro).   */  static inline u32 reciprocal_scale(u32 val, u32 ep_ro)  { @@ -618,8 +637,8 @@ do {									\   * 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. + * 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 @@ -629,7 +648,7 @@ do {									\   * This is intended as a debugging tool for the developer only.   * Please refrain from leaving trace_printks scattered around in   * your code. (Extra memory is used for special buffers that are - * allocated when trace_printk() is used) + * allocated when trace_printk() is used.)   *   * A little optization trick is done here. If there's only one   * argument, there's no need to scan the string for printf formats. @@ -681,7 +700,7 @@ int __trace_printk(unsigned long ip, const char *fmt, ...);   *       the @ip is passed in via the trace_puts macro.   *   * This is similar to trace_printk() but is made for those really fast - * paths that a developer wants the least amount of "Heisenbug" affects, + * paths that a developer wants the least amount of "Heisenbug" effects,   * where the processing of the print format is still too much.   *   * This function allows a kernel developer to debug fast path sections @@ -692,7 +711,7 @@ int __trace_printk(unsigned long ip, const char *fmt, ...);   * This is intended as a debugging tool for the developer only.   * Please refrain from leaving trace_puts scattered around in   * your code. (Extra memory is used for special buffers that are - * allocated when trace_puts() is used) + * allocated when trace_puts() is used.)   *   * Returns: 0 if nothing was written, positive # if string was.   *  (1 when __trace_bputs is used, strlen(str) when __trace_puts is used) @@ -771,6 +790,12 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }  	t2 min2 = (y);					\  	(void) (&min1 == &min2);			\  	min1 < min2 ? min1 : min2; }) + +/** + * min - return minimum of two values of the same or compatible types + * @x: first value + * @y: second value + */  #define min(x, y)					\  	__min(typeof(x), typeof(y),			\  	      __UNIQUE_ID(min1_), __UNIQUE_ID(min2_),	\ @@ -781,12 +806,31 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }  	t2 max2 = (y);					\  	(void) (&max1 == &max2);			\  	max1 > max2 ? max1 : max2; }) + +/** + * max - return maximum of two values of the same or compatible types + * @x: first value + * @y: second value + */  #define max(x, y)					\  	__max(typeof(x), typeof(y),			\  	      __UNIQUE_ID(max1_), __UNIQUE_ID(max2_),	\  	      x, y) +/** + * min3 - return minimum of three values + * @x: first value + * @y: second value + * @z: third value + */  #define min3(x, y, z) min((typeof(x))min(x, y), z) + +/** + * max3 - return maximum of three values + * @x: first value + * @y: second value + * @z: third value + */  #define max3(x, y, z) max((typeof(x))max(x, y), z)  /** @@ -805,8 +849,8 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }   * @lo: lowest allowable value   * @hi: highest allowable value   * - * This macro does strict typechecking of lo/hi to make sure they are of the - * same type as val.  See the unnecessary pointer comparisons. + * This macro does strict typechecking of @lo/@hi to make sure they are of the + * same type as @val.  See the unnecessary pointer comparisons.   */  #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi) @@ -816,11 +860,24 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }   *   * Or not use min/max/clamp at all, of course.   */ + +/** + * min_t - return minimum of two values, using the specified type + * @type: data type to use + * @x: first value + * @y: second value + */  #define min_t(type, x, y)				\  	__min(type, type,				\  	      __UNIQUE_ID(min1_), __UNIQUE_ID(min2_),	\  	      x, y) +/** + * max_t - return maximum of two values, using the specified type + * @type: data type to use + * @x: first value + * @y: second value + */  #define max_t(type, x, y)				\  	__max(type, type,				\  	      __UNIQUE_ID(min1_), __UNIQUE_ID(min2_),	\ @@ -834,7 +891,7 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }   * @hi: maximum allowable value   *   * This macro does no typechecking and uses temporary variables of type - * 'type' to make all the comparisons. + * @type to make all the comparisons.   */  #define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi) @@ -845,15 +902,17 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }   * @hi: 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 + * type the input argument @val is.  This is useful when @val is an unsigned + * type and @lo and @hi are literals that will otherwise be assigned a signed   * integer type.   */  #define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi) -/* - * swap - swap value of @a and @b +/** + * swap - swap values of @a and @b + * @a: first value + * @b: second value   */  #define swap(a, b) \  	do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0) |