eal/linux: fix illegal memory access in uevent handler
[dpdk.git] / lib / eal / include / rte_common.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2019 Intel Corporation
3  */
4
5 #ifndef _RTE_COMMON_H_
6 #define _RTE_COMMON_H_
7
8 /**
9  * @file
10  *
11  * Generic, commonly-used macro and inline function definitions
12  * for DPDK.
13  */
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 #include <stdint.h>
20 #include <stdlib.h>
21 #include <ctype.h>
22 #include <errno.h>
23 #include <limits.h>
24
25 #include <rte_config.h>
26
27 /* OS specific include */
28 #include <rte_os.h>
29
30 #ifndef typeof
31 #define typeof __typeof__
32 #endif
33
34 #ifndef __cplusplus
35 #ifndef asm
36 #define asm __asm__
37 #endif
38 #endif
39
40 /** C extension macro for environments lacking C11 features. */
41 #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
42 #define RTE_STD_C11 __extension__
43 #else
44 #define RTE_STD_C11
45 #endif
46
47 /*
48  * RTE_TOOLCHAIN_GCC is defined if the target is built with GCC,
49  * while a host application (like pmdinfogen) may have another compiler.
50  * RTE_CC_IS_GNU is true if the file is compiled with GCC,
51  * no matter it is a target or host application.
52  */
53 #define RTE_CC_IS_GNU 0
54 #if defined __clang__
55 #define RTE_CC_CLANG
56 #elif defined __INTEL_COMPILER
57 #define RTE_CC_ICC
58 #elif defined __GNUC__
59 #define RTE_CC_GCC
60 #undef RTE_CC_IS_GNU
61 #define RTE_CC_IS_GNU 1
62 #endif
63 #if RTE_CC_IS_GNU
64 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 +  \
65                 __GNUC_PATCHLEVEL__)
66 #endif
67
68 /**
69  * Force alignment
70  */
71 #define __rte_aligned(a) __attribute__((__aligned__(a)))
72
73 #ifdef RTE_ARCH_STRICT_ALIGN
74 typedef uint64_t unaligned_uint64_t __rte_aligned(1);
75 typedef uint32_t unaligned_uint32_t __rte_aligned(1);
76 typedef uint16_t unaligned_uint16_t __rte_aligned(1);
77 #else
78 typedef uint64_t unaligned_uint64_t;
79 typedef uint32_t unaligned_uint32_t;
80 typedef uint16_t unaligned_uint16_t;
81 #endif
82
83 /**
84  * Force a structure to be packed
85  */
86 #define __rte_packed __attribute__((__packed__))
87
88 /******* Macro to mark functions and fields scheduled for removal *****/
89 #define __rte_deprecated        __attribute__((__deprecated__))
90 #define __rte_deprecated_msg(msg)       __attribute__((__deprecated__(msg)))
91
92 /**
93  *  Macro to mark macros and defines scheduled for removal
94  */
95 #if defined(RTE_CC_GCC) || defined(RTE_CC_CLANG)
96 #define RTE_PRAGMA(x)  _Pragma(#x)
97 #define RTE_PRAGMA_WARNING(w) RTE_PRAGMA(GCC warning #w)
98 #define RTE_DEPRECATED(x)  RTE_PRAGMA_WARNING(#x is deprecated)
99 #else
100 #define RTE_DEPRECATED(x)
101 #endif
102
103 /**
104  * Mark a function or variable to a weak reference.
105  */
106 #define __rte_weak __attribute__((__weak__))
107
108 /**
109  * Force symbol to be generated even if it appears to be unused.
110  */
111 #define __rte_used __attribute__((used))
112
113 /*********** Macros to eliminate unused variable warnings ********/
114
115 /**
116  * short definition to mark a function parameter unused
117  */
118 #define __rte_unused __attribute__((__unused__))
119
120 /**
121  * Mark pointer as restricted with regard to pointer aliasing.
122  */
123 #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
124 #define __rte_restrict __restrict
125 #else
126 #define __rte_restrict restrict
127 #endif
128
129 /**
130  * definition to mark a variable or function parameter as used so
131  * as to avoid a compiler warning
132  */
133 #define RTE_SET_USED(x) (void)(x)
134
135 /**
136  * Check format string and its arguments at compile-time.
137  *
138  * GCC on Windows assumes MS-specific format string by default,
139  * even if the underlying stdio implementation is ANSI-compliant,
140  * so this must be overridden.
141  */
142 #if RTE_CC_IS_GNU
143 #define __rte_format_printf(format_index, first_arg) \
144         __attribute__((format(gnu_printf, format_index, first_arg)))
145 #else
146 #define __rte_format_printf(format_index, first_arg) \
147         __attribute__((format(printf, format_index, first_arg)))
148 #endif
149
150 /**
151  * Tells compiler that the function returns a value that points to
152  * memory, where the size is given by the one or two arguments.
153  * Used by compiler to validate object size.
154  */
155 #if defined(RTE_CC_GCC) || defined(RTE_CC_CLANG)
156 #define __rte_alloc_size(...) \
157         __attribute__((alloc_size(__VA_ARGS__)))
158 #else
159 #define __rte_alloc_size(...)
160 #endif
161
162 #define RTE_PRIORITY_LOG 101
163 #define RTE_PRIORITY_BUS 110
164 #define RTE_PRIORITY_CLASS 120
165 #define RTE_PRIORITY_LAST 65535
166
167 #define RTE_PRIO(prio) \
168         RTE_PRIORITY_ ## prio
169
170 /**
171  * Run function before main() with high priority.
172  *
173  * @param func
174  *   Constructor function.
175  * @param prio
176  *   Priority number must be above 100.
177  *   Lowest number is the first to run.
178  */
179 #ifndef RTE_INIT_PRIO /* Allow to override from EAL */
180 #define RTE_INIT_PRIO(func, prio) \
181 static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void)
182 #endif
183
184 /**
185  * Run function before main() with low priority.
186  *
187  * The constructor will be run after prioritized constructors.
188  *
189  * @param func
190  *   Constructor function.
191  */
192 #define RTE_INIT(func) \
193         RTE_INIT_PRIO(func, LAST)
194
195 /**
196  * Run after main() with low priority.
197  *
198  * @param func
199  *   Destructor function name.
200  * @param prio
201  *   Priority number must be above 100.
202  *   Lowest number is the last to run.
203  */
204 #ifndef RTE_FINI_PRIO /* Allow to override from EAL */
205 #define RTE_FINI_PRIO(func, prio) \
206 static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
207 #endif
208
209 /**
210  * Run after main() with high priority.
211  *
212  * The destructor will be run *before* prioritized destructors.
213  *
214  * @param func
215  *   Destructor function name.
216  */
217 #define RTE_FINI(func) \
218         RTE_FINI_PRIO(func, LAST)
219
220 /**
221  * Hint never returning function
222  */
223 #define __rte_noreturn __attribute__((noreturn))
224
225 /**
226  * Force a function to be inlined
227  */
228 #define __rte_always_inline inline __attribute__((always_inline))
229
230 /**
231  * Force a function to be noinlined
232  */
233 #define __rte_noinline __attribute__((noinline))
234
235 /**
236  * Hint function in the hot path
237  */
238 #define __rte_hot __attribute__((hot))
239
240 /**
241  * Hint function in the cold path
242  */
243 #define __rte_cold __attribute__((cold))
244
245 /*********** Macros for pointer arithmetic ********/
246
247 /**
248  * add a byte-value offset to a pointer
249  */
250 #define RTE_PTR_ADD(ptr, x) ((void*)((uintptr_t)(ptr) + (x)))
251
252 /**
253  * subtract a byte-value offset from a pointer
254  */
255 #define RTE_PTR_SUB(ptr, x) ((void*)((uintptr_t)ptr - (x)))
256
257 /**
258  * get the difference between two pointer values, i.e. how far apart
259  * in bytes are the locations they point two. It is assumed that
260  * ptr1 is greater than ptr2.
261  */
262 #define RTE_PTR_DIFF(ptr1, ptr2) ((uintptr_t)(ptr1) - (uintptr_t)(ptr2))
263
264 /**
265  * Workaround to cast a const field of a structure to non-const type.
266  */
267 #define RTE_CAST_FIELD(var, field, type) \
268         (*(type *)((uintptr_t)(var) + offsetof(typeof(*(var)), field)))
269
270 /*********** Macros/static functions for doing alignment ********/
271
272
273 /**
274  * Macro to align a pointer to a given power-of-two. The resultant
275  * pointer will be a pointer of the same type as the first parameter, and
276  * point to an address no higher than the first parameter. Second parameter
277  * must be a power-of-two value.
278  */
279 #define RTE_PTR_ALIGN_FLOOR(ptr, align) \
280         ((typeof(ptr))RTE_ALIGN_FLOOR((uintptr_t)ptr, align))
281
282 /**
283  * Macro to align a value to a given power-of-two. The resultant value
284  * will be of the same type as the first parameter, and will be no
285  * bigger than the first parameter. Second parameter must be a
286  * power-of-two value.
287  */
288 #define RTE_ALIGN_FLOOR(val, align) \
289         (typeof(val))((val) & (~((typeof(val))((align) - 1))))
290
291 /**
292  * Macro to align a pointer to a given power-of-two. The resultant
293  * pointer will be a pointer of the same type as the first parameter, and
294  * point to an address no lower than the first parameter. Second parameter
295  * must be a power-of-two value.
296  */
297 #define RTE_PTR_ALIGN_CEIL(ptr, align) \
298         RTE_PTR_ALIGN_FLOOR((typeof(ptr))RTE_PTR_ADD(ptr, (align) - 1), align)
299
300 /**
301  * Macro to align a value to a given power-of-two. The resultant value
302  * will be of the same type as the first parameter, and will be no lower
303  * than the first parameter. Second parameter must be a power-of-two
304  * value.
305  */
306 #define RTE_ALIGN_CEIL(val, align) \
307         RTE_ALIGN_FLOOR(((val) + ((typeof(val)) (align) - 1)), align)
308
309 /**
310  * Macro to align a pointer to a given power-of-two. The resultant
311  * pointer will be a pointer of the same type as the first parameter, and
312  * point to an address no lower than the first parameter. Second parameter
313  * must be a power-of-two value.
314  * This function is the same as RTE_PTR_ALIGN_CEIL
315  */
316 #define RTE_PTR_ALIGN(ptr, align) RTE_PTR_ALIGN_CEIL(ptr, align)
317
318 /**
319  * Macro to align a value to a given power-of-two. The resultant
320  * value will be of the same type as the first parameter, and
321  * will be no lower than the first parameter. Second parameter
322  * must be a power-of-two value.
323  * This function is the same as RTE_ALIGN_CEIL
324  */
325 #define RTE_ALIGN(val, align) RTE_ALIGN_CEIL(val, align)
326
327 /**
328  * Macro to align a value to the multiple of given value. The resultant
329  * value will be of the same type as the first parameter and will be no lower
330  * than the first parameter.
331  */
332 #define RTE_ALIGN_MUL_CEIL(v, mul) \
333         ((((v) + (typeof(v))(mul) - 1) / ((typeof(v))(mul))) * (typeof(v))(mul))
334
335 /**
336  * Macro to align a value to the multiple of given value. The resultant
337  * value will be of the same type as the first parameter and will be no higher
338  * than the first parameter.
339  */
340 #define RTE_ALIGN_MUL_FLOOR(v, mul) \
341         (((v) / ((typeof(v))(mul))) * (typeof(v))(mul))
342
343 /**
344  * Macro to align value to the nearest multiple of the given value.
345  * The resultant value might be greater than or less than the first parameter
346  * whichever difference is the lowest.
347  */
348 #define RTE_ALIGN_MUL_NEAR(v, mul)                              \
349         ({                                                      \
350                 typeof(v) ceil = RTE_ALIGN_MUL_CEIL(v, mul);    \
351                 typeof(v) floor = RTE_ALIGN_MUL_FLOOR(v, mul);  \
352                 (ceil - (v)) > ((v) - floor) ? floor : ceil;    \
353         })
354
355 /**
356  * Checks if a pointer is aligned to a given power-of-two value
357  *
358  * @param ptr
359  *   The pointer whose alignment is to be checked
360  * @param align
361  *   The power-of-two value to which the ptr should be aligned
362  *
363  * @return
364  *   True(1) where the pointer is correctly aligned, false(0) otherwise
365  */
366 static inline int
367 rte_is_aligned(void *ptr, unsigned align)
368 {
369         return RTE_PTR_ALIGN(ptr, align) == ptr;
370 }
371
372 /*********** Macros for compile type checks ********/
373
374 /**
375  * Triggers an error at compilation time if the condition is true.
376  */
377 #define RTE_BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
378
379 /*********** Cache line related macros ********/
380
381 /** Cache line mask. */
382 #define RTE_CACHE_LINE_MASK (RTE_CACHE_LINE_SIZE-1)
383
384 /** Return the first cache-aligned value greater or equal to size. */
385 #define RTE_CACHE_LINE_ROUNDUP(size) \
386         (RTE_CACHE_LINE_SIZE * ((size + RTE_CACHE_LINE_SIZE - 1) / \
387         RTE_CACHE_LINE_SIZE))
388
389 /** Cache line size in terms of log2 */
390 #if RTE_CACHE_LINE_SIZE == 64
391 #define RTE_CACHE_LINE_SIZE_LOG2 6
392 #elif RTE_CACHE_LINE_SIZE == 128
393 #define RTE_CACHE_LINE_SIZE_LOG2 7
394 #else
395 #error "Unsupported cache line size"
396 #endif
397
398 /** Minimum Cache line size. */
399 #define RTE_CACHE_LINE_MIN_SIZE 64
400
401 /** Force alignment to cache line. */
402 #define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE)
403
404 /** Force minimum cache line alignment. */
405 #define __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE)
406
407 /*********** PA/IOVA type definitions ********/
408
409 /** Physical address */
410 typedef uint64_t phys_addr_t;
411 #define RTE_BAD_PHYS_ADDR ((phys_addr_t)-1)
412
413 /**
414  * IO virtual address type.
415  * When the physical addressing mode (IOVA as PA) is in use,
416  * the translation from an IO virtual address (IOVA) to a physical address
417  * is a direct mapping, i.e. the same value.
418  * Otherwise, in virtual mode (IOVA as VA), an IOMMU may do the translation.
419  */
420 typedef uint64_t rte_iova_t;
421 #define RTE_BAD_IOVA ((rte_iova_t)-1)
422
423 /*********** Structure alignment markers ********/
424
425 /** Generic marker for any place in a structure. */
426 __extension__ typedef void    *RTE_MARKER[0];
427 /** Marker for 1B alignment in a structure. */
428 __extension__ typedef uint8_t  RTE_MARKER8[0];
429 /** Marker for 2B alignment in a structure. */
430 __extension__ typedef uint16_t RTE_MARKER16[0];
431 /** Marker for 4B alignment in a structure. */
432 __extension__ typedef uint32_t RTE_MARKER32[0];
433 /** Marker for 8B alignment in a structure. */
434 __extension__ typedef uint64_t RTE_MARKER64[0];
435
436 /**
437  * Combines 32b inputs most significant set bits into the least
438  * significant bits to construct a value with the same MSBs as x
439  * but all 1's under it.
440  *
441  * @param x
442  *    The integer whose MSBs need to be combined with its LSBs
443  * @return
444  *    The combined value.
445  */
446 static inline uint32_t
447 rte_combine32ms1b(uint32_t x)
448 {
449         x |= x >> 1;
450         x |= x >> 2;
451         x |= x >> 4;
452         x |= x >> 8;
453         x |= x >> 16;
454
455         return x;
456 }
457
458 /**
459  * Combines 64b inputs most significant set bits into the least
460  * significant bits to construct a value with the same MSBs as x
461  * but all 1's under it.
462  *
463  * @param v
464  *    The integer whose MSBs need to be combined with its LSBs
465  * @return
466  *    The combined value.
467  */
468 static inline uint64_t
469 rte_combine64ms1b(uint64_t v)
470 {
471         v |= v >> 1;
472         v |= v >> 2;
473         v |= v >> 4;
474         v |= v >> 8;
475         v |= v >> 16;
476         v |= v >> 32;
477
478         return v;
479 }
480
481 /*********** Macros to work with powers of 2 ********/
482
483 /**
484  * Macro to return 1 if n is a power of 2, 0 otherwise
485  */
486 #define RTE_IS_POWER_OF_2(n) ((n) && !(((n) - 1) & (n)))
487
488 /**
489  * Returns true if n is a power of 2
490  * @param n
491  *     Number to check
492  * @return 1 if true, 0 otherwise
493  */
494 static inline int
495 rte_is_power_of_2(uint32_t n)
496 {
497         return n && !(n & (n - 1));
498 }
499
500 /**
501  * Aligns input parameter to the next power of 2
502  *
503  * @param x
504  *   The integer value to align
505  *
506  * @return
507  *   Input parameter aligned to the next power of 2
508  */
509 static inline uint32_t
510 rte_align32pow2(uint32_t x)
511 {
512         x--;
513         x = rte_combine32ms1b(x);
514
515         return x + 1;
516 }
517
518 /**
519  * Aligns input parameter to the previous power of 2
520  *
521  * @param x
522  *   The integer value to align
523  *
524  * @return
525  *   Input parameter aligned to the previous power of 2
526  */
527 static inline uint32_t
528 rte_align32prevpow2(uint32_t x)
529 {
530         x = rte_combine32ms1b(x);
531
532         return x - (x >> 1);
533 }
534
535 /**
536  * Aligns 64b input parameter to the next power of 2
537  *
538  * @param v
539  *   The 64b value to align
540  *
541  * @return
542  *   Input parameter aligned to the next power of 2
543  */
544 static inline uint64_t
545 rte_align64pow2(uint64_t v)
546 {
547         v--;
548         v = rte_combine64ms1b(v);
549
550         return v + 1;
551 }
552
553 /**
554  * Aligns 64b input parameter to the previous power of 2
555  *
556  * @param v
557  *   The 64b value to align
558  *
559  * @return
560  *   Input parameter aligned to the previous power of 2
561  */
562 static inline uint64_t
563 rte_align64prevpow2(uint64_t v)
564 {
565         v = rte_combine64ms1b(v);
566
567         return v - (v >> 1);
568 }
569
570 /*********** Macros for calculating min and max **********/
571
572 /**
573  * Macro to return the minimum of two numbers
574  */
575 #define RTE_MIN(a, b) \
576         __extension__ ({ \
577                 typeof (a) _a = (a); \
578                 typeof (b) _b = (b); \
579                 _a < _b ? _a : _b; \
580         })
581
582 /**
583  * Macro to return the maximum of two numbers
584  */
585 #define RTE_MAX(a, b) \
586         __extension__ ({ \
587                 typeof (a) _a = (a); \
588                 typeof (b) _b = (b); \
589                 _a > _b ? _a : _b; \
590         })
591
592 /*********** Other general functions / macros ********/
593
594 /**
595  * Searches the input parameter for the least significant set bit
596  * (starting from zero).
597  * If a least significant 1 bit is found, its bit index is returned.
598  * If the content of the input parameter is zero, then the content of the return
599  * value is undefined.
600  * @param v
601  *     input parameter, should not be zero.
602  * @return
603  *     least significant set bit in the input parameter.
604  */
605 static inline uint32_t
606 rte_bsf32(uint32_t v)
607 {
608         return (uint32_t)__builtin_ctz(v);
609 }
610
611 /**
612  * Searches the input parameter for the least significant set bit
613  * (starting from zero). Safe version (checks for input parameter being zero).
614  *
615  * @warning ``pos`` must be a valid pointer. It is not checked!
616  *
617  * @param v
618  *     The input parameter.
619  * @param pos
620  *     If ``v`` was not 0, this value will contain position of least significant
621  *     bit within the input parameter.
622  * @return
623  *     Returns 0 if ``v`` was 0, otherwise returns 1.
624  */
625 static inline int
626 rte_bsf32_safe(uint32_t v, uint32_t *pos)
627 {
628         if (v == 0)
629                 return 0;
630
631         *pos = rte_bsf32(v);
632         return 1;
633 }
634
635 /**
636  * Return the rounded-up log2 of a integer.
637  *
638  * @note Contrary to the logarithm mathematical operation,
639  * rte_log2_u32(0) == 0 and not -inf.
640  *
641  * @param v
642  *     The input parameter.
643  * @return
644  *     The rounded-up log2 of the input, or 0 if the input is 0.
645  */
646 static inline uint32_t
647 rte_log2_u32(uint32_t v)
648 {
649         if (v == 0)
650                 return 0;
651         v = rte_align32pow2(v);
652         return rte_bsf32(v);
653 }
654
655
656 /**
657  * Return the last (most-significant) bit set.
658  *
659  * @note The last (most significant) bit is at position 32.
660  * @note rte_fls_u32(0) = 0, rte_fls_u32(1) = 1, rte_fls_u32(0x80000000) = 32
661  *
662  * @param x
663  *     The input parameter.
664  * @return
665  *     The last (most-significant) bit set, or 0 if the input is 0.
666  */
667 static inline int
668 rte_fls_u32(uint32_t x)
669 {
670         return (x == 0) ? 0 : 32 - __builtin_clz(x);
671 }
672
673 /**
674  * Searches the input parameter for the least significant set bit
675  * (starting from zero).
676  * If a least significant 1 bit is found, its bit index is returned.
677  * If the content of the input parameter is zero, then the content of the return
678  * value is undefined.
679  * @param v
680  *     input parameter, should not be zero.
681  * @return
682  *     least significant set bit in the input parameter.
683  */
684 static inline int
685 rte_bsf64(uint64_t v)
686 {
687         return (uint32_t)__builtin_ctzll(v);
688 }
689
690 /**
691  * Searches the input parameter for the least significant set bit
692  * (starting from zero). Safe version (checks for input parameter being zero).
693  *
694  * @warning ``pos`` must be a valid pointer. It is not checked!
695  *
696  * @param v
697  *     The input parameter.
698  * @param pos
699  *     If ``v`` was not 0, this value will contain position of least significant
700  *     bit within the input parameter.
701  * @return
702  *     Returns 0 if ``v`` was 0, otherwise returns 1.
703  */
704 static inline int
705 rte_bsf64_safe(uint64_t v, uint32_t *pos)
706 {
707         if (v == 0)
708                 return 0;
709
710         *pos = rte_bsf64(v);
711         return 1;
712 }
713
714 /**
715  * Return the last (most-significant) bit set.
716  *
717  * @note The last (most significant) bit is at position 64.
718  * @note rte_fls_u64(0) = 0, rte_fls_u64(1) = 1,
719  *       rte_fls_u64(0x8000000000000000) = 64
720  *
721  * @param x
722  *     The input parameter.
723  * @return
724  *     The last (most-significant) bit set, or 0 if the input is 0.
725  */
726 static inline int
727 rte_fls_u64(uint64_t x)
728 {
729         return (x == 0) ? 0 : 64 - __builtin_clzll(x);
730 }
731
732 /**
733  * Return the rounded-up log2 of a 64-bit integer.
734  *
735  * @note Contrary to the logarithm mathematical operation,
736  * rte_log2_u64(0) == 0 and not -inf.
737  *
738  * @param v
739  *     The input parameter.
740  * @return
741  *     The rounded-up log2 of the input, or 0 if the input is 0.
742  */
743 static inline uint32_t
744 rte_log2_u64(uint64_t v)
745 {
746         if (v == 0)
747                 return 0;
748         v = rte_align64pow2(v);
749         /* we checked for v being 0 already, so no undefined behavior */
750         return rte_bsf64(v);
751 }
752
753 #ifndef offsetof
754 /** Return the offset of a field in a structure. */
755 #define offsetof(TYPE, MEMBER)  __builtin_offsetof (TYPE, MEMBER)
756 #endif
757
758 /**
759  * Return pointer to the wrapping struct instance.
760  *
761  * Example:
762  *
763  *  struct wrapper {
764  *      ...
765  *      struct child c;
766  *      ...
767  *  };
768  *
769  *  struct child *x = obtain(...);
770  *  struct wrapper *w = container_of(x, struct wrapper, c);
771  */
772 #ifndef container_of
773 #define container_of(ptr, type, member) __extension__ ({                \
774                         const typeof(((type *)0)->member) *_ptr = (ptr); \
775                         __rte_unused type *_target_ptr =        \
776                                 (type *)(ptr);                          \
777                         (type *)(((uintptr_t)_ptr) - offsetof(type, member)); \
778                 })
779 #endif
780
781 /** Swap two variables. */
782 #define RTE_SWAP(a, b) \
783         __extension__ ({ \
784                 typeof (a) _a = a; \
785                 a = b; \
786                 b = _a; \
787         })
788
789 /**
790  * Get the size of a field in a structure.
791  *
792  * @param type
793  *   The type of the structure.
794  * @param field
795  *   The field in the structure.
796  * @return
797  *   The size of the field in the structure, in bytes.
798  */
799 #define RTE_SIZEOF_FIELD(type, field) (sizeof(((type *)0)->field))
800
801 #define _RTE_STR(x) #x
802 /** Take a macro value and get a string version of it */
803 #define RTE_STR(x) _RTE_STR(x)
804
805 /**
806  * ISO C helpers to modify format strings using variadic macros.
807  * This is a replacement for the ", ## __VA_ARGS__" GNU extension.
808  * An empty %s argument is appended to avoid a dangling comma.
809  */
810 #define RTE_FMT(fmt, ...) fmt "%.0s", __VA_ARGS__ ""
811 #define RTE_FMT_HEAD(fmt, ...) fmt
812 #define RTE_FMT_TAIL(fmt, ...) __VA_ARGS__
813
814 /** Mask value of type "tp" for the first "ln" bit set. */
815 #define RTE_LEN2MASK(ln, tp)    \
816         ((tp)((uint64_t)-1 >> (sizeof(uint64_t) * CHAR_BIT - (ln))))
817
818 /** Number of elements in the array. */
819 #define RTE_DIM(a)      (sizeof (a) / sizeof ((a)[0]))
820
821 /**
822  * Converts a numeric string to the equivalent uint64_t value.
823  * As well as straight number conversion, also recognises the suffixes
824  * k, m and g for kilobytes, megabytes and gigabytes respectively.
825  *
826  * If a negative number is passed in  i.e. a string with the first non-black
827  * character being "-", zero is returned. Zero is also returned in the case of
828  * an error with the strtoull call in the function.
829  *
830  * @param str
831  *     String containing number to convert.
832  * @return
833  *     Number.
834  */
835 static inline uint64_t
836 rte_str_to_size(const char *str)
837 {
838         char *endptr;
839         unsigned long long size;
840
841         while (isspace((int)*str))
842                 str++;
843         if (*str == '-')
844                 return 0;
845
846         errno = 0;
847         size = strtoull(str, &endptr, 0);
848         if (errno)
849                 return 0;
850
851         if (*endptr == ' ')
852                 endptr++; /* allow 1 space gap */
853
854         switch (*endptr){
855         case 'G': case 'g': size *= 1024; /* fall-through */
856         case 'M': case 'm': size *= 1024; /* fall-through */
857         case 'K': case 'k': size *= 1024; /* fall-through */
858         default:
859                 break;
860         }
861         return size;
862 }
863
864 /**
865  * Function to terminate the application immediately, printing an error
866  * message and returning the exit_code back to the shell.
867  *
868  * This function never returns
869  *
870  * @param exit_code
871  *     The exit code to be returned by the application
872  * @param format
873  *     The format string to be used for printing the message. This can include
874  *     printf format characters which will be expanded using any further parameters
875  *     to the function.
876  */
877 __rte_noreturn void
878 rte_exit(int exit_code, const char *format, ...)
879         __rte_format_printf(2, 3);
880
881 #ifdef __cplusplus
882 }
883 #endif
884
885 #endif