2 * Copyright (c) 2016 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #include "svm_fifo_segment.h"
19 hello_world (int verbose)
21 svm_fifo_segment_create_args_t _a, *a = &_a;
22 svm_fifo_segment_private_t *sp;
26 u8 *retrieved_data = 0;
27 clib_error_t *error = 0;
29 memset (a, 0, sizeof (*a));
31 a->segment_name = "fifo-test1";
32 a->segment_size = 256 << 10;
33 a->rx_fifo_size = 4096;
34 a->tx_fifo_size = 4096;
35 a->preallocated_fifo_pairs = 4;
37 rv = svm_fifo_segment_create (a);
40 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
42 sp = svm_fifo_segment_get_segment (a->new_segment_indices[0]);
44 f = svm_fifo_segment_alloc_fifo (sp, 4096, FIFO_SEGMENT_RX_FREELIST);
47 return clib_error_return (0, "svm_fifo_segment_alloc_fifo failed");
49 test_data = format (0, "Hello world%c", 0);
50 vec_validate (retrieved_data, vec_len (test_data) - 1);
52 while (svm_fifo_max_enqueue (f) >= vec_len (test_data))
53 svm_fifo_enqueue_nowait (f, vec_len (test_data), test_data);
55 while (svm_fifo_max_dequeue (f) >= vec_len (test_data))
56 svm_fifo_dequeue_nowait (f, vec_len (retrieved_data), retrieved_data);
58 while (svm_fifo_max_enqueue (f) >= vec_len (test_data))
59 svm_fifo_enqueue_nowait (f, vec_len (test_data), test_data);
61 while (svm_fifo_max_dequeue (f) >= vec_len (test_data))
62 svm_fifo_dequeue_nowait (f, vec_len (retrieved_data), retrieved_data);
64 if (!memcmp (retrieved_data, test_data, vec_len (test_data)))
65 error = clib_error_return (0, "data test OK, got '%s'", retrieved_data);
67 error = clib_error_return (0, "data test FAIL!");
69 svm_fifo_segment_free_fifo (sp, f, FIFO_SEGMENT_RX_FREELIST);
77 svm_fifo_segment_create_args_t _a, *a = &_a;
78 svm_fifo_segment_private_t *sp;
82 u8 *retrieved_data = 0;
85 memset (a, 0, sizeof (*a));
87 a->segment_name = "fifo-test1";
88 a->segment_size = 256 << 10;
90 rv = svm_fifo_segment_create (a);
93 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
95 sp = svm_fifo_segment_get_segment (a->new_segment_indices[0]);
97 f = svm_fifo_segment_alloc_fifo (sp, 4096, FIFO_SEGMENT_RX_FREELIST);
100 return clib_error_return (0, "svm_fifo_segment_alloc_fifo failed");
102 test_data = format (0, "Hello world%c", 0);
103 vec_validate (retrieved_data, vec_len (test_data) - 1);
105 for (i = 0; i < 1000; i++)
106 svm_fifo_enqueue_nowait (f, vec_len (test_data), test_data);
108 return clib_error_return (0, "master (enqueue) done");
114 svm_fifo_segment_create_args_t _a, *a = &_a;
115 svm_fifo_segment_private_t *sp;
117 svm_fifo_t **flist = 0;
121 memset (a, 0, sizeof (*a));
123 a->segment_name = "fifo-test1";
124 a->segment_size = 256 << 10;
126 rv = svm_fifo_segment_create (a);
129 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
131 sp = svm_fifo_segment_get_segment (a->new_segment_indices[0]);
133 for (i = 0; i < 1000; i++)
135 f = svm_fifo_segment_alloc_fifo (sp, 4096, FIFO_SEGMENT_RX_FREELIST);
141 fformat (stdout, "Try #1: created %d fifos...\n", vec_len (flist));
142 for (i = 0; i < vec_len (flist); i++)
145 svm_fifo_segment_free_fifo (sp, f, FIFO_SEGMENT_RX_FREELIST);
148 _vec_len (flist) = 0;
150 for (i = 0; i < 1000; i++)
152 f = svm_fifo_segment_alloc_fifo (sp, 4096, FIFO_SEGMENT_RX_FREELIST);
158 fformat (stdout, "Try #2: created %d fifos...\n", vec_len (flist));
159 for (i = 0; i < vec_len (flist); i++)
162 svm_fifo_segment_free_fifo (sp, f, FIFO_SEGMENT_RX_FREELIST);
171 svm_fifo_segment_create_args_t _a, *a = &_a;
172 svm_fifo_segment_private_t *sp;
176 u32 *recovered_data = 0;
179 memset (a, 0, sizeof (*a));
181 a->segment_name = "fifo-test1";
182 a->segment_size = 256 << 10;
184 rv = svm_fifo_segment_create (a);
187 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
189 sp = svm_fifo_segment_get_segment (a->new_segment_indices[0]);
191 f = svm_fifo_segment_alloc_fifo (sp, 200 << 10, FIFO_SEGMENT_RX_FREELIST);
194 return clib_error_return (0, "svm_fifo_segment_alloc_fifo failed");
196 for (i = 0; i < (3 * 1024); i++)
197 vec_add1 (test_data, i);
199 /* Enqueue the first 1024 u32's */
200 svm_fifo_enqueue_nowait (f, 4096 /* bytes to enqueue */ ,
203 /* Enqueue the third 1024 u32's 2048 ahead of the current tail */
204 svm_fifo_enqueue_with_offset (f, 4096, 4096, (u8 *) & test_data[2048]);
206 /* Enqueue the second 1024 u32's at the current tail */
207 svm_fifo_enqueue_nowait (f, 4096 /* bytes to enqueue */ ,
208 (u8 *) & test_data[1024]);
210 vec_validate (recovered_data, (3 * 1024) - 1);
212 svm_fifo_dequeue_nowait (f, 3 * 4096, (u8 *) recovered_data);
214 for (i = 0; i < (3 * 1024); i++)
216 if (recovered_data[i] != test_data[i])
218 clib_warning ("[%d] expected %d recovered %d", i,
219 test_data[i], recovered_data[i]);
220 return clib_error_return (0, "offset test FAILED");
224 return clib_error_return (0, "offset test OK");
230 svm_fifo_segment_create_args_t _a, *a = &_a;
231 svm_fifo_segment_private_t *sp;
233 ssvm_shared_header_t *sh;
234 svm_fifo_segment_header_t *fsh;
237 u8 *retrieved_data = 0;
240 memset (a, 0, sizeof (*a));
242 a->segment_name = "fifo-test1";
244 rv = svm_fifo_segment_attach (a);
247 return clib_error_return (0, "svm_fifo_segment_attach returned %d", rv);
249 sp = svm_fifo_segment_get_segment (a->new_segment_indices[0]);
251 fsh = (svm_fifo_segment_header_t *) sh->opaque[0];
253 /* might wanna wait.. */
256 /* Lazy bastards united */
257 test_data = format (0, "Hello world%c", 0);
258 vec_validate (retrieved_data, vec_len (test_data) - 1);
260 for (i = 0; i < 1000; i++)
262 svm_fifo_dequeue_nowait (f, vec_len (retrieved_data), retrieved_data);
263 if (memcmp (retrieved_data, test_data, vec_len (retrieved_data)))
264 return clib_error_return (0, "retrieved data incorrect, '%s'",
268 return clib_error_return (0, "slave (dequeue) done");
273 test_ssvm_fifo1 (unformat_input_t * input)
275 clib_error_t *error = 0;
279 svm_fifo_segment_init (0x200000000ULL, 20);
281 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
283 if (unformat (input, "verbose %d", &verbose))
285 else if (unformat (input, "verbose"))
287 else if (unformat (input, "master"))
289 else if (unformat (input, "slave"))
291 else if (unformat (input, "mempig"))
293 else if (unformat (input, "offset"))
297 error = clib_error_create ("unknown input `%U'\n",
298 format_unformat_error, input);
306 error = hello_world (verbose);
310 error = master (verbose);
314 error = slave (verbose);
318 error = mempig (verbose);
322 error = offset (verbose);
326 error = clib_error_return (0, "test id %d unknown", test_id);
332 clib_error_report (error);
340 main (int argc, char *argv[])
345 unformat_init_command_line (&i, argv);
346 r = test_ssvm_fifo1 (&i);
352 * fd.io coding-style-patch-verification: ON
355 * eval: (c-set-style "gnu")