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;
30 memset (a, 0, sizeof (*a));
32 a->segment_name = "fifo-test1";
33 a->segment_size = 256 << 10;
35 rv = svm_fifo_segment_create (a);
38 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
40 sp = svm_fifo_get_segment (a->new_segment_index);
42 f = svm_fifo_segment_alloc_fifo (sp, 4096);
45 return clib_error_return (0, "svm_fifo_segment_alloc_fifo failed");
47 test_data = format (0, "Hello world%c", 0);
48 vec_validate (retrieved_data, vec_len (test_data) - 1);
50 while (svm_fifo_max_enqueue (f) >= vec_len (test_data))
51 svm_fifo_enqueue_nowait (f, pid, vec_len (test_data), test_data);
53 while (svm_fifo_max_dequeue (f) >= vec_len (test_data))
54 svm_fifo_dequeue_nowait (f, pid, vec_len (retrieved_data),
57 while (svm_fifo_max_enqueue (f) >= vec_len (test_data))
58 svm_fifo_enqueue_nowait (f, pid, vec_len (test_data), test_data);
60 while (svm_fifo_max_dequeue (f) >= vec_len (test_data))
61 svm_fifo_dequeue_nowait (f, pid, vec_len (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);
77 svm_fifo_segment_create_args_t _a, *a = &_a;
78 svm_fifo_segment_private_t *sp;
82 u8 *retrieved_data = 0;
86 memset (a, 0, sizeof (*a));
88 a->segment_name = "fifo-test1";
89 a->segment_size = 256 << 10;
91 rv = svm_fifo_segment_create (a);
94 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
96 sp = svm_fifo_get_segment (a->new_segment_index);
98 f = svm_fifo_segment_alloc_fifo (sp, 4096);
101 return clib_error_return (0, "svm_fifo_segment_alloc_fifo failed");
103 test_data = format (0, "Hello world%c", 0);
104 vec_validate (retrieved_data, vec_len (test_data) - 1);
106 for (i = 0; i < 1000; i++)
107 svm_fifo_enqueue_nowait (f, pid, vec_len (test_data), test_data);
109 return clib_error_return (0, "master (enqueue) done");
115 svm_fifo_segment_create_args_t _a, *a = &_a;
116 svm_fifo_segment_private_t *sp;
118 svm_fifo_t **flist = 0;
122 memset (a, 0, sizeof (*a));
124 a->segment_name = "fifo-test1";
125 a->segment_size = 256 << 10;
127 rv = svm_fifo_segment_create (a);
130 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
132 sp = svm_fifo_get_segment (a->new_segment_index);
134 for (i = 0; i < 1000; i++)
136 f = svm_fifo_segment_alloc_fifo (sp, 4096);
142 fformat (stdout, "Try #1: created %d fifos...\n", vec_len (flist));
143 for (i = 0; i < vec_len (flist); i++)
146 svm_fifo_segment_free_fifo (sp, f);
149 _vec_len (flist) = 0;
151 for (i = 0; i < 1000; i++)
153 f = svm_fifo_segment_alloc_fifo (sp, 4096);
159 fformat (stdout, "Try #2: created %d fifos...\n", vec_len (flist));
160 for (i = 0; i < vec_len (flist); i++)
163 svm_fifo_segment_free_fifo (sp, f);
172 svm_fifo_segment_create_args_t _a, *a = &_a;
173 svm_fifo_segment_private_t *sp;
177 u32 *recovered_data = 0;
181 memset (a, 0, sizeof (*a));
183 a->segment_name = "fifo-test1";
184 a->segment_size = 256 << 10;
186 rv = svm_fifo_segment_create (a);
189 return clib_error_return (0, "svm_fifo_segment_create returned %d", rv);
191 sp = svm_fifo_get_segment (a->new_segment_index);
193 f = svm_fifo_segment_alloc_fifo (sp, 200 << 10);
196 return clib_error_return (0, "svm_fifo_segment_alloc_fifo failed");
198 for (i = 0; i < (3 * 1024); i++)
199 vec_add1 (test_data, i);
201 /* Enqueue the first 1024 u32's */
202 svm_fifo_enqueue_nowait (f, pid, 4096 /* bytes to enqueue */ ,
205 /* Enqueue the third 1024 u32's 2048 ahead of the current tail */
206 svm_fifo_enqueue_with_offset (f, pid, 4096, 4096, (u8 *) & test_data[2048]);
208 /* Enqueue the second 1024 u32's at the current tail */
209 svm_fifo_enqueue_nowait (f, pid, 4096 /* bytes to enqueue */ ,
210 (u8 *) & test_data[1024]);
212 vec_validate (recovered_data, (3 * 1024) - 1);
214 svm_fifo_dequeue_nowait (f, pid, 3 * 4096, (u8 *) recovered_data);
216 for (i = 0; i < (3 * 1024); i++)
218 if (recovered_data[i] != test_data[i])
220 clib_warning ("[%d] expected %d recovered %d", i,
221 test_data[i], recovered_data[i]);
222 return clib_error_return (0, "offset test FAILED");
226 return clib_error_return (0, "offset test OK");
232 svm_fifo_segment_create_args_t _a, *a = &_a;
233 svm_fifo_segment_private_t *sp;
234 svm_fifo_segment_header_t *fsh;
236 ssvm_shared_header_t *sh;
239 u8 *retrieved_data = 0;
243 memset (a, 0, sizeof (*a));
245 a->segment_name = "fifo-test1";
247 rv = svm_fifo_segment_attach (a);
250 return clib_error_return (0, "svm_fifo_segment_attach returned %d", rv);
252 sp = svm_fifo_get_segment (a->new_segment_index);
254 fsh = (svm_fifo_segment_header_t *) sh->opaque[0];
256 /* might wanna wait.. */
257 f = (svm_fifo_t *) fsh->fifos[0];
259 /* Lazy bastards united */
260 test_data = format (0, "Hello world%c", 0);
261 vec_validate (retrieved_data, vec_len (test_data) - 1);
263 for (i = 0; i < 1000; i++)
265 svm_fifo_dequeue_nowait (f, pid, vec_len (retrieved_data),
267 if (memcmp (retrieved_data, test_data, vec_len (retrieved_data)))
268 return clib_error_return (0, "retrieved data incorrect, '%s'",
272 return clib_error_return (0, "slave (dequeue) done");
277 test_ssvm_fifo1 (unformat_input_t * input)
279 clib_error_t *error = 0;
283 svm_fifo_segment_init (0x200000000ULL, 20);
285 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
287 if (unformat (input, "verbose %d", &verbose))
289 else if (unformat (input, "verbose"))
291 else if (unformat (input, "master"))
293 else if (unformat (input, "slave"))
295 else if (unformat (input, "mempig"))
297 else if (unformat (input, "offset"))
301 error = clib_error_create ("unknown input `%U'\n",
302 format_unformat_error, input);
310 error = hello_world (verbose);
314 error = master (verbose);
318 error = slave (verbose);
322 error = mempig (verbose);
326 error = offset (verbose);
330 error = clib_error_return (0, "test id %d unknown", test_id);
336 clib_error_report (error);
344 main (int argc, char *argv[])
349 unformat_init_command_line (&i, argv);
350 r = test_ssvm_fifo1 (&i);
356 * fd.io coding-style-patch-verification: ON
359 * eval: (c-set-style "gnu")