summaryrefslogtreecommitdiffstats
path: root/vppinfra/vppinfra/smp_fifo.h
diff options
context:
space:
mode:
Diffstat (limited to 'vppinfra/vppinfra/smp_fifo.h')
-rw-r--r--vppinfra/vppinfra/smp_fifo.h92
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:
+ */