net/i40e: add interface to choose latest vector path
Checks
Commit Message
Right now, vector path is limited to only use on later platform due
to the frequency penalty. This patch adds a devarg enable-latest-vec
to allow the users to use the latest vector path that the platform
supported. Namely, using AVX2 vector path on broadwell is possible.
Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
---
doc/guides/nics/i40e.rst | 8 ++++++++
doc/guides/rel_notes/release_18_11.rst | 4 ++++
drivers/net/i40e/i40e_ethdev.c | 35 ++++++++++++++++++++++++++++++++++
drivers/net/i40e/i40e_ethdev.h | 1 +
drivers/net/i40e/i40e_rxtx.c | 27 ++++++++++++++++++++++++++
5 files changed, 75 insertions(+)
@@ -163,6 +163,14 @@ Runtime Config Options
Currently hot-plugging of representor ports is not supported so all required
representors must be specified on the creation of the PF.
+- ``Enable latest vector`` (default ``disable``)
+
+ AVX2 vector path cannot be chosen on platforms like HSW/BDW due to throttling
+ penalty. But users may want AVX2 vector path on HSW/BDW because it can get better
+ perf such as in VPP. So ``devargs`` parameter ``enable-latest-vec`` is introduced,
+ for example::
+ -w 84:00.0,enable-latest-vec=1
+
Driver compilation and testing
------------------------------
@@ -54,6 +54,10 @@ New Features
Also, make sure to start the actual text at the margin.
=========================================================
+* **Added a devarg to eable the latest vector path.**
+ A new devarg ``enable-latest-vec`` was introduced to allow users to choose
+ the latest vector path that the platform supported. For example, VPP users
+ can use AVX2 vector path on BDW/HSW to get better performance.
API Changes
-----------
@@ -12513,6 +12513,41 @@ i40e_config_rss_filter(struct i40e_pf *pf,
return 0;
}
+#define ETH_I40E_ENABLE_LATEST_VEC "enable-latest-vec"
+
+bool
+i40e_parse_latest_vec(struct rte_eth_dev *dev)
+{
+ static const char *const valid_keys[] = {
+ ETH_I40E_ENABLE_LATEST_VEC, NULL};
+ int enable_latest_vec;
+ struct rte_kvargs *kvlist;
+
+ if (!dev->device->devargs)
+ return 0;
+
+ kvlist = rte_kvargs_parse(dev->device->devargs->args, valid_keys);
+ if (!kvlist)
+ return -EINVAL;
+
+ if (rte_kvargs_count(kvlist, ETH_I40E_ENABLE_LATEST_VEC) > 1)
+ PMD_DRV_LOG(WARNING, "More than one argument \"%s\" and only "
+ "the first one is used !",
+ ETH_I40E_ENABLE_LATEST_VEC);
+
+ enable_latest_vec = atoi((&kvlist->pairs[0])->value);
+
+ rte_kvargs_free(kvlist);
+
+ if (enable_latest_vec != 0 && enable_latest_vec != 1)
+ PMD_DRV_LOG(WARNING, "Value should be 0 or 1, set it as 1!");
+
+ if (enable_latest_vec)
+ return true;
+ else
+ return false;
+}
+
RTE_INIT(i40e_init_log)
{
i40e_logtype_init = rte_log_register("pmd.net.i40e.init");
@@ -1243,6 +1243,7 @@ int i40e_config_rss_filter(struct i40e_pf *pf,
struct i40e_rte_flow_rss_conf *conf, bool add);
int i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params);
int i40e_vf_representor_uninit(struct rte_eth_dev *ethdev);
+bool i40e_parse_latest_vec(struct rte_eth_dev *dev);
#define I40E_DEV_TO_PCI(eth_dev) \
RTE_DEV_TO_PCI((eth_dev)->device)
@@ -2960,6 +2960,15 @@ i40e_set_rx_function(struct rte_eth_dev *dev)
if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F))
dev->rx_pkt_burst =
i40e_recv_scattered_pkts_vec_avx2;
+ /*
+ * Give users chance to use the latest vector path
+ * that the platform supported.
+ */
+ if (i40e_parse_latest_vec(dev)) {
+ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2))
+ dev->rx_pkt_burst =
+ i40e_recv_scattered_pkts_vec_avx2;
+ }
#endif
} else {
PMD_INIT_LOG(DEBUG, "Using a Scattered with bulk "
@@ -2989,6 +2998,15 @@ i40e_set_rx_function(struct rte_eth_dev *dev)
*/
if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F))
dev->rx_pkt_burst = i40e_recv_pkts_vec_avx2;
+ /*
+ * Give users chance to use the latest vector path
+ * that the platform supported.
+ */
+ if (i40e_parse_latest_vec(dev)) {
+ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2))
+ dev->rx_pkt_burst =
+ i40e_recv_scattered_pkts_vec_avx2;
+ }
#endif
} else if (ad->rx_bulk_alloc_allowed) {
PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
@@ -3083,6 +3101,15 @@ i40e_set_tx_function(struct rte_eth_dev *dev)
*/
if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F))
dev->tx_pkt_burst = i40e_xmit_pkts_vec_avx2;
+ /*
+ * Give users chance to use the latest vector path
+ * that the platform supported.
+ */
+ if (i40e_parse_latest_vec(dev)) {
+ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2))
+ dev->tx_pkt_burst =
+ i40e_xmit_pkts_vec_avx2;
+ }
#endif
} else {
PMD_INIT_LOG(DEBUG, "Simple tx finally be used.");