X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Fpdump%2Fmain.c;h=c38c53719e7dfdc512473f68ccc4196c3336a66c;hb=867b49d17ac76ac202c307b700c0303ca815300d;hp=3d208548fa13c9d5c89a52f22c3284e1b23715de;hpb=b2854d5317e834afe22e71412befe95b63aded4b;p=dpdk.git diff --git a/app/pdump/main.c b/app/pdump/main.c index 3d208548fa..c38c53719e 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -65,6 +66,8 @@ #define SIZE 256 #define BURST_SIZE 32 #define NUM_VDEVS 2 +/* Maximum delay for exiting after primary process. */ +#define MONITOR_INTERVAL (500 * 1000) /* true if x is a power of 2 */ #define POWEROF2(x) ((((x)-1) & (x)) == 0) @@ -148,7 +151,7 @@ static uint8_t multiple_core_capture; static void pdump_usage(const char *prgname) { - printf("usage: %s [EAL options]" + printf("usage: %s [EAL options] --" " --["CMD_LINE_OPT_MULTI"]\n" " --"CMD_LINE_OPT_PDUMP" " "'(port= | device_id=)," @@ -412,6 +415,21 @@ launch_args_parse(int argc, char **argv, char *prgname) return 0; } +static void +monitor_primary(void *arg __rte_unused) +{ + if (quit_signal) + return; + + if (rte_eal_primary_proc_alive(NULL)) { + rte_eal_alarm_set(MONITOR_INTERVAL, monitor_primary, NULL); + return; + } + + printf("Primary process is no longer active, exiting...\n"); + quit_signal = 1; +} + static void print_pdump_stats(void) { @@ -536,6 +554,21 @@ cleanup_pdump_resources(void) cleanup_rings(); } +static void +disable_primary_monitor(void) +{ + int ret; + + /* + * Cancel monitoring of primary process. + * There will be no error if no alarm is set + * (in case primary process kill was detected earlier). + */ + ret = rte_eal_alarm_cancel(monitor_primary, NULL); + if (ret < 0) + printf("Fail to disable monitor:%d\n", ret); +} + static void signal_handler(int sig_num) { @@ -549,7 +582,7 @@ signal_handler(int sig_num) static inline int configure_vdev(uint16_t port_id) { - struct ether_addr addr; + struct rte_ether_addr addr; const uint16_t rxRings = 0, txRings = 1; int ret; uint16_t q; @@ -562,7 +595,7 @@ configure_vdev(uint16_t port_id) if (ret != 0) rte_exit(EXIT_FAILURE, "dev config failed\n"); - for (q = 0; q < txRings; q++) { + for (q = 0; q < txRings; q++) { ret = rte_eth_tx_queue_setup(port_id, q, TX_DESC_PER_QUEUE, rte_eth_dev_socket_id(port_id), NULL); if (ret < 0) @@ -573,7 +606,10 @@ configure_vdev(uint16_t port_id) if (ret < 0) rte_exit(EXIT_FAILURE, "dev start failed\n"); - rte_eth_macaddr_get(port_id, &addr); + ret = rte_eth_macaddr_get(port_id, &addr); + if (ret != 0) + rte_exit(EXIT_FAILURE, "macaddr get failed\n"); + printf("Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8 " %02"PRIx8" %02"PRIx8" %02"PRIx8"\n", port_id, @@ -581,7 +617,13 @@ configure_vdev(uint16_t port_id) addr.addr_bytes[2], addr.addr_bytes[3], addr.addr_bytes[4], addr.addr_bytes[5]); - rte_eth_promiscuous_enable(port_id); + ret = rte_eth_promiscuous_enable(port_id); + if (ret != 0) { + rte_exit(EXIT_FAILURE, + "promiscuous mode enable failed: %s\n", + rte_strerror(-ret)); + return ret; + } return 0; } @@ -604,11 +646,11 @@ create_mp_ring_vdev(void) mbuf_pool = rte_mempool_lookup(mempool_name); if (mbuf_pool == NULL) { /* create mempool */ - mbuf_pool = rte_pktmbuf_pool_create(mempool_name, + mbuf_pool = rte_pktmbuf_pool_create_by_ops(mempool_name, pt->total_num_mbufs, MBUF_POOL_CACHE_SIZE, 0, pt->mbuf_data_size, - rte_socket_id()); + rte_socket_id(), "ring_mp_mc"); if (mbuf_pool == NULL) { cleanup_rings(); rte_exit(EXIT_FAILURE, @@ -910,6 +952,17 @@ dump_packets(void) ; } +static void +enable_primary_monitor(void) +{ + int ret; + + /* Once primary exits, so will pdump. */ + ret = rte_eal_alarm_set(MONITOR_INTERVAL, monitor_primary, NULL); + if (ret < 0) + printf("Fail to enable monitor:%d\n", ret); +} + int main(int argc, char **argv) { @@ -953,8 +1006,10 @@ main(int argc, char **argv) /* create mempool, ring and vdevs info */ create_mp_ring_vdev(); enable_pdump(); + enable_primary_monitor(); dump_packets(); + disable_primary_monitor(); cleanup_pdump_resources(); /* dump debug stats */ print_pdump_stats();