| 509 | } |
| 510 | |
| 511 | static int |
| 512 | test_mempool_events(int (*populate)(struct rte_mempool *mp)) |
| 513 | { |
| 514 | #pragma push_macro("RTE_TEST_TRACE_FAILURE") |
| 515 | #undef RTE_TEST_TRACE_FAILURE |
| 516 | #define RTE_TEST_TRACE_FAILURE(...) do { goto fail; } while (0) |
| 517 | |
| 518 | static const size_t callback_num = 3; |
| 519 | static const size_t mempool_num = 2; |
| 520 | static const unsigned int mempool_elt_size = 64; |
| 521 | static const unsigned int mempool_size = 64; |
| 522 | |
| 523 | struct test_mempool_events_data data[callback_num]; |
| 524 | struct rte_mempool *mp[mempool_num], *freed; |
| 525 | char name[RTE_MEMPOOL_NAMESIZE]; |
| 526 | size_t i, j; |
| 527 | int ret; |
| 528 | |
| 529 | memset(mp, 0, sizeof(mp)); |
| 530 | for (i = 0; i < callback_num; i++) { |
| 531 | ret = rte_mempool_event_callback_register |
| 532 | (test_mempool_events_cb, &data[i]); |
| 533 | RTE_TEST_ASSERT_EQUAL(ret, 0, "Failed to register the callback %zu: %s", |
| 534 | i, rte_strerror(rte_errno)); |
| 535 | } |
| 536 | ret = rte_mempool_event_callback_unregister(test_mempool_events_cb, mp); |
| 537 | RTE_TEST_ASSERT_NOT_EQUAL(ret, 0, "Unregistered a non-registered callback"); |
| 538 | /* NULL argument has no special meaning in this API. */ |
| 539 | ret = rte_mempool_event_callback_unregister(test_mempool_events_cb, |
| 540 | NULL); |
| 541 | RTE_TEST_ASSERT_NOT_EQUAL(ret, 0, "Unregistered a non-registered callback with NULL argument"); |
| 542 | |
| 543 | /* Create mempool 0 that will be observed by all callbacks. */ |
| 544 | memset(&data, 0, sizeof(data)); |
| 545 | strcpy(name, "empty0"); |
| 546 | mp[0] = rte_mempool_create_empty(name, mempool_size, |
| 547 | mempool_elt_size, 0, 0, |
| 548 | SOCKET_ID_ANY, 0); |
| 549 | RTE_TEST_ASSERT_NOT_NULL(mp[0], "Cannot create mempool %s: %s", |
| 550 | name, rte_strerror(rte_errno)); |
| 551 | for (j = 0; j < callback_num; j++) |
| 552 | RTE_TEST_ASSERT_EQUAL(data[j].invoked, false, |
| 553 | "Callback %zu invoked on %s mempool creation", |
| 554 | j, name); |
| 555 | |
| 556 | rte_mempool_set_ops_byname(mp[0], rte_mbuf_best_mempool_ops(), NULL); |
| 557 | ret = populate(mp[0]); |
| 558 | RTE_TEST_ASSERT_EQUAL(ret, (int)mp[0]->size, "Failed to populate mempool %s: %s", |
| 559 | name, rte_strerror(-ret)); |
| 560 | for (j = 0; j < callback_num; j++) { |
| 561 | RTE_TEST_ASSERT_EQUAL(data[j].invoked, true, |
| 562 | "Callback %zu not invoked on mempool %s population", |
| 563 | j, name); |
| 564 | RTE_TEST_ASSERT_EQUAL(data[j].event, |
| 565 | RTE_MEMPOOL_EVENT_READY, |
| 566 | "Wrong callback invoked, expected READY"); |
| 567 | RTE_TEST_ASSERT_EQUAL(data[j].mp, mp[0], |
| 568 | "Callback %zu invoked for a wrong mempool instead of %s", |
no test coverage detected