sched: remove useless malloc in PIE data init
[dpdk.git] / examples / l3fwd / main.c
index 7701302..eb68ffc 100644 (file)
@@ -119,24 +119,25 @@ static uint16_t nb_lcore_params = sizeof(lcore_params_array_default) /
 
 static struct rte_eth_conf port_conf = {
        .rxmode = {
-               .mq_mode = ETH_MQ_RX_RSS,
+               .mq_mode = RTE_ETH_MQ_RX_RSS,
                .split_hdr_size = 0,
-               .offloads = DEV_RX_OFFLOAD_CHECKSUM,
+               .offloads = RTE_ETH_RX_OFFLOAD_CHECKSUM,
        },
        .rx_adv_conf = {
                .rss_conf = {
                        .rss_key = NULL,
-                       .rss_hf = ETH_RSS_IP,
+                       .rss_hf = RTE_ETH_RSS_IP,
                },
        },
        .txmode = {
-               .mq_mode = ETH_MQ_TX_NONE,
+               .mq_mode = RTE_ETH_MQ_TX_NONE,
        },
 };
 
 static uint32_t max_pkt_len;
 
 static struct rte_mempool *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];
+static struct rte_mempool *vector_pool[RTE_MAX_ETHPORTS];
 static uint8_t lkp_per_socket[NB_SOCKETS];
 
 struct l3fwd_lkp_mode {
@@ -179,7 +180,7 @@ static struct l3fwd_lkp_mode l3fwd_fib_lkp = {
 
 /*
  * 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735).
- * 198.18.{0-7}.0/24 = Port {0-7}
+ * 198.18.{0-15}.0/24 = Port {0-15}
  */
 const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {
        {RTE_IPV4(198, 18, 0, 0), 24, 0},
@@ -190,11 +191,19 @@ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {
        {RTE_IPV4(198, 18, 5, 0), 24, 5},
        {RTE_IPV4(198, 18, 6, 0), 24, 6},
        {RTE_IPV4(198, 18, 7, 0), 24, 7},
+       {RTE_IPV4(198, 18, 8, 0), 24, 8},
+       {RTE_IPV4(198, 18, 9, 0), 24, 9},
+       {RTE_IPV4(198, 18, 10, 0), 24, 10},
+       {RTE_IPV4(198, 18, 11, 0), 24, 11},
+       {RTE_IPV4(198, 18, 12, 0), 24, 12},
+       {RTE_IPV4(198, 18, 13, 0), 24, 13},
+       {RTE_IPV4(198, 18, 14, 0), 24, 14},
+       {RTE_IPV4(198, 18, 15, 0), 24, 15},
 };
 
 /*
  * 2001:200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180).
- * 2001:200:0:{0-7}::/64 = Port {0-7}
+ * 2001:200:0:{0-f}::/64 = Port {0-15}
  */
 const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = {
        {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0},
@@ -205,6 +214,14 @@ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = {
        {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5},
        {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6},
        {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7},
+       {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8},
+       {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9},
+       {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10},
+       {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11},
+       {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12},
+       {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13},
+       {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14},
+       {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15},
 };
 
 /*
@@ -334,6 +351,7 @@ print_usage(const char *prgname)
                " [--per-port-pool]"
                " [--mode]"
                " [--eventq-sched]"
+               " [--event-vector [--event-vector-size SIZE] [--event-vector-tmo NS]]"
                " [-E]"
                " [-L]\n\n"
 
@@ -359,6 +377,9 @@ print_usage(const char *prgname)
                "  --event-eth-rxqs: Number of ethernet RX queues per device.\n"
                "                    Default: 1\n"
                "                    Valid only if --mode=eventdev\n"
+               "  --event-vector:  Enable event vectorization.\n"
+               "  --event-vector-size: Max vector size if event vectorization is enabled.\n"
+               "  --event-vector-tmo: Max timeout to form vector in nanoseconds if event vectorization is enabled\n"
                "  -E : Enable exact match, legacy flag please use --lookup=em instead\n"
                "  -L : Enable longest prefix match, legacy flag please use --lookup=lpm instead\n\n",
                prgname);
@@ -572,6 +593,10 @@ static const char short_options[] =
 #define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched"
 #define CMD_LINE_OPT_EVENT_ETH_RX_QUEUES "event-eth-rxqs"
 #define CMD_LINE_OPT_LOOKUP "lookup"
+#define CMD_LINE_OPT_ENABLE_VECTOR "event-vector"
+#define CMD_LINE_OPT_VECTOR_SIZE "event-vector-size"
+#define CMD_LINE_OPT_VECTOR_TMO_NS "event-vector-tmo"
+
 enum {
        /* long options mapped to a short option */
 
@@ -590,6 +615,9 @@ enum {
        CMD_LINE_OPT_EVENTQ_SYNC_NUM,
        CMD_LINE_OPT_EVENT_ETH_RX_QUEUES_NUM,
        CMD_LINE_OPT_LOOKUP_NUM,
+       CMD_LINE_OPT_ENABLE_VECTOR_NUM,
+       CMD_LINE_OPT_VECTOR_SIZE_NUM,
+       CMD_LINE_OPT_VECTOR_TMO_NS_NUM
 };
 
 static const struct option lgopts[] = {
@@ -606,6 +634,9 @@ static const struct option lgopts[] = {
        {CMD_LINE_OPT_EVENT_ETH_RX_QUEUES, 1, 0,
                                        CMD_LINE_OPT_EVENT_ETH_RX_QUEUES_NUM},
        {CMD_LINE_OPT_LOOKUP, 1, 0, CMD_LINE_OPT_LOOKUP_NUM},
+       {CMD_LINE_OPT_ENABLE_VECTOR, 0, 0, CMD_LINE_OPT_ENABLE_VECTOR_NUM},
+       {CMD_LINE_OPT_VECTOR_SIZE, 1, 0, CMD_LINE_OPT_VECTOR_SIZE_NUM},
+       {CMD_LINE_OPT_VECTOR_TMO_NS, 1, 0, CMD_LINE_OPT_VECTOR_TMO_NS_NUM},
        {NULL, 0, 0, 0}
 };
 
@@ -750,6 +781,16 @@ parse_args(int argc, char **argv)
                                return -1;
                        break;
 
+               case CMD_LINE_OPT_ENABLE_VECTOR_NUM:
+                       printf("event vectorization is enabled\n");
+                       evt_rsrc->vector_enabled = 1;
+                       break;
+               case CMD_LINE_OPT_VECTOR_SIZE_NUM:
+                       evt_rsrc->vector_size = strtol(optarg, NULL, 10);
+                       break;
+               case CMD_LINE_OPT_VECTOR_TMO_NS_NUM:
+                       evt_rsrc->vector_tmo_ns = strtoull(optarg, NULL, 10);
+                       break;
                default:
                        print_usage(prgname);
                        return -1;
@@ -771,6 +812,19 @@ parse_args(int argc, char **argv)
                return -1;
        }
 
+       if (evt_rsrc->vector_enabled && !evt_rsrc->vector_size) {
+               evt_rsrc->vector_size = VECTOR_SIZE_DEFAULT;
+               fprintf(stderr, "vector size set to default (%" PRIu16 ")\n",
+                       evt_rsrc->vector_size);
+       }
+
+       if (evt_rsrc->vector_enabled && !evt_rsrc->vector_tmo_ns) {
+               evt_rsrc->vector_tmo_ns = VECTOR_TMO_NS_DEFAULT;
+               fprintf(stderr,
+                       "vector timeout set to default (%" PRIu64 " ns)\n",
+                       evt_rsrc->vector_tmo_ns);
+       }
+
        /*
         * Nothing is selected, pick longest-prefix match
         * as default match.
@@ -809,6 +863,7 @@ print_ethaddr(const char *name, const struct rte_ether_addr *eth_addr)
 int
 init_mem(uint16_t portid, unsigned int nb_mbuf)
 {
+       struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
        struct lcore_conf *qconf;
        int socketid;
        unsigned lcore_id;
@@ -852,6 +907,24 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
                                lkp_per_socket[socketid] = 1;
                        }
                }
+
+               if (evt_rsrc->vector_enabled && vector_pool[portid] == NULL) {
+                       unsigned int nb_vec;
+
+                       nb_vec = (nb_mbuf + evt_rsrc->vector_size - 1) /
+                                evt_rsrc->vector_size;
+                       snprintf(s, sizeof(s), "vector_pool_%d", portid);
+                       vector_pool[portid] = rte_event_vector_pool_create(
+                               s, nb_vec, 0, evt_rsrc->vector_size, socketid);
+                       if (vector_pool[portid] == NULL)
+                               rte_exit(EXIT_FAILURE,
+                                        "Failed to create vector pool for port %d\n",
+                                        portid);
+                       else
+                               printf("Allocated vector pool for port %d\n",
+                                      portid);
+               }
+
                qconf = &lcore_conf[lcore_id];
                qconf->ipv4_lookup_struct =
                        l3fwd_lkp.get_ipv4_lookup_struct(socketid);
@@ -902,7 +975,7 @@ check_all_ports_link_status(uint32_t port_mask)
                                continue;
                        }
                        /* clear all_ports_up flag if any link down */
-                       if (link.link_status == ETH_LINK_DOWN) {
+                       if (link.link_status == RTE_ETH_LINK_DOWN) {
                                all_ports_up = 0;
                                break;
                        }
@@ -986,10 +1059,8 @@ config_port_max_pkt_len(struct rte_eth_conf *conf,
                        dev_info->max_mtu);
        conf->rxmode.mtu = max_pkt_len - overhead_len;
 
-       if (conf->rxmode.mtu > RTE_ETHER_MTU) {
-               conf->txmode.offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
-               conf->rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-       }
+       if (conf->rxmode.mtu > RTE_ETHER_MTU)
+               conf->txmode.offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
 
        return 0;
 }
@@ -1054,15 +1125,15 @@ l3fwd_poll_resource_setup(void)
                                "Invalid max packet length: %u (port %u)\n",
                                max_pkt_len, portid);
 
-               if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+               if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
-                               DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+                               RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
 
                local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
                        dev_info.flow_type_rss_offloads;
 
                if (dev_info.max_rx_queues == 1)
-                       local_port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
+                       local_port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_NONE;
 
                if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
                                port_conf.rx_adv_conf.rss_conf.rss_hf) {
@@ -1326,6 +1397,7 @@ main(int argc, char **argv)
 
        evt_rsrc->per_port_pool = per_port_pool;
        evt_rsrc->pkt_pool = pktmbuf_pool;
+       evt_rsrc->vec_pool = vector_pool;
        evt_rsrc->port_mask = enabled_port_mask;
        /* Configure eventdev parameters if user has requested */
        if (evt_rsrc->enabled) {