aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2021-11-30 16:05:26 +0200
committerMatias Elo <matias.elo@nokia.com>2023-04-05 16:08:16 +0300
commitde39c8170c7053d4525db0b948b2ff5893264b05 (patch)
treefbd6dcf40d59465a59f7d0051ed2ce29d67c453d /platform/linux-dpdk
parent8592c834024714eae589c00d0d433420db8d92c0 (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.m42
-rw-r--r--platform/linux-dpdk/odp_packet_dpdk.c25
-rw-r--r--platform/linux-dpdk/test/alternate-timer.conf2
-rw-r--r--platform/linux-dpdk/test/crypto.conf2
-rw-r--r--platform/linux-dpdk/test/process-mode.conf2
-rw-r--r--platform/linux-dpdk/test/sched-basic.conf2
-rw-r--r--platform/linux-dpdk/test/stash-custom.conf2
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: {