1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*d30ea906Sjfb8856606 * Copyright(c) 2017 Cavium, Inc
32bfe3f2eSlogwang */
42bfe3f2eSlogwang
52bfe3f2eSlogwang #include <stdio.h>
62bfe3f2eSlogwang #include <unistd.h>
72bfe3f2eSlogwang #include <signal.h>
82bfe3f2eSlogwang
92bfe3f2eSlogwang #include <rte_atomic.h>
102bfe3f2eSlogwang #include <rte_debug.h>
112bfe3f2eSlogwang #include <rte_eal.h>
122bfe3f2eSlogwang #include <rte_eventdev.h>
132bfe3f2eSlogwang
142bfe3f2eSlogwang #include "evt_options.h"
152bfe3f2eSlogwang #include "evt_test.h"
162bfe3f2eSlogwang
172bfe3f2eSlogwang struct evt_options opt;
182bfe3f2eSlogwang struct evt_test *test;
192bfe3f2eSlogwang
202bfe3f2eSlogwang static void
signal_handler(int signum)212bfe3f2eSlogwang signal_handler(int signum)
222bfe3f2eSlogwang {
23*d30ea906Sjfb8856606 int i;
24*d30ea906Sjfb8856606 static uint8_t once;
25*d30ea906Sjfb8856606
26*d30ea906Sjfb8856606 if ((signum == SIGINT || signum == SIGTERM) && !once) {
27*d30ea906Sjfb8856606 once = true;
282bfe3f2eSlogwang printf("\nSignal %d received, preparing to exit...\n",
292bfe3f2eSlogwang signum);
30*d30ea906Sjfb8856606
31*d30ea906Sjfb8856606 if (test != NULL) {
322bfe3f2eSlogwang /* request all lcores to exit from the main loop */
332bfe3f2eSlogwang *(int *)test->test_priv = true;
342bfe3f2eSlogwang rte_wmb();
352bfe3f2eSlogwang
36*d30ea906Sjfb8856606 if (test->ops.ethdev_destroy)
37*d30ea906Sjfb8856606 test->ops.ethdev_destroy(test, &opt);
38*d30ea906Sjfb8856606
392bfe3f2eSlogwang rte_eal_mp_wait_lcore();
402bfe3f2eSlogwang
41*d30ea906Sjfb8856606 if (test->ops.test_result)
42*d30ea906Sjfb8856606 test->ops.test_result(test, &opt);
43*d30ea906Sjfb8856606
44*d30ea906Sjfb8856606 if (opt.prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR) {
45*d30ea906Sjfb8856606 RTE_ETH_FOREACH_DEV(i)
46*d30ea906Sjfb8856606 rte_eth_dev_close(i);
47*d30ea906Sjfb8856606 }
48*d30ea906Sjfb8856606
492bfe3f2eSlogwang if (test->ops.eventdev_destroy)
502bfe3f2eSlogwang test->ops.eventdev_destroy(test, &opt);
512bfe3f2eSlogwang
522bfe3f2eSlogwang if (test->ops.mempool_destroy)
532bfe3f2eSlogwang test->ops.mempool_destroy(test, &opt);
542bfe3f2eSlogwang
552bfe3f2eSlogwang if (test->ops.test_destroy)
562bfe3f2eSlogwang test->ops.test_destroy(test, &opt);
57*d30ea906Sjfb8856606 }
582bfe3f2eSlogwang
592bfe3f2eSlogwang /* exit with the expected status */
602bfe3f2eSlogwang signal(signum, SIG_DFL);
612bfe3f2eSlogwang kill(getpid(), signum);
622bfe3f2eSlogwang }
632bfe3f2eSlogwang }
642bfe3f2eSlogwang
652bfe3f2eSlogwang static inline void
evt_options_dump_all(struct evt_test * test,struct evt_options * opts)662bfe3f2eSlogwang evt_options_dump_all(struct evt_test *test, struct evt_options *opts)
672bfe3f2eSlogwang {
682bfe3f2eSlogwang evt_options_dump(opts);
692bfe3f2eSlogwang if (test->ops.opt_dump)
702bfe3f2eSlogwang test->ops.opt_dump(opts);
712bfe3f2eSlogwang }
722bfe3f2eSlogwang
732bfe3f2eSlogwang int
main(int argc,char ** argv)742bfe3f2eSlogwang main(int argc, char **argv)
752bfe3f2eSlogwang {
762bfe3f2eSlogwang uint8_t evdevs;
772bfe3f2eSlogwang int ret;
782bfe3f2eSlogwang
792bfe3f2eSlogwang signal(SIGINT, signal_handler);
802bfe3f2eSlogwang signal(SIGTERM, signal_handler);
812bfe3f2eSlogwang
822bfe3f2eSlogwang ret = rte_eal_init(argc, argv);
832bfe3f2eSlogwang if (ret < 0)
842bfe3f2eSlogwang rte_panic("invalid EAL arguments\n");
852bfe3f2eSlogwang argc -= ret;
862bfe3f2eSlogwang argv += ret;
872bfe3f2eSlogwang
882bfe3f2eSlogwang evdevs = rte_event_dev_count();
892bfe3f2eSlogwang if (!evdevs)
902bfe3f2eSlogwang rte_panic("no eventdev devices found\n");
912bfe3f2eSlogwang
922bfe3f2eSlogwang /* Populate the default values of the options */
932bfe3f2eSlogwang evt_options_default(&opt);
942bfe3f2eSlogwang
952bfe3f2eSlogwang /* Parse the command line arguments */
962bfe3f2eSlogwang ret = evt_options_parse(&opt, argc, argv);
972bfe3f2eSlogwang if (ret) {
982bfe3f2eSlogwang evt_err("parsing on or more user options failed");
992bfe3f2eSlogwang goto error;
1002bfe3f2eSlogwang }
1012bfe3f2eSlogwang
1022bfe3f2eSlogwang /* Get struct evt_test *test from name */
1032bfe3f2eSlogwang test = evt_test_get(opt.test_name);
1042bfe3f2eSlogwang if (test == NULL) {
1052bfe3f2eSlogwang evt_err("failed to find requested test: %s", opt.test_name);
1062bfe3f2eSlogwang goto error;
1072bfe3f2eSlogwang }
1082bfe3f2eSlogwang
1092bfe3f2eSlogwang if (test->ops.test_result == NULL) {
1102bfe3f2eSlogwang evt_err("%s: ops.test_result not found", opt.test_name);
1112bfe3f2eSlogwang goto error;
1122bfe3f2eSlogwang }
1132bfe3f2eSlogwang
1142bfe3f2eSlogwang /* Verify the command line options */
1152bfe3f2eSlogwang if (opt.dev_id >= rte_event_dev_count()) {
1162bfe3f2eSlogwang evt_err("invalid event device %d", opt.dev_id);
1172bfe3f2eSlogwang goto error;
1182bfe3f2eSlogwang }
1192bfe3f2eSlogwang if (test->ops.opt_check) {
1202bfe3f2eSlogwang if (test->ops.opt_check(&opt)) {
1212bfe3f2eSlogwang evt_err("invalid command line argument");
1222bfe3f2eSlogwang evt_options_dump_all(test, &opt);
1232bfe3f2eSlogwang goto error;
1242bfe3f2eSlogwang }
1252bfe3f2eSlogwang }
1262bfe3f2eSlogwang
1272bfe3f2eSlogwang /* Check the eventdev capability before proceeding */
1282bfe3f2eSlogwang if (test->ops.cap_check) {
1292bfe3f2eSlogwang if (test->ops.cap_check(&opt) == false) {
1302bfe3f2eSlogwang evt_info("unsupported test: %s", opt.test_name);
1312bfe3f2eSlogwang evt_options_dump_all(test, &opt);
1322bfe3f2eSlogwang ret = EVT_TEST_UNSUPPORTED;
1332bfe3f2eSlogwang goto nocap;
1342bfe3f2eSlogwang }
1352bfe3f2eSlogwang }
1362bfe3f2eSlogwang
1372bfe3f2eSlogwang /* Dump the options */
1382bfe3f2eSlogwang if (opt.verbose_level)
1392bfe3f2eSlogwang evt_options_dump_all(test, &opt);
1402bfe3f2eSlogwang
1412bfe3f2eSlogwang /* Test specific setup */
1422bfe3f2eSlogwang if (test->ops.test_setup) {
1432bfe3f2eSlogwang if (test->ops.test_setup(test, &opt)) {
1442bfe3f2eSlogwang evt_err("failed to setup test: %s", opt.test_name);
1452bfe3f2eSlogwang goto error;
1462bfe3f2eSlogwang
1472bfe3f2eSlogwang }
1482bfe3f2eSlogwang }
1492bfe3f2eSlogwang
1502bfe3f2eSlogwang /* Test specific mempool setup */
1512bfe3f2eSlogwang if (test->ops.mempool_setup) {
1522bfe3f2eSlogwang if (test->ops.mempool_setup(test, &opt)) {
1532bfe3f2eSlogwang evt_err("%s: mempool setup failed", opt.test_name);
1542bfe3f2eSlogwang goto test_destroy;
1552bfe3f2eSlogwang }
1562bfe3f2eSlogwang }
1572bfe3f2eSlogwang
1582bfe3f2eSlogwang /* Test specific ethdev setup */
1592bfe3f2eSlogwang if (test->ops.ethdev_setup) {
1602bfe3f2eSlogwang if (test->ops.ethdev_setup(test, &opt)) {
1612bfe3f2eSlogwang evt_err("%s: ethdev setup failed", opt.test_name);
1622bfe3f2eSlogwang goto mempool_destroy;
1632bfe3f2eSlogwang }
1642bfe3f2eSlogwang }
1652bfe3f2eSlogwang
1662bfe3f2eSlogwang /* Test specific eventdev setup */
1672bfe3f2eSlogwang if (test->ops.eventdev_setup) {
1682bfe3f2eSlogwang if (test->ops.eventdev_setup(test, &opt)) {
1692bfe3f2eSlogwang evt_err("%s: eventdev setup failed", opt.test_name);
1702bfe3f2eSlogwang goto ethdev_destroy;
1712bfe3f2eSlogwang }
1722bfe3f2eSlogwang }
1732bfe3f2eSlogwang
1742bfe3f2eSlogwang /* Launch lcores */
1752bfe3f2eSlogwang if (test->ops.launch_lcores) {
1762bfe3f2eSlogwang if (test->ops.launch_lcores(test, &opt)) {
1772bfe3f2eSlogwang evt_err("%s: failed to launch lcores", opt.test_name);
1782bfe3f2eSlogwang goto eventdev_destroy;
1792bfe3f2eSlogwang }
1802bfe3f2eSlogwang }
1812bfe3f2eSlogwang
1822bfe3f2eSlogwang rte_eal_mp_wait_lcore();
1832bfe3f2eSlogwang
1842bfe3f2eSlogwang /* Print the test result */
1852bfe3f2eSlogwang ret = test->ops.test_result(test, &opt);
1862bfe3f2eSlogwang nocap:
1872bfe3f2eSlogwang if (ret == EVT_TEST_SUCCESS) {
1882bfe3f2eSlogwang printf("Result: "CLGRN"%s"CLNRM"\n", "Success");
1892bfe3f2eSlogwang } else if (ret == EVT_TEST_FAILED) {
1902bfe3f2eSlogwang printf("Result: "CLRED"%s"CLNRM"\n", "Failed");
1912bfe3f2eSlogwang return EXIT_FAILURE;
1922bfe3f2eSlogwang } else if (ret == EVT_TEST_UNSUPPORTED) {
1932bfe3f2eSlogwang printf("Result: "CLYEL"%s"CLNRM"\n", "Unsupported");
1942bfe3f2eSlogwang }
1952bfe3f2eSlogwang
1962bfe3f2eSlogwang return 0;
1972bfe3f2eSlogwang eventdev_destroy:
1982bfe3f2eSlogwang if (test->ops.eventdev_destroy)
1992bfe3f2eSlogwang test->ops.eventdev_destroy(test, &opt);
2002bfe3f2eSlogwang
2012bfe3f2eSlogwang ethdev_destroy:
2022bfe3f2eSlogwang if (test->ops.ethdev_destroy)
2032bfe3f2eSlogwang test->ops.ethdev_destroy(test, &opt);
2042bfe3f2eSlogwang
2052bfe3f2eSlogwang mempool_destroy:
2062bfe3f2eSlogwang if (test->ops.mempool_destroy)
2072bfe3f2eSlogwang test->ops.mempool_destroy(test, &opt);
2082bfe3f2eSlogwang
2092bfe3f2eSlogwang test_destroy:
2102bfe3f2eSlogwang if (test->ops.test_destroy)
2112bfe3f2eSlogwang test->ops.test_destroy(test, &opt);
2122bfe3f2eSlogwang error:
2132bfe3f2eSlogwang return EXIT_FAILURE;
2142bfe3f2eSlogwang }
215