+ ft_fifo_free (fs, f);
+ ft_fifo_segment_free (fsm, fs);
+
+ return 0;
+}
+
+static void
+validate_test_and_buf_vecs (u8 ** test_data, u8 ** data_buf, u32 len)
+{
+ int i, cur_len;
+
+ cur_len = vec_len (*test_data);
+ vec_validate (*test_data, len - 1);
+ vec_validate (*data_buf, len - 1);
+
+ for (i = cur_len; i < vec_len (*test_data); i++)
+ (*test_data)[i] = i;
+}
+
+static int
+enqueue_ooo (svm_fifo_t * f, u8 * test_data, u32 len, u32 iterations)
+{
+ u32 offset, enq_now, ooo_chunk;
+ int i, rv;
+
+ ooo_chunk = len / iterations;
+ for (i = iterations; i > 0; i--)
+ {
+ offset = i * ooo_chunk;
+ enq_now = clib_min (ooo_chunk, len - offset);
+ if (!enq_now)
+ continue;
+ rv = svm_fifo_enqueue_with_offset (f, offset, enq_now,
+ test_data + offset);
+ if (rv)
+ return rv;
+ }
+
+ return 0;
+}
+
+static int
+enqueue_ooo_packets (svm_fifo_t * f, u32 len, u32 enq_chunk, u8 * test_data)
+{
+ u32 offset, enq_now;
+ int i, rv;
+
+ for (i = 1; i <= len / enq_chunk; i++)
+ {
+ offset = i * enq_chunk;
+ enq_now = clib_min (enq_chunk, len - offset);
+ if (!enq_now)
+ continue;
+ rv = svm_fifo_enqueue_with_offset (f, offset, enq_now,
+ test_data + offset);
+ if (rv)
+ return rv;
+
+ if (svm_fifo_size (f) < len - 4096)
+ svm_fifo_set_size (f, svm_fifo_size (f) + enq_now);
+ else
+ svm_fifo_set_size (f, len);
+ }
+
+ return 0;
+}
+
+static int
+enqueue_packets_inc (svm_fifo_t * f, u32 len, u32 enq_chunk, u8 * test_data)
+{
+ u32 enq_now, offset;
+ int i, rv;
+
+ for (i = 0; i <= len / enq_chunk; i++)
+ {
+ offset = i * enq_chunk;
+ enq_now = clib_min (enq_chunk, len - offset);
+ rv = svm_fifo_enqueue (f, enq_now, test_data + offset);
+ if (rv != enq_now)
+ return -1;
+ if (svm_fifo_size (f) < len - 4096)
+ svm_fifo_set_size (f, svm_fifo_size (f) + enq_now);
+ else
+ svm_fifo_set_size (f, len);
+ }
+ return 0;
+}
+
+static int
+dequeue_ooo (svm_fifo_t * f, u8 * data_buf, u32 len, u32 iterations)
+{
+ u32 offset, ooo_chunk, deq_now;
+ int i, rv;
+
+ ooo_chunk = len / iterations;
+ for (i = iterations; i >= 0; i--)
+ {
+ offset = i * ooo_chunk;
+ deq_now = clib_min (ooo_chunk, len - offset);
+ if (deq_now == 0)
+ continue;
+ rv = svm_fifo_peek (f, offset, deq_now, data_buf + offset);
+ if (rv != deq_now)
+ return rv;
+ }
+ return 0;
+}
+
+static int
+dequeue_ooo_inc (svm_fifo_t * f, u8 * data_buf, u32 len, u32 iterations)
+{
+ u32 offset, ooo_chunk, deq_now;
+ int i, rv;
+
+ ooo_chunk = len / iterations;
+ for (i = 0; i <= iterations; i++)
+ {
+ offset = i * ooo_chunk;
+ deq_now = clib_min (ooo_chunk, len - offset);
+ if (deq_now == 0)
+ continue;
+ rv = svm_fifo_peek (f, offset, deq_now, data_buf + offset);
+ if (rv != deq_now)
+ return rv;
+ }
+ return 0;
+}
+
+static int
+dequeue_packets (svm_fifo_t * f, u32 len, u32 deq_chunk, u8 * data_buf)
+{
+ u32 offset, deq_now;
+ int i, rv;
+
+ for (i = 0; i <= len / deq_chunk; i++)
+ {
+ offset = i * deq_chunk;
+ deq_now = clib_min (deq_chunk, len - offset);
+ if (deq_now == 0)
+ continue;
+ rv = svm_fifo_dequeue (f, deq_now, data_buf + offset);
+ if (rv != deq_now)
+ return rv;
+ }