From 20a0286fd2c0f03bfe06ae419c128b648f5bf9bf Mon Sep 17 00:00:00 2001 From: Liu Xiaofeng Date: Tue, 15 Apr 2014 15:51:39 +0200 Subject: [PATCH] app/testpmd: check socket id validity Now socket id is from device's numa_node, if it is invalid, just set it to 0 as default to avoid crash which will be caused by the reference to port_per_socket[socket_id]. Also one warning is displayed to user that port-numa-config and ring-numa-config parameters should be used along with --numa for NUMA mode. A check for NUMA_NO_CONFIG was also missing from init_fwd_stream(). Signed-off-by: Liu Xiaofeng Acked-by: Thomas Monjalon --- app/test-pmd/config.c | 6 ++---- app/test-pmd/testpmd.c | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 0816227019..1feb1339fc 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -244,7 +244,6 @@ port_infos_display(portid_t port_id) struct rte_port *port; struct rte_eth_link link; int vlan_offload; - int socket_id; struct rte_mempool * mp; static const char *info_border = "*********************"; @@ -254,11 +253,10 @@ port_infos_display(portid_t port_id) } port = &ports[port_id]; rte_eth_link_get_nowait(port_id, &link); - socket_id = rte_eth_dev_socket_id(port_id); printf("\n%s Infos for port %-2d %s\n", info_border, port_id, info_border); print_ethaddr("MAC address: ", &port->eth_addr); - printf("\nConnect to socket: %d",socket_id); + printf("\nConnect to socket: %d", port->socket_id); if (port_numa[port_id] != NUMA_NO_CONFIG) { mp = mbuf_pool_find(port_numa[port_id]); @@ -266,7 +264,7 @@ port_infos_display(portid_t port_id) printf("\nmemory allocation on the socket: %d", port_numa[port_id]); } else - printf("\nmemory allocation on the socket: %d",socket_id); + printf("\nmemory allocation on the socket: %d",port->socket_id); printf("\nLink status: %s\n", (link.link_status) ? ("up") : ("down")); printf("Link speed: %u Mbps\n", (unsigned) link.link_speed); diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 04dca57a2a..97229a5d36 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -475,6 +475,27 @@ mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf, } } +/* + * Check given socket id is valid or not with NUMA mode, + * if valid, return 0, else return -1 + */ +static int +check_socket_id(const unsigned int socket_id) +{ + static int warning_once = 0; + + if (socket_id >= MAX_SOCKET) { + if (!warning_once && numa_support) + printf("Warning: NUMA should be configured manually by" + " using --port-numa-config and" + " --ring-numa-config parameters along with" + " --numa.\n"); + warning_once = 1; + return -1; + } + return 0; +} + static void init_config(void) { @@ -559,6 +580,10 @@ init_config(void) port_per_socket[port_numa[pid]]++; else { uint32_t socket_id = rte_eth_dev_socket_id(pid); + + /* if socket_id is invalid, set to 0 */ + if (check_socket_id(socket_id) < 0) + socket_id = 0; port_per_socket[socket_id]++; } } @@ -611,8 +636,17 @@ init_fwd_streams(void) port->dev_info.max_tx_queues); return -1; } - if (numa_support) - port->socket_id = rte_eth_dev_socket_id(pid); + if (numa_support) { + if (port_numa[pid] != NUMA_NO_CONFIG) + port->socket_id = port_numa[pid]; + else { + port->socket_id = rte_eth_dev_socket_id(pid); + + /* if socket_id is invalid, set to 0 */ + if (check_socket_id(port->socket_id) < 0) + port->socket_id = 0; + } + } else { if (socket_num == UMA_NO_CONFIG) port->socket_id = 0; @@ -1215,7 +1249,7 @@ start_port(portid_t pid) port->need_reconfig = 0; printf("Configuring Port %d (socket %d)\n", pi, - rte_eth_dev_socket_id(pi)); + port->socket_id); /* configure port */ diag = rte_eth_dev_configure(pi, nb_rxq, nb_txq, &(port->dev_conf)); -- 2.20.1