]> git.droids-corp.org - dpdk.git/commitdiff
examples: fix RSS hash function configuration
authorFerruh Yigit <ferruh.yigit@intel.com>
Wed, 4 Jul 2018 20:02:21 +0000 (21:02 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 5 Jul 2018 13:46:48 +0000 (15:46 +0200)
ethdev layer introduced checks for application requested RSS hash
functions and returns error for ones unsupported by hardware

This check breaks some sample applications which blindly configures
RSS hash functions without checking underlying hardware support.

Updated examples to mask out unsupported RSS has functions during device
configuration.
Prints a log if configuration values updated by this check.

Fixes: aa1a6d87f15d ("ethdev: force RSS offload rules again")
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Tested-by: Meijuan Zhao <meijuanx.zhao@intel.com>
Tested-by: Yingya Han <yingyax.han@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
19 files changed:
app/test-eventdev/test_perf_common.c
app/test-eventdev/test_pipeline_common.c
app/test-pmd/cmdline.c
examples/bond/main.c
examples/distributor/main.c
examples/eventdev_pipeline/main.c
examples/ip_pipeline/link.c
examples/ip_reassembly/main.c
examples/ipsec-secgw/ipsec-secgw.c
examples/l3fwd-acl/main.c
examples/l3fwd-power/main.c
examples/l3fwd-vf/main.c
examples/l3fwd/main.c
examples/load_balancer/init.c
examples/multi_process/symmetric_mp/main.c
examples/performance-thread/l3fwd-thread/main.c
examples/qos_meter/main.c
examples/vmdq_dcb/main.c
lib/librte_ethdev/rte_ethdev.h

index eed80d1b1508a2ce640a8ffbcd04805507b8f9bc..d0d835d5ebead6fb2be7f5e39f0639b17b87a507 100644 (file)
@@ -700,10 +700,23 @@ perf_ethdev_setup(struct evt_test *test, struct evt_options *opt)
        }
 
        RTE_ETH_FOREACH_DEV(i) {
+               struct rte_eth_dev_info dev_info;
+               struct rte_eth_conf local_port_conf = port_conf;
+
+               rte_eth_dev_info_get(i, &dev_info);
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       evt_info("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               i,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
 
-               if (rte_eth_dev_configure(i, 1, 1,
-                                       &port_conf)
-                               < 0) {
+               if (rte_eth_dev_configure(i, 1, 1, &local_port_conf) < 0) {
                        evt_err("Failed to configure eth port [%d]", i);
                        return -EINVAL;
                }
index 3bc9d513d0e9fc1503aee7274dbd1b21840d9be5..239c953e611667e726db79fe5c2a58fc106eed3a 100644 (file)
@@ -240,16 +240,27 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 
        RTE_ETH_FOREACH_DEV(i) {
                struct rte_eth_dev_info dev_info;
+               struct rte_eth_conf local_port_conf = port_conf;
 
-               memset(&dev_info, 0, sizeof(struct rte_eth_dev_info));
                rte_eth_dev_info_get(i, &dev_info);
                mt_state = !(dev_info.tx_offload_capa &
                                DEV_TX_OFFLOAD_MT_LOCKFREE);
                rx_conf = dev_info.default_rxconf;
                rx_conf.offloads = port_conf.rxmode.offloads;
 
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       evt_info("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               i,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                if (rte_eth_dev_configure(i, nb_queues, nb_queues,
-                                       &port_conf)
+                                       &local_port_conf)
                                < 0) {
                        evt_err("Failed to configure eth port [%d]\n", i);
                        return -EINVAL;
index 27e2aa8c869156db671d9231e2e7edaac2f1d844..74a8cd99eb40d270e3ecf00e84cfdc3148db2264 100644 (file)
@@ -2058,11 +2058,21 @@ cmd_config_rss_parsed(void *parsed_result,
        rss_conf.rss_key = NULL;
        /* Update global configuration for RSS types. */
        RTE_ETH_FOREACH_DEV(i) {
-               if (use_default) {
-                       rte_eth_dev_info_get(i, &dev_info);
+               struct rte_eth_rss_conf local_rss_conf;
+
+               rte_eth_dev_info_get(i, &dev_info);
+               if (use_default)
                        rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
+
+               local_rss_conf = rss_conf;
+               local_rss_conf.rss_hf = rss_conf.rss_hf &
+                       dev_info.flow_type_rss_offloads;
+               if (local_rss_conf.rss_hf != rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               i, rss_conf.rss_hf, local_rss_conf.rss_hf);
                }
-               diag = rte_eth_dev_rss_hash_update(i, &rss_conf);
+               diag = rte_eth_dev_rss_hash_update(i, &local_rss_conf);
                if (diag < 0) {
                        all_updated = 0;
                        printf("Configuration of RSS hash at ethernet port %d "
index 98415d66d335282bcbba0fb6a241c857c8e107c8..23d0981abcbacc3c3ebd4e03209343b9ff7a9000 100644 (file)
@@ -153,6 +153,18 @@ slave_port_init(uint16_t portid, struct rte_mempool *mbuf_pool)
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                local_port_conf.txmode.offloads |=
                        DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+               dev_info.flow_type_rss_offloads;
+       if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                       port_conf.rx_adv_conf.rss_conf.rss_hf) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       portid,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf,
+                       local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        retval = rte_eth_dev_configure(portid, 1, 1, &local_port_conf);
        if (retval != 0)
                rte_exit(EXIT_FAILURE, "port %u: configuration failed (res=%d)\n",
index 85881a2e8ce74eeb1c25594141092f2a888e4593..03a05e3d92386869fdec2d45c6cd7dfa1f253e0e 100644 (file)
@@ -123,6 +123,17 @@ port_init(uint16_t port, struct rte_mempool *mbuf_pool)
                port_conf.txmode.offloads |=
                        DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 
+       port_conf.rx_adv_conf.rss_conf.rss_hf &=
+               dev_info.flow_type_rss_offloads;
+       if (port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                       port_conf_default.rx_adv_conf.rss_conf.rss_hf) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       port,
+                       port_conf_default.rx_adv_conf.rss_conf.rss_hf,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        retval = rte_eth_dev_configure(port, rxRings, txRings, &port_conf);
        if (retval != 0)
                return retval;
index 7bc2949463175b2006a731444616d0a775e9d925..700bc696fb2dbc7e7bcf8d004f685ef0d1aeaa9e 100644 (file)
@@ -292,6 +292,17 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
                port_conf.txmode.offloads |=
                        DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 
+       port_conf.rx_adv_conf.rss_conf.rss_hf &=
+               dev_info.flow_type_rss_offloads;
+       if (port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                       port_conf_default.rx_adv_conf.rss_conf.rss_hf) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       port,
+                       port_conf_default.rx_adv_conf.rss_conf.rss_hf,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        /* Configure the Ethernet device. */
        retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);
        if (retval != 0)
index 181c31f9c4bc64f8cfc11b3d79d82e0727bc963f..805c2eb95cf2d6f22be15c9c814c33e8db92d06c 100644 (file)
@@ -152,8 +152,12 @@ link_create(const char *name, struct link_params *params)
        memcpy(&port_conf, &port_conf_default, sizeof(port_conf));
        if (rss) {
                port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
-               port_conf.rx_adv_conf.rss_conf.rss_hf =
-                       ETH_RSS_IPV4 | ETH_RSS_IPV6;
+               if (port_info.flow_type_rss_offloads & ETH_RSS_IPV4)
+                       port_conf.rx_adv_conf.rss_conf.rss_hf |=
+                               ETH_RSS_IPV4;
+               if (port_info.flow_type_rss_offloads & ETH_RSS_IPV6)
+                       port_conf.rx_adv_conf.rss_conf.rss_hf |=
+                               ETH_RSS_IPV6;
        }
 
        cpu_id = (uint32_t) rte_eth_dev_socket_id(port_id);
index 94e63fc6ae3e717514bbaa094a3e92700712f89c..b830f67a522f2bdb3709f159acee26178736eea3 100644 (file)
@@ -1082,6 +1082,18 @@ main(int argc, char **argv)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               portid,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(portid, 1, (uint16_t)n_tx_queue,
                                            &local_port_conf);
                if (ret < 0) {
index 199bae51bfdb71c5d18ec81ee9343ec0f8fb5369..68b346502471a5c567d3f4d726e75613b4df19ac 100644 (file)
@@ -1565,6 +1565,18 @@ port_init(uint16_t portid)
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                local_port_conf.txmode.offloads |=
                        DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+               dev_info.flow_type_rss_offloads;
+       if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                       port_conf.rx_adv_conf.rss_conf.rss_hf) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       portid,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf,
+                       local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        ret = rte_eth_dev_configure(portid, nb_rx_queue, nb_tx_queue,
                        &local_port_conf);
        if (ret < 0)
index 55a5a69e59a066e467280c5f7402b23c302f62d5..7c063a8d005e69837ec0bcd15b9170e69d9f52c2 100644 (file)
@@ -1925,6 +1925,18 @@ main(int argc, char **argv)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               portid,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                        (uint16_t)n_tx_queue, &local_port_conf);
                if (ret < 0)
index 710b76d128cb7999e1324af56af9554c0b7049de..f6fabd95ff67fd0ffd8bd8e96a9656526975cb9d 100644 (file)
@@ -1692,6 +1692,18 @@ main(int argc, char **argv)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               portid,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                        (uint16_t)n_tx_queue, &local_port_conf);
                if (ret < 0)
index 43e62982813484a63713855ac4fed9e7420784d9..5edd91a78f16b651e70b778789e35b19392a5bfd 100644 (file)
@@ -980,6 +980,18 @@ main(int argc, char **argv)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               portid,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                            n_tx_queue, &local_port_conf);
                if (ret < 0)
index faef9f1ac842f87d8bd71f54ae56ebdefda118ea..ab019b9e40f8b5b5c83200612c492f164352d83f 100644 (file)
@@ -860,6 +860,18 @@ main(int argc, char **argv)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               portid,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                        (uint16_t)n_tx_queue, &local_port_conf);
                if (ret < 0)
index 6aa079c695f9067c1a222d70b42b264744c76901..f2045f235f30f45d20c376fb1e7f655e2408387c 100644 (file)
@@ -416,6 +416,18 @@ app_init_nics(void)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               port,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(
                        port,
                        (uint8_t) n_rx_queues,
index c363269171ca4a4370e2dd38b8431b52257a4593..c6c6a537fe2ea432ce1b82bed3c70c10af78afad 100644 (file)
@@ -199,6 +199,7 @@ smp_port_init(uint16_t port, struct rte_mempool *mbuf_pool,
        uint16_t q;
        uint16_t nb_rxd = RX_RING_SIZE;
        uint16_t nb_txd = TX_RING_SIZE;
+       uint64_t rss_hf_tmp;
 
        if (rte_eal_process_type() == RTE_PROC_SECONDARY)
                return 0;
@@ -215,6 +216,17 @@ smp_port_init(uint16_t port, struct rte_mempool *mbuf_pool,
        if (info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                port_conf.txmode.offloads |=
                        DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       rss_hf_tmp = port_conf.rx_adv_conf.rss_conf.rss_hf;
+       port_conf.rx_adv_conf.rss_conf.rss_hf &= info.flow_type_rss_offloads;
+       if (port_conf.rx_adv_conf.rss_conf.rss_hf != rss_hf_tmp) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       port,
+                       rss_hf_tmp,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);
        if (retval < 0)
                return retval;
index d1e4a1880869c41d7f00a53f8b4f41712644c573..5392fcea8cd9f0b1086960fa7bd0de6606162490 100644 (file)
@@ -3550,6 +3550,18 @@ main(int argc, char **argv)
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
+                       dev_info.flow_type_rss_offloads;
+               if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
+                               port_conf.rx_adv_conf.rss_conf.rss_hf) {
+                       printf("Port %u modified RSS hash function based on hardware support,"
+                               "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                               portid,
+                               port_conf.rx_adv_conf.rss_conf.rss_hf,
+                               local_port_conf.rx_adv_conf.rss_conf.rss_hf);
+               }
+
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                        (uint16_t)n_tx_queue, &local_port_conf);
                if (ret < 0)
index ca0e9e8635a8423384d7e3118147a22e88048dc8..5cf4e9dfa4f1e787fceec26b895b6c7b9c81dcd2 100644 (file)
@@ -332,6 +332,17 @@ main(int argc, char **argv)
        rte_eth_dev_info_get(port_rx, &dev_info);
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                conf.txmode.offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       conf.rx_adv_conf.rss_conf.rss_hf &= dev_info.flow_type_rss_offloads;
+       if (conf.rx_adv_conf.rss_conf.rss_hf !=
+                       port_conf.rx_adv_conf.rss_conf.rss_hf) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       port_rx,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf,
+                       conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        ret = rte_eth_dev_configure(port_rx, 1, 1, &conf);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Port %d configuration error (%d)\n", port_rx, ret);
@@ -361,6 +372,17 @@ main(int argc, char **argv)
        rte_eth_dev_info_get(port_tx, &dev_info);
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                conf.txmode.offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       conf.rx_adv_conf.rss_conf.rss_hf &= dev_info.flow_type_rss_offloads;
+       if (conf.rx_adv_conf.rss_conf.rss_hf !=
+                       port_conf.rx_adv_conf.rss_conf.rss_hf) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       port_tx,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf,
+                       conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        ret = rte_eth_dev_configure(port_tx, 1, 1, &conf);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Port %d configuration error (%d)\n", port_tx, ret);
index 5a0463c58a657b6d07cbe7001b66520f59dbc779..646368395e451151c62df2c3d3201db7a33b3e62 100644 (file)
@@ -196,6 +196,7 @@ port_init(uint16_t port, struct rte_mempool *mbuf_pool)
        uint16_t queues_per_pool;
        uint32_t max_nb_pools;
        struct rte_eth_txconf txq_conf;
+       uint64_t rss_hf_tmp;
 
        /*
         * The max pool number from dev_info will be used to validate the pool
@@ -256,6 +257,18 @@ port_init(uint16_t port, struct rte_mempool *mbuf_pool)
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                port_conf.txmode.offloads |=
                        DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       rss_hf_tmp = port_conf.rx_adv_conf.rss_conf.rss_hf;
+       port_conf.rx_adv_conf.rss_conf.rss_hf &=
+               dev_info.flow_type_rss_offloads;
+       if (port_conf.rx_adv_conf.rss_conf.rss_hf != rss_hf_tmp) {
+               printf("Port %u modified RSS hash function based on hardware support,"
+                       "requested:%#"PRIx64" configured:%#"PRIx64"\n",
+                       port,
+                       rss_hf_tmp,
+                       port_conf.rx_adv_conf.rss_conf.rss_hf);
+       }
+
        /*
         * Though in this example, all queues including pf queues are setup.
         * This is because VMDQ queues doesn't always start from zero, and the
index 6d4caff6bc7c947068c10cd12d61e9200c07da69..f5f593b31127d3e574bebe76621ed5041bdc3c78 100644 (file)
@@ -1515,9 +1515,11 @@ const char * __rte_experimental rte_eth_dev_tx_offload_name(uint64_t offload);
  *        the [rt]x_offload_capa returned from rte_eth_dev_infos_get().
  *        Any type of device supported offloading set in the input argument
  *        eth_conf->[rt]xmode.offloads to rte_eth_dev_configure() is enabled
- *        on all queues and it can't be disabled in rte_eth_[rt]x_queue_setup().
- *     - the Receive Side Scaling (RSS) configuration when using multiple RX
- *         queues per port.
+ *        on all queues and it can't be disabled in rte_eth_[rt]x_queue_setup()
+ *     -  the Receive Side Scaling (RSS) configuration when using multiple RX
+ *        queues per port. Any RSS hash function set in eth_conf->rss_conf.rss_hf
+ *        must be within the flow_type_rss_offloads provided by drivers via
+ *        rte_eth_dev_infos_get() API.
  *
  *   Embedding all configuration information in a single data structure
  *   is the more flexible method that allows the addition of new features