app/testpmd: check socket id validity
authorLiu Xiaofeng <xiaofeng.liu@6wind.com>
Tue, 15 Apr 2014 13:51:39 +0000 (15:51 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 30 Apr 2014 12:23:09 +0000 (14:23 +0200)
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>
app/test-pmd/config.c
app/test-pmd/testpmd.c

index 0816227..1feb133 100644 (file)
@@ -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);
index 04dca57..97229a5 100644 (file)
@@ -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));