| 272 | } |
| 273 | |
| 274 | static int |
| 275 | mt1_init(struct rte_ring **rng, void **data, uint32_t num) |
| 276 | { |
| 277 | int32_t rc; |
| 278 | size_t sz; |
| 279 | uint32_t i, nr; |
| 280 | struct rte_ring *r; |
| 281 | struct ring_elem *elm; |
| 282 | void *p; |
| 283 | |
| 284 | *rng = NULL; |
| 285 | *data = NULL; |
| 286 | |
| 287 | sz = num * sizeof(*elm); |
| 288 | elm = rte_zmalloc(NULL, sz, __alignof__(*elm)); |
| 289 | if (elm == NULL) { |
| 290 | printf("%s: alloc(%zu) for %u elems data failed", |
| 291 | __func__, sz, num); |
| 292 | return -ENOMEM; |
| 293 | } |
| 294 | |
| 295 | *data = elm; |
| 296 | |
| 297 | /* alloc ring */ |
| 298 | nr = rte_align32pow2(2 * num); |
| 299 | sz = rte_ring_get_memsize(nr); |
| 300 | r = rte_zmalloc(NULL, sz, __alignof__(*r)); |
| 301 | if (r == NULL) { |
| 302 | printf("%s: alloc(%zu) for FIFO with %u elems failed", |
| 303 | __func__, sz, nr); |
| 304 | return -ENOMEM; |
| 305 | } |
| 306 | |
| 307 | *rng = r; |
| 308 | |
| 309 | rc = _st_ring_init(r, RING_NAME, nr); |
| 310 | if (rc != 0) { |
| 311 | printf("%s: _st_ring_init(%p, %u) failed, error: %d(%s)\n", |
| 312 | __func__, r, nr, rc, strerror(-rc)); |
| 313 | return rc; |
| 314 | } |
| 315 | |
| 316 | for (i = 0; i != num; i++) { |
| 317 | fill_ring_elm(elm + i, UINT32_MAX); |
| 318 | p = elm + i; |
| 319 | if (_st_ring_enqueue_bulk(r, &p, 1, NULL) != 1) |
| 320 | break; |
| 321 | } |
| 322 | |
| 323 | if (i != num) { |
| 324 | printf("%s: _st_ring_enqueue(%p, %u) returned %u\n", |
| 325 | __func__, r, num, i); |
| 326 | return -ENOSPC; |
| 327 | } |
| 328 | |
| 329 | return 0; |
| 330 | } |
| 331 |
no test coverage detected