util.h File Reference

General utility functions. More...

Data Structures

struct  spdk_ioviter
 An iovec iterator. More...
 

Macros

#define SPDK_CACHE_LINE_SIZE   64
 
#define spdk_min(a, b)   (((a)<(b))?(a):(b))
 
#define spdk_max(a, b)   (((a)>(b))?(a):(b))
 
#define SPDK_COUNTOF(arr)   (sizeof(arr) / sizeof((arr)[0]))
 
#define SPDK_CONTAINEROF(ptr, type, member)   ((type *)((uintptr_t)ptr - offsetof(type, member)))
 
#define SPDK_SIZEOF_MEMBER(type, member)   (sizeof(((type *)0)->member))
 Get the size of a member of a struct.
 
#define SPDK_SEC_TO_USEC   1000000ULL
 
#define SPDK_SEC_TO_NSEC   1000000000ULL
 
#define SPDK_CEIL_DIV(x, y)   (((x)+(y)-1)/(y))
 
#define SPDK_ALIGN_FLOOR(val, align)    (__typeof__(val))((val) & (~((__typeof__(val))((align) - 1))))
 Macro to align a value to a given power-of-two. More...
 
#define SPDK_ALIGN_CEIL(val, align)    SPDK_ALIGN_FLOOR(((val) + ((__typeof__(val)) (align) - 1)), align)
 Macro to align a value to a given power-of-two. More...
 
#define SPDK_CLANG_ANALYZER_PREINIT_PTR_ARRAY(arr, arr_size, buf_size)
 Scan build is really pessimistic and assumes that mempool functions can dequeue NULL buffers even if they return success. More...
 
#define SPDK_SN32_CMPMAX   (1U << (32 - 1))
 

Functions

uint32_t spdk_u32log2 (uint32_t x)
 
static uint32_t spdk_align32pow2 (uint32_t x)
 
uint64_t spdk_u64log2 (uint64_t x)
 
static uint64_t spdk_align64pow2 (uint64_t x)
 
static bool spdk_u32_is_pow2 (uint32_t x)
 Check if a uint32_t is a power of 2.
 
static bool spdk_u64_is_pow2 (uint64_t x)
 Check if a uint64_t is a power of 2.
 
static uint64_t spdk_divide_round_up (uint64_t num, uint64_t divisor)
 
size_t spdk_iovcpy (struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt)
 Copy the data described by the source iovec to the destination iovec. More...
 
size_t spdk_ioviter_first (struct spdk_ioviter *iter, struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt, void **src, void **dst)
 Initialize and move to the first common segment of the two given iovecs. More...
 
size_t spdk_ioviter_next (struct spdk_ioviter *iter, void **src, void **dst)
 Move to the next segment in the iterator. More...
 
void spdk_copy_iovs_to_buf (void *buf, size_t buf_len, struct iovec *iovs, int iovcnt)
 Copy iovs contents to buf through memcpy.
 
void spdk_copy_buf_to_iovs (struct iovec *iovs, int iovcnt, void *buf, size_t buf_len)
 Copy buf contents to iovs through memcpy.
 
static uint32_t spdk_sn32_add (uint32_t s1, uint32_t s2)
 Add two sequence numbers s1 and s2. More...
 
static bool spdk_sn32_lt (uint32_t s1, uint32_t s2)
 Compare if sequence number s1 is less than s2. More...
 
static bool spdk_sn32_gt (uint32_t s1, uint32_t s2)
 Compare if sequence number s1 is greater than s2. More...
 

Detailed Description

General utility functions.

Macro Definition Documentation

◆ SPDK_ALIGN_CEIL

#define SPDK_ALIGN_CEIL (   val,
  align 
)     SPDK_ALIGN_FLOOR(((val) + ((__typeof__(val)) (align) - 1)), align)

Macro to align a value to a given power-of-two.

The resultant value will be of the same type as the first parameter, and will be no lower than the first parameter. Second parameter must be a power-of-two value.

◆ SPDK_ALIGN_FLOOR

#define SPDK_ALIGN_FLOOR (   val,
  align 
)     (__typeof__(val))((val) & (~((__typeof__(val))((align) - 1))))

Macro to align a value to a given power-of-two.

The resultant value will be of the same type as the first parameter, and will be no bigger than the first parameter. Second parameter must be a power-of-two value.

◆ SPDK_CLANG_ANALYZER_PREINIT_PTR_ARRAY

#define SPDK_CLANG_ANALYZER_PREINIT_PTR_ARRAY (   arr,
  arr_size,
  buf_size 
)
Value:
do { \
static char dummy_buf[buf_size]; \
int i; \
for (i = 0; i < arr_size; i++) { \
arr[i] = (void *)dummy_buf; \
} \
} while (0)

Scan build is really pessimistic and assumes that mempool functions can dequeue NULL buffers even if they return success.

This is obviously a false positive, but the mempool dequeue can be done in a DPDK inline function that we can't decorate with usual assert(buf != NULL). Instead, we'll preinitialize the dequeued buffer array with some dummy objects.

Function Documentation

◆ spdk_iovcpy()

size_t spdk_iovcpy ( struct iovec *  siov,
size_t  siovcnt,
struct iovec *  diov,
size_t  diovcnt 
)

Copy the data described by the source iovec to the destination iovec.

Returns
The number of bytes copied.

◆ spdk_ioviter_first()

size_t spdk_ioviter_first ( struct spdk_ioviter iter,
struct iovec *  siov,
size_t  siovcnt,
struct iovec *  diov,
size_t  diovcnt,
void **  src,
void **  dst 
)

Initialize and move to the first common segment of the two given iovecs.

See spdk_ioviter_next().

◆ spdk_ioviter_next()

size_t spdk_ioviter_next ( struct spdk_ioviter iter,
void **  src,
void **  dst 
)

Move to the next segment in the iterator.

This will iterate through the segments of the source and destination and return the individual segments, one by one. For example, if the source consists of one element of length 4k and the destination consists of 4 elements each of length 1k, this function will return 4 1k src+dst pairs of buffers, and then return 0 bytes to indicate the iteration is complete on the fifth call.

◆ spdk_sn32_add()

static uint32_t spdk_sn32_add ( uint32_t  s1,
uint32_t  s2 
)
inlinestatic

Add two sequence numbers s1 and s2.

Parameters
s1First sequence number
s2Second sequence number
Returns
Sum of s1 and s2 based on serial number arithmetic.

◆ spdk_sn32_gt()

static bool spdk_sn32_gt ( uint32_t  s1,
uint32_t  s2 
)
inlinestatic

Compare if sequence number s1 is greater than s2.

Parameters
s1First sequence number
s2Second sequence number
Returns
true if s1 is greater than s2, or false otherwise.

◆ spdk_sn32_lt()

static bool spdk_sn32_lt ( uint32_t  s1,
uint32_t  s2 
)
inlinestatic

Compare if sequence number s1 is less than s2.

Parameters
s1First sequence number
s2Second sequence number
Returns
true if s1 is less than s2, or false otherwise.