* [PATCH v2 4/7] net/ena: support fragment bypass mode
@ 2025-05-22 13:08 Shai Brandes
2025-05-22 13:08 ` [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure Shai Brandes
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Shai Brandes @ 2025-05-22 13:08 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes, Yosef Raisman
Introduce devarg `enable_frag_bypass` to toggle the fragment bypass
mode for egress packets.
When enabled, this feature bypasses the PPS limit enforced by EC2 for
fragmented egress packets on every ENI. Note that enabling this might
negatively impact network performance.
By default, this feature is disabled. To enable it set
`enable_frag_bypass=1`. If it cannot be enabled, a warning will be
printed, but driver initialization will proceed as normal.
Signed-off-by: Yosef Raisman <yraisman@amazon.com>
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
---
doc/guides/nics/ena.rst | 9 ++++
doc/guides/rel_notes/release_25_07.rst | 5 ++
drivers/net/ena/base/ena_com.c | 33 +++++++++++++
drivers/net/ena/base/ena_com.h | 8 ++++
.../net/ena/base/ena_defs/ena_admin_defs.h | 15 ++++++
drivers/net/ena/ena_ethdev.c | 46 +++++++++++++++++++
drivers/net/ena/ena_ethdev.h | 2 +
7 files changed, 118 insertions(+)
diff --git a/doc/guides/nics/ena.rst b/doc/guides/nics/ena.rst
index a34575dc9b..a42deccd81 100644
--- a/doc/guides/nics/ena.rst
+++ b/doc/guides/nics/ena.rst
@@ -141,6 +141,15 @@ Runtime Configuration
**A non-zero value for this devarg is mandatory for control path functionality
when binding ports to uio_pci_generic kernel module which lacks interrupt support.**
+ * **enable_frag_bypass** (default 0)
+
+ Enable fragment bypass mode for egress packets. This mode bypasses the PPS
+ limit enforced by EC2 for fragmented egress packets on every ENI. Note that
+ enabling it might negatively impact network performance.
+
+ 0 - Disabled (Default).
+
+ 1 - Enabled.
ENA Configuration Parameters
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index 467536fe05..07b5feabc4 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -55,6 +55,11 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated Amazon ENA (Elastic Network Adapter) net driver.**
+
+ * Added support for enabling fragment bypass mode for egress packets.
+ This mode bypasses the PPS limit enforced by EC2 for fragmented egress packets on every ENI.
+
* **Added Mucse rnp net driver.**
Added a new network PMD which supports Mucse 10 Gigabit Ethernet NICs.
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index 588dc61387..9715a627c1 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -3459,3 +3459,36 @@ int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
return 0;
}
+int ena_com_set_frag_bypass(struct ena_com_dev *ena_dev, bool enable)
+{
+ struct ena_admin_set_feat_resp set_feat_resp;
+ struct ena_com_admin_queue *admin_queue;
+ struct ena_admin_set_feat_cmd cmd;
+ int ret;
+
+ if (!ena_com_check_supported_feature_id(ena_dev, ENA_ADMIN_FRAG_BYPASS)) {
+ ena_trc_dbg(ena_dev, "Feature %d isn't supported\n",
+ ENA_ADMIN_FRAG_BYPASS);
+ return ENA_COM_UNSUPPORTED;
+ }
+
+ memset(&cmd, 0x0, sizeof(cmd));
+ admin_queue = &ena_dev->admin_queue;
+
+ cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE;
+ cmd.aq_common_descriptor.flags = 0;
+ cmd.feat_common.feature_id = ENA_ADMIN_FRAG_BYPASS;
+ cmd.feat_common.feature_version = ENA_ADMIN_FRAG_BYPASS_FEATURE_VERSION_0;
+ cmd.u.frag_bypass.enable = (u8)enable;
+
+ ret = ena_com_execute_admin_command(admin_queue,
+ (struct ena_admin_aq_entry *)&cmd,
+ sizeof(cmd),
+ (struct ena_admin_acq_entry *)&set_feat_resp,
+ sizeof(set_feat_resp));
+
+ if (unlikely(ret))
+ ena_trc_err(ena_dev, "Failed to enable frag bypass. error: %d\n", ret);
+
+ return ret;
+}
diff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h
index b2aede1be1..f064095fd1 100644
--- a/drivers/net/ena/base/ena_com.h
+++ b/drivers/net/ena/base/ena_com.h
@@ -1109,6 +1109,14 @@ static inline bool ena_com_get_missing_admin_interrupt(struct ena_com_dev *ena_d
return ena_dev->admin_queue.is_missing_admin_interrupt;
}
+/* ena_com_set_frag_bypass - set fragment bypass
+ * @ena_dev: ENA communication layer struct
+ * @enable: true if fragment bypass is enabled, false otherwise.
+ *
+ * @return - 0 on success, negative value on failure.
+ */
+int ena_com_set_frag_bypass(struct ena_com_dev *ena_dev, bool enable);
+
/* ena_com_io_sq_to_ena_dev - Extract ena_com_dev using contained field io_sq.
* @io_sq: IO submit queue struct
*
diff --git a/drivers/net/ena/base/ena_defs/ena_admin_defs.h b/drivers/net/ena/base/ena_defs/ena_admin_defs.h
index bdc6efadcf..d315014776 100644
--- a/drivers/net/ena/base/ena_defs/ena_admin_defs.h
+++ b/drivers/net/ena/base/ena_defs/ena_admin_defs.h
@@ -57,6 +57,7 @@ enum ena_admin_aq_feature_id {
ENA_ADMIN_EXTRA_PROPERTIES_STRINGS = 5,
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS = 6,
ENA_ADMIN_MAX_QUEUES_EXT = 7,
+ ENA_ADMIN_FRAG_BYPASS = 8,
ENA_ADMIN_RSS_HASH_FUNCTION = 10,
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG = 11,
ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG = 12,
@@ -165,6 +166,11 @@ enum ena_admin_ena_srd_flags {
ENA_ADMIN_ENA_SRD_UDP_ORDERING_BYPASS_ENABLED = BIT(2),
};
+enum ena_admin_frag_bypass_feature_version {
+ /* Enable only */
+ ENA_ADMIN_FRAG_BYPASS_FEATURE_VERSION_0 = 0,
+};
+
struct ena_admin_aq_common_desc {
/* 11:0 : command_id
* 15:12 : reserved12
@@ -706,6 +712,13 @@ struct ena_admin_feature_llq_desc {
struct ena_admin_accel_mode_req accel_mode;
};
+struct ena_admin_feature_frag_bypass_desc {
+ /* Enable frag_bypass */
+ uint8_t enable;
+
+ uint8_t reserved[3];
+};
+
struct ena_admin_queue_ext_feature_fields {
uint32_t max_tx_sq_num;
@@ -1180,6 +1193,8 @@ struct ena_admin_set_feat_cmd {
/* PHC configuration */
struct ena_admin_feature_phc_desc phc;
+ /* Fragment bypass configuration */
+ struct ena_admin_feature_frag_bypass_desc frag_bypass;
} u;
};
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index d8ff6851d2..4caad9006e 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -106,6 +106,12 @@ struct ena_stats {
* driver.
*/
#define ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "control_path_poll_interval"
+/*
+ * Toggles fragment bypass mode. Fragmented egress packets are rate limited by
+ * EC2 per ENI; this devarg bypasses the PPS limit but may impact performance.
+ * Disabled by default.
+ */
+#define ENA_DEVARG_ENABLE_FRAG_BYPASS "enable_frag_bypass"
/*
* Each rte_memzone should have unique name.
@@ -306,6 +312,9 @@ static int ena_xstats_get_by_id(struct rte_eth_dev *dev,
static int ena_process_llq_policy_devarg(const char *key,
const char *value,
void *opaque);
+static int ena_process_bool_devarg(const char *key,
+ const char *value,
+ void *opaque);
static int ena_parse_devargs(struct ena_adapter *adapter,
struct rte_devargs *devargs);
static void ena_copy_customer_metrics(struct ena_adapter *adapter,
@@ -1336,6 +1345,12 @@ static int ena_start(struct rte_eth_dev *dev)
if (rc)
goto err_start_tx;
+ if (adapter->enable_frag_bypass) {
+ rc = ena_com_set_frag_bypass(&adapter->ena_dev, true);
+ if (rc)
+ PMD_DRV_LOG_LINE(WARNING, "Failed to enable frag bypass, rc: %d", rc);
+ }
+
if (adapter->edev_data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) {
rc = ena_rss_configure(adapter);
if (rc)
@@ -3764,6 +3779,31 @@ static int ena_process_llq_policy_devarg(const char *key, const char *value, voi
PMD_INIT_LOG_LINE(INFO,
"LLQ policy is %u [0 - disabled, 1 - device recommended, 2 - normal, 3 - large]",
adapter->llq_header_policy);
+
+ return 0;
+}
+
+static int ena_process_bool_devarg(const char *key, const char *value, void *opaque)
+{
+ struct ena_adapter *adapter = opaque;
+ bool bool_value;
+
+ /* Parse the value. */
+ if (strcmp(value, "1") == 0) {
+ bool_value = true;
+ } else if (strcmp(value, "0") == 0) {
+ bool_value = false;
+ } else {
+ PMD_INIT_LOG_LINE(ERR,
+ "Invalid value: '%s' for key '%s'. Accepted: '0' or '1'",
+ value, key);
+ return -EINVAL;
+ }
+
+ /* Now, assign it to the proper adapter field. */
+ if (strcmp(key, ENA_DEVARG_ENABLE_FRAG_BYPASS) == 0)
+ adapter->enable_frag_bypass = bool_value;
+
return 0;
}
@@ -3773,6 +3813,7 @@ static int ena_parse_devargs(struct ena_adapter *adapter, struct rte_devargs *de
ENA_DEVARG_LLQ_POLICY,
ENA_DEVARG_MISS_TXC_TO,
ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL,
+ ENA_DEVARG_ENABLE_FRAG_BYPASS,
NULL,
};
struct rte_kvargs *kvlist;
@@ -3799,6 +3840,10 @@ static int ena_parse_devargs(struct ena_adapter *adapter, struct rte_devargs *de
ena_process_uint_devarg, adapter);
if (rc != 0)
goto exit;
+ rc = rte_kvargs_process(kvlist, ENA_DEVARG_ENABLE_FRAG_BYPASS,
+ ena_process_bool_devarg, adapter);
+ if (rc != 0)
+ goto exit;
exit:
rte_kvargs_free(kvlist);
@@ -4021,6 +4066,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_ena,
ENA_DEVARG_LLQ_POLICY "=<0|1|2|3> "
ENA_DEVARG_MISS_TXC_TO "=<uint>"
ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "=<0-1000>");
+ ENA_DEVARG_ENABLE_FRAG_BYPASS "=<0|1> ");
RTE_LOG_REGISTER_SUFFIX(ena_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(ena_logtype_driver, driver, NOTICE);
#ifdef RTE_ETHDEV_DEBUG_RX
diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h
index 335028ad19..f4461733e9 100644
--- a/drivers/net/ena/ena_ethdev.h
+++ b/drivers/net/ena/ena_ethdev.h
@@ -348,6 +348,8 @@ struct ena_adapter {
/* Time (in microseconds) of the control path queues monitoring interval */
uint64_t control_path_poll_interval;
+ bool enable_frag_bypass;
+
/*
* Helper variables for holding the information about the supported
* metrics.
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure
2025-05-22 13:08 [PATCH v2 4/7] net/ena: support fragment bypass mode Shai Brandes
@ 2025-05-22 13:08 ` Shai Brandes
2025-05-22 13:08 ` [PATCH v2 6/7] net/ena: fix aenq timeout with low poll interval Shai Brandes
2025-05-22 13:08 ` [PATCH v2 7/7] net/ena: upgrade driver version to 2.13.0 Shai Brandes
2 siblings, 0 replies; 5+ messages in thread
From: Shai Brandes @ 2025-05-22 13:08 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes, stable
Fixed the device initialization routine to correctly handle
failure during the registration or enabling of interrupts
when operating in control path interrupt mode.
Fixes: ca1dfa85f0d3 ("net/ena: add control path pure polling mode")
Cc: stable@dpdk.org
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
Reviewed-by: Yosef Raisman <yraisman@amazon.com>
---
doc/guides/rel_notes/release_25_07.rst | 2 ++
drivers/net/ena/ena_ethdev.c | 20 ++++++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index 07b5feabc4..e7fecace4f 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -59,6 +59,8 @@ New Features
* Added support for enabling fragment bypass mode for egress packets.
This mode bypasses the PPS limit enforced by EC2 for fragmented egress packets on every ENI.
+ * Fixed the device initialization routine to correctly handle failure during the registration
+ or enabling of interrupts when operating in control path interrupt mode.
* **Added Mucse rnp net driver.**
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index 4caad9006e..f26f08ca85 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -2465,8 +2465,16 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
if (!adapter->control_path_poll_interval) {
/* Control path interrupt mode */
- rte_intr_callback_register(intr_handle, ena_control_path_handler, eth_dev);
- rte_intr_enable(intr_handle);
+ rc = rte_intr_callback_register(intr_handle, ena_control_path_handler, eth_dev);
+ if (unlikely(rc < 0)) {
+ PMD_DRV_LOG_LINE(ERR, "Failed to register control path interrupt");
+ goto err_stats_destroy;
+ }
+ rc = rte_intr_enable(intr_handle);
+ if (unlikely(rc < 0)) {
+ PMD_DRV_LOG_LINE(ERR, "Failed to enable control path interrupt");
+ goto err_control_path_destroy;
+ }
ena_com_set_admin_polling_mode(ena_dev, false);
} else {
/* Control path polling mode */
@@ -2485,6 +2493,14 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
return 0;
err_control_path_destroy:
+ if (!adapter->control_path_poll_interval) {
+ rc = rte_intr_callback_unregister_sync(intr_handle,
+ ena_control_path_handler,
+ eth_dev);
+ if (unlikely(rc < 0))
+ PMD_INIT_LOG_LINE(ERR, "Failed to unregister interrupt handler");
+ }
+err_stats_destroy:
rte_free(adapter->drv_stats);
err_indirect_table_destroy:
ena_indirect_table_release(adapter);
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 6/7] net/ena: fix aenq timeout with low poll interval
2025-05-22 13:08 [PATCH v2 4/7] net/ena: support fragment bypass mode Shai Brandes
2025-05-22 13:08 ` [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure Shai Brandes
@ 2025-05-22 13:08 ` Shai Brandes
2025-05-22 13:08 ` [PATCH v2 7/7] net/ena: upgrade driver version to 2.13.0 Shai Brandes
2 siblings, 0 replies; 5+ messages in thread
From: Shai Brandes @ 2025-05-22 13:08 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes, stable
The driver can work in polling-based functionality of the admin
queue, eliminating the need for interrupts in the control-path.
This mode is mandatory when using the uio_pci_generic driver,
which lacks interrupt support.
The control_path_poll_interval devarg is being set within the range
[1..1000]. A value of 0 disables the polling mechanism.
This value defines the interval in milliseconds at which the driver
checks for asynchronous notifications from the device.
Testing revealed that setting this interval below 500 milliseconds
might lead to false detection of device unresponsiveness.
This patch clamps the user-defined value to the updated valid range
[500..1000] that ensures reliable aenq monitoring.
Fixes: ca1dfa85f0d3 ("net/ena: add control path pure polling mode")
Cc: stable@dpdk.org
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
Reviewed-by: Yosef Raisman <yraisman@amazon.com>
---
doc/guides/nics/ena.rst | 4 +++-
doc/guides/rel_notes/release_25_07.rst | 2 ++
drivers/net/ena/ena_ethdev.c | 24 ++++++++++--------------
drivers/net/ena/ena_ethdev.h | 3 ++-
4 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/doc/guides/nics/ena.rst b/doc/guides/nics/ena.rst
index a42deccd81..decb6be766 100644
--- a/doc/guides/nics/ena.rst
+++ b/doc/guides/nics/ena.rst
@@ -136,7 +136,9 @@ Runtime Configuration
0 - Disable (Admin queue will work in interrupt mode).
- [1..1000] - Number of milliseconds to wait between periodic inspection of the admin queues.
+ [500..1000] – Time in milliseconds to wait between periodic checks of the admin queues.
+ If a value outside this range is specified, the driver will automatically adjust it to
+ fit within the valid range.
**A non-zero value for this devarg is mandatory for control path functionality
when binding ports to uio_pci_generic kernel module which lacks interrupt support.**
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index e7fecace4f..662b0db49e 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -61,6 +61,8 @@ New Features
This mode bypasses the PPS limit enforced by EC2 for fragmented egress packets on every ENI.
* Fixed the device initialization routine to correctly handle failure during the registration
or enabling of interrupts when operating in control path interrupt mode.
+ * Fixed an issue where the device might be incorrectly reported as unresponsive when using
+ polling-based admin queue functionality with a poll interval of less than 500 milliseconds.
* **Added Mucse rnp net driver.**
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index f26f08ca85..182e063bf4 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -30,6 +30,8 @@
#define GET_L4_HDR_LEN(mbuf) \
((rte_pktmbuf_mtod_offset(mbuf, struct rte_tcp_hdr *, \
mbuf->l3_len + mbuf->l2_len)->data_off) >> 4)
+#define CLAMP_VAL(val, min, max) \
+ (RTE_MIN(RTE_MAX((val), (typeof(val))(min)), (typeof(val))(max)))
#define ETH_GSTRING_LEN 32
@@ -3756,25 +3758,19 @@ static int ena_process_uint_devarg(const char *key,
uint64_value * rte_get_timer_hz();
}
} else if (strcmp(key, ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL) == 0) {
- if (uint64_value > ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC) {
- PMD_INIT_LOG_LINE(ERR,
- "Control path polling interval is too long: %" PRIu64 " msecs. "
- "Maximum allowed: %d msecs.",
- uint64_value, ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC);
- return -EINVAL;
- } else if (uint64_value == 0) {
+ if (uint64_value == 0) {
PMD_INIT_LOG_LINE(INFO,
- "Control path polling interval is set to zero. Operating in "
- "interrupt mode.");
- adapter->control_path_poll_interval = 0;
+ "Control path polling is disabled - Operating in interrupt mode");
} else {
+ uint64_value = CLAMP_VAL(uint64_value,
+ ENA_MIN_CONTROL_PATH_POLL_INTERVAL_MSEC,
+ ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC);
PMD_INIT_LOG_LINE(INFO,
- "Control path polling interval is set to %" PRIu64 " msecs.",
+ "Control path polling interval is %" PRIu64 " msec",
uint64_value);
- adapter->control_path_poll_interval = uint64_value * USEC_PER_MSEC;
}
+ adapter->control_path_poll_interval = uint64_value * (USEC_PER_MSEC);
}
-
return 0;
}
@@ -4081,7 +4077,7 @@ RTE_PMD_REGISTER_KMOD_DEP(net_ena, "* igb_uio | uio_pci_generic | vfio-pci");
RTE_PMD_REGISTER_PARAM_STRING(net_ena,
ENA_DEVARG_LLQ_POLICY "=<0|1|2|3> "
ENA_DEVARG_MISS_TXC_TO "=<uint>"
- ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "=<0-1000>");
+ ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "= 0|<500-1000>"
ENA_DEVARG_ENABLE_FRAG_BYPASS "=<0|1> ");
RTE_LOG_REGISTER_SUFFIX(ena_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(ena_logtype_driver, driver, NOTICE);
diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h
index f4461733e9..e5d23e2e27 100644
--- a/drivers/net/ena/ena_ethdev.h
+++ b/drivers/net/ena/ena_ethdev.h
@@ -42,7 +42,8 @@
#define ENA_MONITORED_TX_QUEUES 3
#define ENA_DEFAULT_MISSING_COMP 256U
-#define ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC 1000
+#define ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC 1000U
+#define ENA_MIN_CONTROL_PATH_POLL_INTERVAL_MSEC 500U
/* While processing submitted and completed descriptors (rx and tx path
* respectively) in a loop it is desired to:
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 7/7] net/ena: upgrade driver version to 2.13.0
2025-05-22 13:08 [PATCH v2 4/7] net/ena: support fragment bypass mode Shai Brandes
2025-05-22 13:08 ` [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure Shai Brandes
2025-05-22 13:08 ` [PATCH v2 6/7] net/ena: fix aenq timeout with low poll interval Shai Brandes
@ 2025-05-22 13:08 ` Shai Brandes
2 siblings, 0 replies; 5+ messages in thread
From: Shai Brandes @ 2025-05-22 13:08 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes
Upgraded the driver version to 2.13.0.
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
Reviewed-by: Yosef Raisman <yraisman@amazon.com>
---
drivers/net/ena/ena_ethdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index 182e063bf4..55b8d35285 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -22,7 +22,7 @@
#include <ena_eth_io_defs.h>
#define DRV_MODULE_VER_MAJOR 2
-#define DRV_MODULE_VER_MINOR 12
+#define DRV_MODULE_VER_MINOR 13
#define DRV_MODULE_VER_SUBMINOR 0
#define __MERGE_64B_H_L(h, l) (((uint64_t)h << 32) | l)
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 4/7] net/ena: support fragment bypass mode
2025-05-22 13:06 [PATCH v2 0/7] net/ena: release 2.13.0 Shai Brandes
@ 2025-05-22 13:06 ` Shai Brandes
0 siblings, 0 replies; 5+ messages in thread
From: Shai Brandes @ 2025-05-22 13:06 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes, Yosef Raisman
Introduce devarg `enable_frag_bypass` to toggle the fragment bypass
mode for egress packets.
When enabled, this feature bypasses the PPS limit enforced by EC2 for
fragmented egress packets on every ENI. Note that enabling this might
negatively impact network performance.
By default, this feature is disabled. To enable it set
`enable_frag_bypass=1`. If it cannot be enabled, a warning will be
printed, but driver initialization will proceed as normal.
Signed-off-by: Yosef Raisman <yraisman@amazon.com>
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
---
doc/guides/nics/ena.rst | 9 ++++
doc/guides/rel_notes/release_25_07.rst | 5 ++
drivers/net/ena/base/ena_com.c | 33 +++++++++++++
drivers/net/ena/base/ena_com.h | 8 ++++
.../net/ena/base/ena_defs/ena_admin_defs.h | 15 ++++++
drivers/net/ena/ena_ethdev.c | 46 +++++++++++++++++++
drivers/net/ena/ena_ethdev.h | 2 +
7 files changed, 118 insertions(+)
diff --git a/doc/guides/nics/ena.rst b/doc/guides/nics/ena.rst
index a34575dc9b..a42deccd81 100644
--- a/doc/guides/nics/ena.rst
+++ b/doc/guides/nics/ena.rst
@@ -141,6 +141,15 @@ Runtime Configuration
**A non-zero value for this devarg is mandatory for control path functionality
when binding ports to uio_pci_generic kernel module which lacks interrupt support.**
+ * **enable_frag_bypass** (default 0)
+
+ Enable fragment bypass mode for egress packets. This mode bypasses the PPS
+ limit enforced by EC2 for fragmented egress packets on every ENI. Note that
+ enabling it might negatively impact network performance.
+
+ 0 - Disabled (Default).
+
+ 1 - Enabled.
ENA Configuration Parameters
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index 467536fe05..07b5feabc4 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -55,6 +55,11 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated Amazon ENA (Elastic Network Adapter) net driver.**
+
+ * Added support for enabling fragment bypass mode for egress packets.
+ This mode bypasses the PPS limit enforced by EC2 for fragmented egress packets on every ENI.
+
* **Added Mucse rnp net driver.**
Added a new network PMD which supports Mucse 10 Gigabit Ethernet NICs.
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index 588dc61387..9715a627c1 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -3459,3 +3459,36 @@ int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
return 0;
}
+int ena_com_set_frag_bypass(struct ena_com_dev *ena_dev, bool enable)
+{
+ struct ena_admin_set_feat_resp set_feat_resp;
+ struct ena_com_admin_queue *admin_queue;
+ struct ena_admin_set_feat_cmd cmd;
+ int ret;
+
+ if (!ena_com_check_supported_feature_id(ena_dev, ENA_ADMIN_FRAG_BYPASS)) {
+ ena_trc_dbg(ena_dev, "Feature %d isn't supported\n",
+ ENA_ADMIN_FRAG_BYPASS);
+ return ENA_COM_UNSUPPORTED;
+ }
+
+ memset(&cmd, 0x0, sizeof(cmd));
+ admin_queue = &ena_dev->admin_queue;
+
+ cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE;
+ cmd.aq_common_descriptor.flags = 0;
+ cmd.feat_common.feature_id = ENA_ADMIN_FRAG_BYPASS;
+ cmd.feat_common.feature_version = ENA_ADMIN_FRAG_BYPASS_FEATURE_VERSION_0;
+ cmd.u.frag_bypass.enable = (u8)enable;
+
+ ret = ena_com_execute_admin_command(admin_queue,
+ (struct ena_admin_aq_entry *)&cmd,
+ sizeof(cmd),
+ (struct ena_admin_acq_entry *)&set_feat_resp,
+ sizeof(set_feat_resp));
+
+ if (unlikely(ret))
+ ena_trc_err(ena_dev, "Failed to enable frag bypass. error: %d\n", ret);
+
+ return ret;
+}
diff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h
index b2aede1be1..f064095fd1 100644
--- a/drivers/net/ena/base/ena_com.h
+++ b/drivers/net/ena/base/ena_com.h
@@ -1109,6 +1109,14 @@ static inline bool ena_com_get_missing_admin_interrupt(struct ena_com_dev *ena_d
return ena_dev->admin_queue.is_missing_admin_interrupt;
}
+/* ena_com_set_frag_bypass - set fragment bypass
+ * @ena_dev: ENA communication layer struct
+ * @enable: true if fragment bypass is enabled, false otherwise.
+ *
+ * @return - 0 on success, negative value on failure.
+ */
+int ena_com_set_frag_bypass(struct ena_com_dev *ena_dev, bool enable);
+
/* ena_com_io_sq_to_ena_dev - Extract ena_com_dev using contained field io_sq.
* @io_sq: IO submit queue struct
*
diff --git a/drivers/net/ena/base/ena_defs/ena_admin_defs.h b/drivers/net/ena/base/ena_defs/ena_admin_defs.h
index bdc6efadcf..d315014776 100644
--- a/drivers/net/ena/base/ena_defs/ena_admin_defs.h
+++ b/drivers/net/ena/base/ena_defs/ena_admin_defs.h
@@ -57,6 +57,7 @@ enum ena_admin_aq_feature_id {
ENA_ADMIN_EXTRA_PROPERTIES_STRINGS = 5,
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS = 6,
ENA_ADMIN_MAX_QUEUES_EXT = 7,
+ ENA_ADMIN_FRAG_BYPASS = 8,
ENA_ADMIN_RSS_HASH_FUNCTION = 10,
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG = 11,
ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG = 12,
@@ -165,6 +166,11 @@ enum ena_admin_ena_srd_flags {
ENA_ADMIN_ENA_SRD_UDP_ORDERING_BYPASS_ENABLED = BIT(2),
};
+enum ena_admin_frag_bypass_feature_version {
+ /* Enable only */
+ ENA_ADMIN_FRAG_BYPASS_FEATURE_VERSION_0 = 0,
+};
+
struct ena_admin_aq_common_desc {
/* 11:0 : command_id
* 15:12 : reserved12
@@ -706,6 +712,13 @@ struct ena_admin_feature_llq_desc {
struct ena_admin_accel_mode_req accel_mode;
};
+struct ena_admin_feature_frag_bypass_desc {
+ /* Enable frag_bypass */
+ uint8_t enable;
+
+ uint8_t reserved[3];
+};
+
struct ena_admin_queue_ext_feature_fields {
uint32_t max_tx_sq_num;
@@ -1180,6 +1193,8 @@ struct ena_admin_set_feat_cmd {
/* PHC configuration */
struct ena_admin_feature_phc_desc phc;
+ /* Fragment bypass configuration */
+ struct ena_admin_feature_frag_bypass_desc frag_bypass;
} u;
};
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index d8ff6851d2..4caad9006e 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -106,6 +106,12 @@ struct ena_stats {
* driver.
*/
#define ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "control_path_poll_interval"
+/*
+ * Toggles fragment bypass mode. Fragmented egress packets are rate limited by
+ * EC2 per ENI; this devarg bypasses the PPS limit but may impact performance.
+ * Disabled by default.
+ */
+#define ENA_DEVARG_ENABLE_FRAG_BYPASS "enable_frag_bypass"
/*
* Each rte_memzone should have unique name.
@@ -306,6 +312,9 @@ static int ena_xstats_get_by_id(struct rte_eth_dev *dev,
static int ena_process_llq_policy_devarg(const char *key,
const char *value,
void *opaque);
+static int ena_process_bool_devarg(const char *key,
+ const char *value,
+ void *opaque);
static int ena_parse_devargs(struct ena_adapter *adapter,
struct rte_devargs *devargs);
static void ena_copy_customer_metrics(struct ena_adapter *adapter,
@@ -1336,6 +1345,12 @@ static int ena_start(struct rte_eth_dev *dev)
if (rc)
goto err_start_tx;
+ if (adapter->enable_frag_bypass) {
+ rc = ena_com_set_frag_bypass(&adapter->ena_dev, true);
+ if (rc)
+ PMD_DRV_LOG_LINE(WARNING, "Failed to enable frag bypass, rc: %d", rc);
+ }
+
if (adapter->edev_data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) {
rc = ena_rss_configure(adapter);
if (rc)
@@ -3764,6 +3779,31 @@ static int ena_process_llq_policy_devarg(const char *key, const char *value, voi
PMD_INIT_LOG_LINE(INFO,
"LLQ policy is %u [0 - disabled, 1 - device recommended, 2 - normal, 3 - large]",
adapter->llq_header_policy);
+
+ return 0;
+}
+
+static int ena_process_bool_devarg(const char *key, const char *value, void *opaque)
+{
+ struct ena_adapter *adapter = opaque;
+ bool bool_value;
+
+ /* Parse the value. */
+ if (strcmp(value, "1") == 0) {
+ bool_value = true;
+ } else if (strcmp(value, "0") == 0) {
+ bool_value = false;
+ } else {
+ PMD_INIT_LOG_LINE(ERR,
+ "Invalid value: '%s' for key '%s'. Accepted: '0' or '1'",
+ value, key);
+ return -EINVAL;
+ }
+
+ /* Now, assign it to the proper adapter field. */
+ if (strcmp(key, ENA_DEVARG_ENABLE_FRAG_BYPASS) == 0)
+ adapter->enable_frag_bypass = bool_value;
+
return 0;
}
@@ -3773,6 +3813,7 @@ static int ena_parse_devargs(struct ena_adapter *adapter, struct rte_devargs *de
ENA_DEVARG_LLQ_POLICY,
ENA_DEVARG_MISS_TXC_TO,
ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL,
+ ENA_DEVARG_ENABLE_FRAG_BYPASS,
NULL,
};
struct rte_kvargs *kvlist;
@@ -3799,6 +3840,10 @@ static int ena_parse_devargs(struct ena_adapter *adapter, struct rte_devargs *de
ena_process_uint_devarg, adapter);
if (rc != 0)
goto exit;
+ rc = rte_kvargs_process(kvlist, ENA_DEVARG_ENABLE_FRAG_BYPASS,
+ ena_process_bool_devarg, adapter);
+ if (rc != 0)
+ goto exit;
exit:
rte_kvargs_free(kvlist);
@@ -4021,6 +4066,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_ena,
ENA_DEVARG_LLQ_POLICY "=<0|1|2|3> "
ENA_DEVARG_MISS_TXC_TO "=<uint>"
ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "=<0-1000>");
+ ENA_DEVARG_ENABLE_FRAG_BYPASS "=<0|1> ");
RTE_LOG_REGISTER_SUFFIX(ena_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(ena_logtype_driver, driver, NOTICE);
#ifdef RTE_ETHDEV_DEBUG_RX
diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h
index 335028ad19..f4461733e9 100644
--- a/drivers/net/ena/ena_ethdev.h
+++ b/drivers/net/ena/ena_ethdev.h
@@ -348,6 +348,8 @@ struct ena_adapter {
/* Time (in microseconds) of the control path queues monitoring interval */
uint64_t control_path_poll_interval;
+ bool enable_frag_bypass;
+
/*
* Helper variables for holding the information about the supported
* metrics.
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-05-22 13:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-22 13:08 [PATCH v2 4/7] net/ena: support fragment bypass mode Shai Brandes
2025-05-22 13:08 ` [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure Shai Brandes
2025-05-22 13:08 ` [PATCH v2 6/7] net/ena: fix aenq timeout with low poll interval Shai Brandes
2025-05-22 13:08 ` [PATCH v2 7/7] net/ena: upgrade driver version to 2.13.0 Shai Brandes
-- strict thread matches above, loose matches on Subject: below --
2025-05-22 13:06 [PATCH v2 0/7] net/ena: release 2.13.0 Shai Brandes
2025-05-22 13:06 ` [PATCH v2 4/7] net/ena: support fragment bypass mode Shai Brandes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).