X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fkni%2Fmain.c;h=beabb3c848aad03eb98ac837ab624f87fe97446b;hb=d2794d6719db49ede1370d1be2d56bd96d73c418;hp=29fc37e1fb6b593f01260da677d01f5497f490ab;hpb=2a115479c6361f9667efaa30ceb0dbdcbd931f48;p=dpdk.git diff --git a/examples/kni/main.c b/examples/kni/main.c index 29fc37e1fb..beabb3c848 100644 --- a/examples/kni/main.c +++ b/examples/kni/main.c @@ -158,6 +158,8 @@ print_stats(void) kni_stats[i].tx_dropped); } printf("====== ============== ============ ============ ============ ============\n"); + + fflush(stdout); } /* Custom handling of signals to handle stats and kni processing */ @@ -659,6 +661,7 @@ check_all_ports_link_status(uint32_t port_mask) uint8_t count, all_ports_up, print_flag = 0; struct rte_eth_link link; int ret; + char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; printf("\nChecking link status\n"); fflush(stdout); @@ -678,14 +681,10 @@ check_all_ports_link_status(uint32_t port_mask) } /* print link status if flag set */ if (print_flag == 1) { - if (link.link_status) - printf( - "Port%d Link Up - speed %uMbps - %s\n", - portid, link.link_speed, - (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex\n")); - else - printf("Port %d Link Down\n", portid); + rte_eth_link_to_str(link_status_text, + sizeof(link_status_text), &link); + printf("Port %d %s\n", portid, + link_status_text); continue; } /* clear all_ports_up flag if any link down */ @@ -715,19 +714,15 @@ check_all_ports_link_status(uint32_t port_mask) static void log_link_state(struct rte_kni *kni, int prev, struct rte_eth_link *link) { + char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; if (kni == NULL || link == NULL) return; - if (prev == ETH_LINK_DOWN && link->link_status == ETH_LINK_UP) { - RTE_LOG(INFO, APP, "%s NIC Link is Up %d Mbps %s %s.\n", + rte_eth_link_to_str(link_status_text, sizeof(link_status_text), link); + if (prev != link->link_status) + RTE_LOG(INFO, APP, "%s NIC %s", rte_kni_get_name(kni), - link->link_speed, - link->link_autoneg ? "(AutoNeg)" : "(Fixed)", - link->link_duplex ? "Full Duplex" : "Half Duplex"); - } else if (prev == ETH_LINK_UP && link->link_status == ETH_LINK_DOWN) { - RTE_LOG(INFO, APP, "%s NIC Link is Down.\n", - rte_kni_get_name(kni)); - } + link_status_text); } /* @@ -768,15 +763,16 @@ monitor_all_ports_link_status(void *arg) return NULL; } -/* Callback for request of changing MTU */ static int -kni_change_mtu(uint16_t port_id, unsigned int new_mtu) +kni_change_mtu_(uint16_t port_id, unsigned int new_mtu) { int ret; uint16_t nb_rxd = NB_RXD; + uint16_t nb_txd = NB_TXD; struct rte_eth_conf conf; struct rte_eth_dev_info dev_info; struct rte_eth_rxconf rxq_conf; + struct rte_eth_txconf txq_conf; if (!rte_eth_dev_is_valid_port(port_id)) { RTE_LOG(ERR, APP, "Invalid port id %d\n", port_id); @@ -786,7 +782,12 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu) RTE_LOG(INFO, APP, "Change MTU of port %d to %u\n", port_id, new_mtu); /* Stop specific port */ - rte_eth_dev_stop(port_id); + ret = rte_eth_dev_stop(port_id); + if (ret != 0) { + RTE_LOG(ERR, APP, "Failed to stop port %d: %s\n", + port_id, rte_strerror(-ret)); + return ret; + } memcpy(&conf, &port_conf, sizeof(conf)); /* Set new MTU */ @@ -804,7 +805,7 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu) return ret; } - ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd, NULL); + ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd, &nb_txd); if (ret < 0) rte_exit(EXIT_FAILURE, "Could not adjust number of descriptors " "for port%u (%d)\n", (unsigned int)port_id, @@ -829,6 +830,16 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu) return ret; } + txq_conf = dev_info.default_txconf; + txq_conf.offloads = conf.txmode.offloads; + ret = rte_eth_tx_queue_setup(port_id, 0, nb_txd, + rte_eth_dev_socket_id(port_id), &txq_conf); + if (ret < 0) { + RTE_LOG(ERR, APP, "Fail to setup Tx queue of port %d\n", + port_id); + return ret; + } + /* Restart specific port */ ret = rte_eth_dev_start(port_id); if (ret < 0) { @@ -839,6 +850,19 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu) return 0; } +/* Callback for request of changing MTU */ +static int +kni_change_mtu(uint16_t port_id, unsigned int new_mtu) +{ + int ret; + + rte_atomic32_inc(&kni_pause); + ret = kni_change_mtu_(port_id, new_mtu); + rte_atomic32_dec(&kni_pause); + + return ret; +} + /* Callback for request of configuring network interface up/down */ static int kni_config_network_interface(uint16_t port_id, uint8_t if_up) @@ -856,10 +880,23 @@ kni_config_network_interface(uint16_t port_id, uint8_t if_up) rte_atomic32_inc(&kni_pause); if (if_up != 0) { /* Configure network interface up */ - rte_eth_dev_stop(port_id); + ret = rte_eth_dev_stop(port_id); + if (ret != 0) { + RTE_LOG(ERR, APP, "Failed to stop port %d: %s\n", + port_id, rte_strerror(-ret)); + rte_atomic32_dec(&kni_pause); + return ret; + } ret = rte_eth_dev_start(port_id); - } else /* Configure network interface down */ - rte_eth_dev_stop(port_id); + } else { /* Configure network interface down */ + ret = rte_eth_dev_stop(port_id); + if (ret != 0) { + RTE_LOG(ERR, APP, "Failed to stop port %d: %s\n", + port_id, rte_strerror(-ret)); + rte_atomic32_dec(&kni_pause); + return ret; + } + } rte_atomic32_dec(&kni_pause); @@ -930,7 +967,7 @@ kni_alloc(uint16_t port_id) conf.mbuf_size = MAX_PACKET_SZ; /* * The first KNI device associated to a port - * is the master, for multiple kernel thread + * is the main, for multiple kernel thread * environment. */ if (i == 0) { @@ -979,6 +1016,7 @@ static int kni_free_kni(uint16_t port_id) { uint8_t i; + int ret; struct kni_port_params **p = kni_port_params_array; if (port_id >= RTE_MAX_ETHPORTS || !p[port_id]) @@ -989,7 +1027,10 @@ kni_free_kni(uint16_t port_id) printf("Fail to release kni\n"); p[port_id]->kni[i] = NULL; } - rte_eth_dev_stop(port_id); + ret = rte_eth_dev_stop(port_id); + if (ret != 0) + RTE_LOG(ERR, APP, "Failed to stop port %d: %s\n", + port_id, rte_strerror(-ret)); return 0; } @@ -1079,8 +1120,8 @@ main(int argc, char** argv) "Could not create link status thread!\n"); /* Launch per-lcore function on every lcore */ - rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER); - RTE_LCORE_FOREACH_SLAVE(i) { + rte_eal_mp_remote_launch(main_loop, NULL, CALL_MAIN); + RTE_LCORE_FOREACH_WORKER(i) { if (rte_eal_wait_lcore(i) < 0) return -1; } @@ -1099,5 +1140,8 @@ main(int argc, char** argv) kni_port_params_array[i] = NULL; } + /* clean up the EAL */ + rte_eal_cleanup(); + return 0; }