diff options
Diffstat (limited to 'vppinfra/vppinfra/smp_fifo.h')
-rw-r--r-- | vppinfra/vppinfra/smp_fifo.h | 92 |
1 files changed, 60 insertions, 32 deletions
diff --git a/vppinfra/vppinfra/smp_fifo.h b/vppinfra/vppinfra/smp_fifo.h index 2162c8b1e27..c74a77c8e9b 100644 --- a/vppinfra/vppinfra/smp_fifo.h +++ b/vppinfra/vppinfra/smp_fifo.h @@ -46,15 +46,17 @@ _ (write_done) \ _ (read_fetch) -typedef enum { +typedef enum +{ #define _(f) CLIB_SMP_FIFO_DATA_STATE_##f, foreach_clib_smp_fifo_data_state #undef _ - CLIB_SMP_FIFO_N_DATA_STATE, + CLIB_SMP_FIFO_N_DATA_STATE, } clib_smp_fifo_data_state_t; /* Footer at end of each data element. */ -typedef struct { +typedef struct +{ /* Magic number marking valid footer plus state encoded in low bits. */ u32 magic_state; } clib_smp_fifo_data_footer_t; @@ -76,9 +78,12 @@ clib_smp_fifo_data_footer_get_state (clib_smp_fifo_data_footer_t * f) always_inline void clib_smp_fifo_data_footer_set_state (clib_smp_fifo_data_footer_t * f, clib_smp_fifo_data_state_t s) -{ f->magic_state = CLIB_SMP_DATA_FOOTER_MAGIC + s; } +{ + f->magic_state = CLIB_SMP_DATA_FOOTER_MAGIC + s; +} -typedef struct { +typedef struct +{ /* Read/write indices each on their own cache line. Atomic incremented for each read/write. */ u32 read_index, write_index; @@ -90,16 +95,18 @@ typedef struct { u32 log2_max_n_elts; /* Cache aligned data. */ - void * data; + void *data; } clib_smp_fifo_t; /* External functions. */ -clib_smp_fifo_t * clib_smp_fifo_init (uword max_n_elts, uword n_bytes_per_elt); +clib_smp_fifo_t *clib_smp_fifo_init (uword max_n_elts, uword n_bytes_per_elt); /* Elements are always cache-line sized; this is to avoid smp cache thrashing. */ always_inline uword clib_smp_fifo_round_elt_bytes (uword n_bytes_per_elt) -{ return round_pow2 (n_bytes_per_elt, CLIB_CACHE_LINE_BYTES); } +{ + return round_pow2 (n_bytes_per_elt, CLIB_CACHE_LINE_BYTES); +} always_inline uword clib_smp_fifo_n_elts (clib_smp_fifo_t * f) @@ -110,30 +117,32 @@ clib_smp_fifo_n_elts (clib_smp_fifo_t * f) } always_inline clib_smp_fifo_data_footer_t * -clib_smp_fifo_get_data_footer (void * d, uword n_bytes_per_elt) +clib_smp_fifo_get_data_footer (void *d, uword n_bytes_per_elt) { - clib_smp_fifo_data_footer_t * f; + clib_smp_fifo_data_footer_t *f; f = d + clib_smp_fifo_round_elt_bytes (n_bytes_per_elt) - sizeof (f[0]); return f; } always_inline void * -clib_smp_fifo_elt_at_index (clib_smp_fifo_t * f, uword n_bytes_per_elt, uword i) +clib_smp_fifo_elt_at_index (clib_smp_fifo_t * f, uword n_bytes_per_elt, + uword i) { uword n_bytes_per_elt_cache_aligned; ASSERT (i <= f->max_n_elts_less_one); - n_bytes_per_elt_cache_aligned = clib_smp_fifo_round_elt_bytes (n_bytes_per_elt); - + n_bytes_per_elt_cache_aligned = + clib_smp_fifo_round_elt_bytes (n_bytes_per_elt); + return f->data + i * n_bytes_per_elt_cache_aligned; } always_inline void * clib_smp_fifo_write_alloc (clib_smp_fifo_t * f, uword n_bytes_per_elt) { - void * d; - clib_smp_fifo_data_footer_t * t; + void *d; + clib_smp_fifo_data_footer_t *t; clib_smp_fifo_data_state_t s; u32 wi0, wi1; @@ -147,7 +156,9 @@ clib_smp_fifo_write_alloc (clib_smp_fifo_t * f, uword n_bytes_per_elt) { wi1 = wi0 + 1; - d = clib_smp_fifo_elt_at_index (f, n_bytes_per_elt, wi0 & f->max_n_elts_less_one); + d = + clib_smp_fifo_elt_at_index (f, n_bytes_per_elt, + wi0 & f->max_n_elts_less_one); t = clib_smp_fifo_get_data_footer (d, n_bytes_per_elt); s = clib_smp_fifo_data_footer_get_state (t); @@ -161,7 +172,8 @@ clib_smp_fifo_write_alloc (clib_smp_fifo_t * f, uword n_bytes_per_elt) if (wi1 == wi0) { - clib_smp_fifo_data_footer_set_state (t, CLIB_SMP_FIFO_DATA_STATE_write_alloc); + clib_smp_fifo_data_footer_set_state (t, + CLIB_SMP_FIFO_DATA_STATE_write_alloc); break; } @@ -173,9 +185,9 @@ clib_smp_fifo_write_alloc (clib_smp_fifo_t * f, uword n_bytes_per_elt) } always_inline void -clib_smp_fifo_write_done (clib_smp_fifo_t * f, void * d, uword n_bytes_per_elt) +clib_smp_fifo_write_done (clib_smp_fifo_t * f, void *d, uword n_bytes_per_elt) { - clib_smp_fifo_data_footer_t * t; + clib_smp_fifo_data_footer_t *t; /* Flush out pending writes before we change state to write_done. This will hold off readers until data is flushed. */ @@ -183,15 +195,17 @@ clib_smp_fifo_write_done (clib_smp_fifo_t * f, void * d, uword n_bytes_per_elt) t = clib_smp_fifo_get_data_footer (d, n_bytes_per_elt); - ASSERT (clib_smp_fifo_data_footer_get_state (t) == CLIB_SMP_FIFO_DATA_STATE_write_alloc); - clib_smp_fifo_data_footer_set_state (t, CLIB_SMP_FIFO_DATA_STATE_write_done); + ASSERT (clib_smp_fifo_data_footer_get_state (t) == + CLIB_SMP_FIFO_DATA_STATE_write_alloc); + clib_smp_fifo_data_footer_set_state (t, + CLIB_SMP_FIFO_DATA_STATE_write_done); } always_inline void * clib_smp_fifo_read_fetch (clib_smp_fifo_t * f, uword n_bytes_per_elt) { - void * d; - clib_smp_fifo_data_footer_t * t; + void *d; + clib_smp_fifo_data_footer_t *t; clib_smp_fifo_data_state_t s; u32 ri0, ri1; @@ -205,7 +219,9 @@ clib_smp_fifo_read_fetch (clib_smp_fifo_t * f, uword n_bytes_per_elt) { ri1 = ri0 + 1; - d = clib_smp_fifo_elt_at_index (f, n_bytes_per_elt, ri0 & f->max_n_elts_less_one); + d = + clib_smp_fifo_elt_at_index (f, n_bytes_per_elt, + ri0 & f->max_n_elts_less_one); t = clib_smp_fifo_get_data_footer (d, n_bytes_per_elt); s = clib_smp_fifo_data_footer_get_state (t); @@ -218,7 +234,8 @@ clib_smp_fifo_read_fetch (clib_smp_fifo_t * f, uword n_bytes_per_elt) ri1 = clib_smp_compare_and_swap (&f->read_index, ri1, ri0); if (ri1 == ri0) { - clib_smp_fifo_data_footer_set_state (t, CLIB_SMP_FIFO_DATA_STATE_read_fetch); + clib_smp_fifo_data_footer_set_state (t, + CLIB_SMP_FIFO_DATA_STATE_read_fetch); break; } @@ -229,13 +246,14 @@ clib_smp_fifo_read_fetch (clib_smp_fifo_t * f, uword n_bytes_per_elt) } always_inline void -clib_smp_fifo_read_done (clib_smp_fifo_t * f, void * d, uword n_bytes_per_elt) +clib_smp_fifo_read_done (clib_smp_fifo_t * f, void *d, uword n_bytes_per_elt) { - clib_smp_fifo_data_footer_t * t; + clib_smp_fifo_data_footer_t *t; t = clib_smp_fifo_get_data_footer (d, n_bytes_per_elt); - ASSERT (clib_smp_fifo_data_footer_get_state (t) == CLIB_SMP_FIFO_DATA_STATE_read_fetch); + ASSERT (clib_smp_fifo_data_footer_get_state (t) == + CLIB_SMP_FIFO_DATA_STATE_read_fetch); clib_smp_fifo_data_footer_set_state (t, CLIB_SMP_FIFO_DATA_STATE_free); } @@ -265,21 +283,31 @@ clib_smp_fifo_memcpy (uword * dst, uword * src, uword n_bytes) } always_inline void -clib_smp_fifo_write_inline (clib_smp_fifo_t * f, void * elt_to_write, uword n_bytes_per_elt) +clib_smp_fifo_write_inline (clib_smp_fifo_t * f, void *elt_to_write, + uword n_bytes_per_elt) { - uword * dst; + uword *dst; dst = clib_smp_fifo_write_alloc (f, n_bytes_per_elt); clib_smp_fifo_memcpy (dst, elt_to_write, n_bytes_per_elt); clib_smp_fifo_write_done (f, dst, n_bytes_per_elt); } always_inline void -clib_smp_fifo_read_inline (clib_smp_fifo_t * f, void * elt_to_read, uword n_bytes_per_elt) +clib_smp_fifo_read_inline (clib_smp_fifo_t * f, void *elt_to_read, + uword n_bytes_per_elt) { - uword * src; + uword *src; src = clib_smp_fifo_read_fetch (f, n_bytes_per_elt); clib_smp_fifo_memcpy (elt_to_read, src, n_bytes_per_elt); clib_smp_fifo_read_done (f, src, n_bytes_per_elt); } #endif /* included_clib_smp_vec_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |