summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu Xiaofeng <xiaofeng.liu@6wind.com>2014-04-15 15:51:39 +0200
committerThomas Monjalon <thomas.monjalon@6wind.com>2014-04-30 14:23:09 +0200
commit20a0286fd2c0f03bfe06ae419c128b648f5bf9bf (patch)
treee11cd088431288624bb680070f3c446d4ba90a2b
parentc87215d0458d6d6cce35b85e5197d3b7b4c03087 (diff)
downloaddpdk-20a0286fd2c0f03bfe06ae419c128b648f5bf9bf.zip
dpdk-20a0286fd2c0f03bfe06ae419c128b648f5bf9bf.tar.gz
dpdk-20a0286fd2c0f03bfe06ae419c128b648f5bf9bf.tar.xz
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 <xiaofeng.liu@6wind.com> Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
-rw-r--r--app/test-pmd/config.c6
-rw-r--r--app/test-pmd/testpmd.c40
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));