[dpdk-dev] [PATCH] app/testpmd: check socket id validity

David Marchand david.marchand at 6wind.com
Tue Apr 15 15:51:39 CEST 2014


From: Liu Xiaofeng <xiaofeng.liu at 6wind.com>

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 <xiaofeng.liu at 6wind.com>
---
 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 0816227..1feb133 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 04dca57..97229a5 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));
-- 
1.7.10.4



More information about the dev mailing list