X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fntb%2Fntb_fwd.c;h=54b7f08964067d4f13368d787ac949ac14fd2a92;hb=a011555fb85bbf65a1578dce7383ef1bd630be79;hp=b1ea71c8f98c63d855009e06e442319d68c399ae;hpb=5194299d6ef5f29ee41043dd9e36f04595bb25f9;p=dpdk.git diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c index b1ea71c8f9..54b7f08964 100644 --- a/examples/ntb/ntb_fwd.c +++ b/examples/ntb/ntb_fwd.c @@ -19,6 +19,7 @@ #include #include #include +#include /* Per-port statistics struct */ struct ntb_port_statistics { @@ -108,9 +109,9 @@ struct cmd_help_result { }; static void -cmd_help_parsed(__attribute__((unused)) void *parsed_result, +cmd_help_parsed(__rte_unused void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { cmdline_printf( cl, @@ -153,15 +154,15 @@ struct cmd_quit_result { }; static void -cmd_quit_parsed(__attribute__((unused)) void *parsed_result, +cmd_quit_parsed(__rte_unused void *parsed_result, struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused void *data) { struct ntb_fwd_lcore_conf *conf; - uint8_t lcore_id; + uint32_t lcore_id; /* Stop transmission first. */ - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + RTE_LCORE_FOREACH_WORKER(lcore_id) { conf = &fwd_lcore_conf[lcore_id]; if (!conf->nb_stream) @@ -208,19 +209,20 @@ struct cmd_sendfile_result { static void cmd_sendfile_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_sendfile_result *res = parsed_result; struct rte_rawdev_buf *pkts_send[NTB_MAX_PKT_BURST]; struct rte_mbuf *mbuf_send[NTB_MAX_PKT_BURST]; - uint64_t size, count, i, nb_burst; + uint64_t size, count, i, j, nb_burst; uint16_t nb_tx, buf_size; unsigned int nb_pkt; size_t queue_id = 0; uint16_t retry = 0; uint32_t val; FILE *file; + int ret; if (num_queues != 1) { printf("File transmission only supports 1 queue.\n"); @@ -289,21 +291,37 @@ cmd_sendfile_parsed(void *parsed_result, } } - nb_tx = rte_rawdev_enqueue_buffers(dev_id, pkts_send, nb_pkt, - (void *)queue_id); + ret = rte_rawdev_enqueue_buffers(dev_id, pkts_send, nb_pkt, + (void *)queue_id); + if (ret < 0) { + printf("Enqueue failed with err %d\n", ret); + for (j = 0; j < nb_pkt; j++) + rte_pktmbuf_free(mbuf_send[j]); + goto clean; + } + nb_tx = ret; while (nb_tx != nb_pkt && retry < BURST_TX_RETRIES) { rte_delay_us(1); - nb_tx += rte_rawdev_enqueue_buffers(dev_id, - &pkts_send[nb_tx], nb_pkt - nb_tx, - (void *)queue_id); + ret = rte_rawdev_enqueue_buffers(dev_id, + &pkts_send[nb_tx], nb_pkt - nb_tx, + (void *)queue_id); + if (ret < 0) { + printf("Enqueue failed with err %d\n", ret); + for (j = nb_tx; j < nb_pkt; j++) + rte_pktmbuf_free(mbuf_send[j]); + goto clean; + } + nb_tx += ret; } count -= nb_pkt; } + /* Clear register after file sending done. */ rte_rawdev_set_attr(dev_id, "spad_user_0", 0); rte_rawdev_set_attr(dev_id, "spad_user_1", 0); printf("Done sending file.\n"); +clean: for (i = 0; i < NTB_MAX_PKT_BURST; i++) free(pkts_send[i]); fclose(file); @@ -339,6 +357,7 @@ start_polling_recv_file(void *param) uint16_t nb_rx, i, file_no; size_t queue_id = 0; FILE *file; + int ret; for (i = 0; i < NTB_MAX_PKT_BURST; i++) pkts_recv[i] = (struct rte_rawdev_buf *) @@ -366,8 +385,14 @@ start_polling_recv_file(void *param) file_len = 0; nb_rx = NTB_MAX_PKT_BURST; while (file_len < size && !conf->stopped) { - nb_rx = rte_rawdev_dequeue_buffers(dev_id, pkts_recv, - pkt_burst, (void *)queue_id); + ret = rte_rawdev_dequeue_buffers(dev_id, pkts_recv, + pkt_burst, (void *)queue_id); + if (ret < 0) { + printf("Dequeue failed with err %d\n", ret); + fclose(file); + goto clean; + } + nb_rx = ret; ntb_port_stats[0].rx += nb_rx; for (i = 0; i < nb_rx; i++) { mbuf = pkts_recv[i]->buf_addr; @@ -385,6 +410,7 @@ start_polling_recv_file(void *param) file_no++; } +clean: for (i = 0; i < NTB_MAX_PKT_BURST; i++) free(pkts_recv[i]); return 0; @@ -398,7 +424,7 @@ start_iofwd_per_lcore(void *param) struct ntb_fwd_lcore_conf *conf = param; struct ntb_fwd_stream fs; uint16_t nb_rx, nb_tx; - int i, j; + int i, j, ret; for (i = 0; i < NTB_MAX_PKT_BURST; i++) ntb_buf[i] = (struct rte_rawdev_buf *) @@ -415,17 +441,29 @@ start_iofwd_per_lcore(void *param) continue; for (j = 0; j < nb_rx; j++) ntb_buf[j]->buf_addr = pkts_burst[j]; - nb_tx = - rte_rawdev_enqueue_buffers(fs.tx_port, + ret = rte_rawdev_enqueue_buffers(fs.tx_port, ntb_buf, nb_rx, (void *)(size_t)fs.qp_id); + if (ret < 0) { + printf("Enqueue failed with err %d\n", + ret); + for (j = 0; j < nb_rx; j++) + rte_pktmbuf_free(pkts_burst[j]); + goto clean; + } + nb_tx = ret; ntb_port_stats[0].tx += nb_tx; ntb_port_stats[1].rx += nb_rx; } else { - nb_rx = - rte_rawdev_dequeue_buffers(fs.rx_port, + ret = rte_rawdev_dequeue_buffers(fs.rx_port, ntb_buf, pkt_burst, (void *)(size_t)fs.qp_id); + if (ret < 0) { + printf("Dequeue failed with err %d\n", + ret); + goto clean; + } + nb_rx = ret; if (unlikely(nb_rx == 0)) continue; for (j = 0; j < nb_rx; j++) @@ -443,6 +481,7 @@ start_iofwd_per_lcore(void *param) } } +clean: for (i = 0; i < NTB_MAX_PKT_BURST; i++) free(ntb_buf[i]); @@ -456,7 +495,7 @@ start_rxonly_per_lcore(void *param) struct ntb_fwd_lcore_conf *conf = param; struct ntb_fwd_stream fs; uint16_t nb_rx; - int i, j; + int i, j, ret; for (i = 0; i < NTB_MAX_PKT_BURST; i++) ntb_buf[i] = (struct rte_rawdev_buf *) @@ -465,8 +504,13 @@ start_rxonly_per_lcore(void *param) while (!conf->stopped) { for (i = 0; i < conf->nb_stream; i++) { fs = fwd_streams[conf->stream_id + i]; - nb_rx = rte_rawdev_dequeue_buffers(fs.rx_port, - ntb_buf, pkt_burst, (void *)(size_t)fs.qp_id); + ret = rte_rawdev_dequeue_buffers(fs.rx_port, + ntb_buf, pkt_burst, (void *)(size_t)fs.qp_id); + if (ret < 0) { + printf("Dequeue failed with err %d\n", ret); + goto clean; + } + nb_rx = ret; if (unlikely(nb_rx == 0)) continue; ntb_port_stats[0].rx += nb_rx; @@ -476,6 +520,7 @@ start_rxonly_per_lcore(void *param) } } +clean: for (i = 0; i < NTB_MAX_PKT_BURST; i++) free(ntb_buf[i]); @@ -491,7 +536,7 @@ start_txonly_per_lcore(void *param) struct ntb_fwd_lcore_conf *conf = param; struct ntb_fwd_stream fs; uint16_t nb_pkt, nb_tx; - int i; + int i, j, ret; for (i = 0; i < NTB_MAX_PKT_BURST; i++) ntb_buf[i] = (struct rte_rawdev_buf *) @@ -528,18 +573,25 @@ start_txonly_per_lcore(void *param) pkts_burst[nb_pkt]; } } - nb_tx = rte_rawdev_enqueue_buffers(fs.tx_port, - ntb_buf, nb_pkt, (void *)(size_t)fs.qp_id); + ret = rte_rawdev_enqueue_buffers(fs.tx_port, ntb_buf, + nb_pkt, (void *)(size_t)fs.qp_id); + if (ret < 0) { + printf("Enqueue failed with err %d\n", ret); + for (j = 0; j < nb_pkt; j++) + rte_pktmbuf_free(pkts_burst[j]); + goto clean; + } + nb_tx = ret; ntb_port_stats[0].tx += nb_tx; if (unlikely(nb_tx < nb_pkt)) { do { - rte_pktmbuf_free( - ntb_buf[nb_tx]->buf_addr); + rte_pktmbuf_free(pkts_burst[nb_tx]); } while (++nb_tx < nb_pkt); } } } +clean: for (i = 0; i < NTB_MAX_PKT_BURST; i++) free(ntb_buf[i]); @@ -612,10 +664,11 @@ assign_stream_to_lcores(void) struct ntb_fwd_lcore_conf *conf; struct ntb_fwd_stream *fs; uint16_t nb_streams, sm_per_lcore, sm_id, i; - uint8_t lcore_id, lcore_num, nb_extra; + uint32_t lcore_id; + uint8_t lcore_num, nb_extra; lcore_num = rte_lcore_count(); - /* Exclude master core */ + /* Exclude main core */ lcore_num--; nb_streams = (fwd_mode == IOFWD) ? num_queues * 2 : num_queues; @@ -625,7 +678,7 @@ assign_stream_to_lcores(void) sm_id = 0; i = 0; - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + RTE_LCORE_FOREACH_WORKER(lcore_id) { conf = &fwd_lcore_conf[lcore_id]; if (i < nb_extra) { @@ -644,7 +697,7 @@ assign_stream_to_lcores(void) } /* Print packet forwading config. */ - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + RTE_LCORE_FOREACH_WORKER(lcore_id) { conf = &fwd_lcore_conf[lcore_id]; if (!conf->nb_stream) @@ -674,8 +727,9 @@ start_pkt_fwd(void) { struct ntb_fwd_lcore_conf *conf; struct rte_eth_link eth_link; - uint8_t lcore_id; + uint32_t lcore_id; int ret, i; + char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; ret = ntb_fwd_config_setup(); if (ret < 0) { @@ -688,13 +742,17 @@ start_pkt_fwd(void) printf("Checking eth link status...\n"); /* Wait for eth link up at most 100 times. */ for (i = 0; i < 100; i++) { - rte_eth_link_get(eth_port_id, ð_link); + ret = rte_eth_link_get(eth_port_id, ð_link); + if (ret < 0) { + printf("Link get failed with err %d\n", ret); + return; + } if (eth_link.link_status) { - printf("Eth%u Link Up. Speed %u Mbps - %s\n", - eth_port_id, eth_link.link_speed, - (eth_link.link_duplex == - ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex")); + rte_eth_link_to_str(link_status_text, + sizeof(link_status_text), + ð_link); + printf("Eth%u %s\n", eth_port_id, + link_status_text); break; } } @@ -708,7 +766,7 @@ start_pkt_fwd(void) assign_stream_to_lcores(); in_test = 1; - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + RTE_LCORE_FOREACH_WORKER(lcore_id) { conf = &fwd_lcore_conf[lcore_id]; if (!conf->nb_stream) @@ -736,9 +794,9 @@ struct cmd_start_result { }; static void -cmd_start_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +cmd_start_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { start_pkt_fwd(); } @@ -762,14 +820,14 @@ struct cmd_stop_result { }; static void -cmd_stop_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +cmd_stop_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct ntb_fwd_lcore_conf *conf; - uint8_t lcore_id; + uint32_t lcore_id; - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + RTE_LCORE_FOREACH_WORKER(lcore_id) { conf = &fwd_lcore_conf[lcore_id]; if (!conf->nb_stream) @@ -926,8 +984,8 @@ struct cmd_stats_result { static void cmd_stats_parsed(void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_stats_result *res = parsed_result; if (!strcmp(res->show, "clear")) @@ -964,9 +1022,9 @@ struct cmd_set_fwd_mode_result { }; static void -cmd_set_fwd_mode_parsed(__attribute__((unused)) void *parsed_result, - __attribute__((unused)) struct cmdline *cl, - __attribute__((unused)) void *data) +cmd_set_fwd_mode_parsed(__rte_unused void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) { struct cmd_set_fwd_mode_result *res = parsed_result; int i; @@ -1017,7 +1075,7 @@ cmdline_parse_ctx_t main_ctx[] = { NULL, }; -/* prompt function, called from main on MASTER lcore */ +/* prompt function, called from main on MAIN lcore */ static void prompt(void) { @@ -1200,6 +1258,12 @@ ntb_mbuf_pool_create(uint16_t mbuf_seg_size, uint32_t nb_mbuf, if (mp == NULL) return NULL; + if (rte_mempool_set_ops_byname(mp, rte_mbuf_best_mempool_ops(), NULL)) { + printf("error setting mempool handler\n"); + goto fail; + } + + memset(&mbp_priv, 0, sizeof(mbp_priv)); mbp_priv.mbuf_data_room_size = mbuf_seg_size; mbp_priv.mbuf_priv_size = 0; rte_pktmbuf_pool_init(mp, &mbp_priv); @@ -1256,7 +1320,7 @@ ntb_mbuf_pool_create(uint16_t mbuf_seg_size, uint32_t nb_mbuf, mz->len - ntb_info.ntb_hdr_size, ntb_mempool_mz_free, (void *)(uintptr_t)mz); - if (ret < 0) { + if (ret <= 0) { rte_memzone_free(mz); rte_mempool_free(mp); return NULL; @@ -1326,7 +1390,7 @@ main(int argc, char **argv) rte_rawdev_set_attr(dev_id, NTB_QUEUE_NUM_NAME, num_queues); printf("Set queue number as %u.\n", num_queues); ntb_rawdev_info.dev_private = (rte_rawdev_obj_t)(&ntb_info); - rte_rawdev_info_get(dev_id, &ntb_rawdev_info); + rte_rawdev_info_get(dev_id, &ntb_rawdev_info, sizeof(ntb_info)); nb_mbuf = nb_desc * num_queues * 2 * 2 + rte_lcore_count() * MEMPOOL_CACHE_SIZE; @@ -1338,7 +1402,7 @@ main(int argc, char **argv) ntb_conf.num_queues = num_queues; ntb_conf.queue_size = nb_desc; ntb_rawdev_conf.dev_private = (rte_rawdev_obj_t)(&ntb_conf); - ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf); + ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf, sizeof(ntb_conf)); if (ret) rte_exit(EXIT_FAILURE, "Can't config ntb dev: err=%d, " "port=%u\n", ret, dev_id); @@ -1348,7 +1412,8 @@ main(int argc, char **argv) ntb_q_conf.rx_mp = mbuf_pool; for (i = 0; i < num_queues; i++) { /* Setup rawdev queue */ - ret = rte_rawdev_queue_setup(dev_id, i, &ntb_q_conf); + ret = rte_rawdev_queue_setup(dev_id, i, &ntb_q_conf, + sizeof(ntb_q_conf)); if (ret < 0) rte_exit(EXIT_FAILURE, "Failed to setup ntb queue %u.\n", i);