+ tail_idx -= c->start_byte;
+ n_chunk = c->length - tail_idx;
+ if (n_chunk <= len)
+ {
+ u32 to_copy = len;
+ clib_memcpy_fast (&c->data[tail_idx], src, n_chunk);
+ c = c->next;
+ while ((to_copy -= n_chunk))
+ {
+ n_chunk = clib_min (c->length, to_copy);
+ clib_memcpy_fast (&c->data[0], src + (len - to_copy), n_chunk);
+ c = c->length <= to_copy ? c->next : c;
+ }
+ if (*last)
+ *last = c;
+ }
+ else
+ {
+ clib_memcpy_fast (&c->data[tail_idx], src, len);
+ }
+}
+
+CLIB_MARCH_FN (svm_fifo_copy_from_chunk, void, svm_fifo_t * f,
+ svm_fifo_chunk_t * c, u32 head_idx, u8 * dst, u32 len,
+ svm_fifo_chunk_t ** last)
+{
+ u32 n_chunk;
+
+ ASSERT (head_idx >= c->start_byte && head_idx < c->start_byte + c->length);
+
+ head_idx -= c->start_byte;
+ n_chunk = c->length - head_idx;
+ if (n_chunk <= len)
+ {
+ u32 to_copy = len;
+ clib_memcpy_fast (dst, &c->data[head_idx], n_chunk);
+ c = c->next;
+ while ((to_copy -= n_chunk))
+ {
+ n_chunk = clib_min (c->length, to_copy);
+ clib_memcpy_fast (dst + (len - to_copy), &c->data[0], n_chunk);
+ c = c->length <= to_copy ? c->next : c;
+ }
+ if (*last)
+ *last = c;
+ }
+ else
+ {
+ clib_memcpy_fast (dst, &c->data[head_idx], len);
+ }
+}
+
+#ifndef CLIB_MARCH_VARIANT
+
+static inline void
+svm_fifo_copy_to_chunk (svm_fifo_t * f, svm_fifo_chunk_t * c, u32 tail_idx,
+ const u8 * src, u32 len, svm_fifo_chunk_t ** last)
+{
+ CLIB_MARCH_FN_SELECT (svm_fifo_copy_to_chunk) (f, c, tail_idx, src, len,
+ last);
+}
+
+static inline void
+svm_fifo_copy_from_chunk (svm_fifo_t * f, svm_fifo_chunk_t * c, u32 head_idx,
+ u8 * dst, u32 len, svm_fifo_chunk_t ** last)
+{
+ CLIB_MARCH_FN_SELECT (svm_fifo_copy_from_chunk) (f, c, head_idx, dst, len,
+ last);
+}
+
+static inline u8
+position_lt (svm_fifo_t * f, u32 a, u32 b, u32 tail)
+{
+ return (f_distance_to (f, a, tail) < f_distance_to (f, b, tail));
+}
+
+static inline u8
+position_leq (svm_fifo_t * f, u32 a, u32 b, u32 tail)
+{
+ return (f_distance_to (f, a, tail) <= f_distance_to (f, b, tail));
+}
+
+static inline u8
+position_gt (svm_fifo_t * f, u32 a, u32 b, u32 tail)
+{
+ return (f_distance_to (f, a, tail) > f_distance_to (f, b, tail));
+}
+
+static inline u32
+position_diff (svm_fifo_t * f, u32 a, u32 b, u32 tail)
+{
+ return f_distance_to (f, a, tail) - f_distance_to (f, b, tail);
+}