diff options
author | Matias Elo <matias.elo@nokia.com> | 2021-11-30 16:05:26 +0200 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2023-04-05 16:08:16 +0300 |
commit | de39c8170c7053d4525db0b948b2ff5893264b05 (patch) | |
tree | fbd6dcf40d59465a59f7d0051ed2ce29d67c453d /platform/linux-dpdk | |
parent | 8592c834024714eae589c00d0d433420db8d92c0 (diff) |
linux-dpdk: pktio: add configuration option for enabling multi segment tx
Add new configuration option 'pktio_dpdk:tx_offload_multi_segs' for
enabling multi segment transmit offload. This offload may not be supported
by some PMDs and may lower maximum throughput, so the options is not
enabled by default.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Tuomas Taipale <tuomas.taipale@nokia.com>
Diffstat (limited to 'platform/linux-dpdk')
-rw-r--r-- | platform/linux-dpdk/m4/odp_libconfig.m4 | 2 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_packet_dpdk.c | 25 | ||||
-rw-r--r-- | platform/linux-dpdk/test/alternate-timer.conf | 2 | ||||
-rw-r--r-- | platform/linux-dpdk/test/crypto.conf | 2 | ||||
-rw-r--r-- | platform/linux-dpdk/test/process-mode.conf | 2 | ||||
-rw-r--r-- | platform/linux-dpdk/test/sched-basic.conf | 2 | ||||
-rw-r--r-- | platform/linux-dpdk/test/stash-custom.conf | 2 |
7 files changed, 27 insertions, 10 deletions
diff --git a/platform/linux-dpdk/m4/odp_libconfig.m4 b/platform/linux-dpdk/m4/odp_libconfig.m4 index 1d56f0a5c..091694d87 100644 --- a/platform/linux-dpdk/m4/odp_libconfig.m4 +++ b/platform/linux-dpdk/m4/odp_libconfig.m4 @@ -3,7 +3,7 @@ ########################################################################## m4_define([_odp_config_version_generation], [0]) m4_define([_odp_config_version_major], [1]) -m4_define([_odp_config_version_minor], [21]) +m4_define([_odp_config_version_minor], [22]) m4_define([_odp_config_version], [_odp_config_version_generation._odp_config_version_major._odp_config_version_minor]) diff --git a/platform/linux-dpdk/odp_packet_dpdk.c b/platform/linux-dpdk/odp_packet_dpdk.c index 6622f0161..33b4a578d 100644 --- a/platform/linux-dpdk/odp_packet_dpdk.c +++ b/platform/linux-dpdk/odp_packet_dpdk.c @@ -91,6 +91,7 @@ #define RTE_ETH_TX_OFFLOAD_SCTP_CKSUM DEV_TX_OFFLOAD_SCTP_CKSUM #define RTE_ETH_TX_OFFLOAD_TCP_CKSUM DEV_TX_OFFLOAD_TCP_CKSUM #define RTE_ETH_TX_OFFLOAD_UDP_CKSUM DEV_TX_OFFLOAD_UDP_CKSUM + #define RTE_ETH_TX_OFFLOAD_MULTI_SEGS DEV_TX_OFFLOAD_MULTI_SEGS #define RTE_ETH_FC_FULL RTE_FC_FULL #define RTE_ETH_FC_RX_PAUSE RTE_FC_RX_PAUSE @@ -121,6 +122,7 @@ typedef struct { int num_rx_desc_default; int num_tx_desc_default; int rx_drop_en; + int tx_offload_multi_segs; } dpdk_opt_t; /* DPDK pktio specific data */ @@ -229,12 +231,18 @@ static int init_options(pktio_entry_t *pktio_entry, return -1; opt->multicast_enable = !!opt->multicast_enable; + if (!lookup_opt("tx_offload_multi_segs", dev_info->driver_name, + &opt->tx_offload_multi_segs)) + return -1; + opt->tx_offload_multi_segs = !!opt->tx_offload_multi_segs; + _ODP_DBG("DPDK interface (%s): %" PRIu16 "\n", dev_info->driver_name, pkt_priv(pktio_entry)->port_id); _ODP_DBG(" multicast: %d\n", opt->multicast_enable); _ODP_DBG(" num_rx_desc: %d\n", opt->num_rx_desc_default); _ODP_DBG(" num_tx_desc: %d\n", opt->num_tx_desc_default); _ODP_DBG(" rx_drop_en: %d\n", opt->rx_drop_en); + _ODP_DBG(" tx_offload_multi_segs: %d\n", opt->tx_offload_multi_segs); return 0; } @@ -294,7 +302,7 @@ static int dpdk_maxlen_set(pktio_entry_t *pktio_entry, uint32_t maxlen_input, return ret; } -static int dpdk_setup_eth_dev(pktio_entry_t *pktio_entry) +static int dpdk_setup_eth_dev(pktio_entry_t *pktio_entry, const struct rte_eth_dev_info *dev_info) { int ret; pkt_dpdk_t *pkt_dpdk = pkt_priv(pktio_entry); @@ -334,11 +342,20 @@ static int dpdk_setup_eth_dev(pktio_entry_t *pktio_entry) if (pktio_entry->config.pktout.bit.sctp_chksum_ena) tx_offloads |= RTE_ETH_TX_OFFLOAD_SCTP_CKSUM; - eth_conf.txmode.offloads = tx_offloads; - if (tx_offloads) pktio_entry->enabled.chksum_insert = 1; + /* Enable multi segment transmit offload */ + if (pkt_dpdk->opt.tx_offload_multi_segs) { + if ((dev_info->tx_offload_capa & RTE_ETH_TX_OFFLOAD_MULTI_SEGS) == 0) { + _ODP_ERR("TX multi segment offload not supported by PMD\n"); + return -1; + } + tx_offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS; + } + + eth_conf.txmode.offloads = tx_offloads; + /* RX packet len same size as pool segment minus headroom and double * VLAN tag */ @@ -863,7 +880,7 @@ static int dpdk_start(pktio_entry_t *pktio_entry) rte_eth_dev_info_get(port_id, &dev_info); /* Setup device */ - if (dpdk_setup_eth_dev(pktio_entry)) { + if (dpdk_setup_eth_dev(pktio_entry, &dev_info)) { _ODP_ERR("Failed to configure device\n"); return -1; } diff --git a/platform/linux-dpdk/test/alternate-timer.conf b/platform/linux-dpdk/test/alternate-timer.conf index d976d05fe..d136de1b8 100644 --- a/platform/linux-dpdk/test/alternate-timer.conf +++ b/platform/linux-dpdk/test/alternate-timer.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-dpdk" -config_file_version = "0.1.21" +config_file_version = "0.1.22" timer: { # Enable alternate DPDK timer implementation diff --git a/platform/linux-dpdk/test/crypto.conf b/platform/linux-dpdk/test/crypto.conf index 1fcaf658e..dad0494e4 100644 --- a/platform/linux-dpdk/test/crypto.conf +++ b/platform/linux-dpdk/test/crypto.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-dpdk" -config_file_version = "0.1.21" +config_file_version = "0.1.22" system: { # One crypto queue pair is required per thread for lockless operation diff --git a/platform/linux-dpdk/test/process-mode.conf b/platform/linux-dpdk/test/process-mode.conf index 7a98cef10..cb982eeed 100644 --- a/platform/linux-dpdk/test/process-mode.conf +++ b/platform/linux-dpdk/test/process-mode.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-dpdk" -config_file_version = "0.1.21" +config_file_version = "0.1.22" dpdk: { process_mode_memory_mb = 1024 diff --git a/platform/linux-dpdk/test/sched-basic.conf b/platform/linux-dpdk/test/sched-basic.conf index e3d9dd304..ab8073478 100644 --- a/platform/linux-dpdk/test/sched-basic.conf +++ b/platform/linux-dpdk/test/sched-basic.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-dpdk" -config_file_version = "0.1.21" +config_file_version = "0.1.22" # Test scheduler with an odd spread value and without dynamic load balance sched_basic: { diff --git a/platform/linux-dpdk/test/stash-custom.conf b/platform/linux-dpdk/test/stash-custom.conf index 5e3ea5cdf..9a1744d24 100644 --- a/platform/linux-dpdk/test/stash-custom.conf +++ b/platform/linux-dpdk/test/stash-custom.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-dpdk" -config_file_version = "0.1.21" +config_file_version = "0.1.22" # Test overflow safe stash variant stash: { |