* [PATCH 1/4] net/ena/base: upgrade ena-com to the latest version
2025-02-24 11:40 [PATCH 0/4] net/ena: release 2.12.0 shaibran
@ 2025-02-24 11:40 ` shaibran
2025-02-24 15:35 ` Stephen Hemminger
2025-02-24 11:40 ` [PATCH 2/4] net/ena: add support for mutable RSS table size shaibran
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: shaibran @ 2025-02-24 11:40 UTC (permalink / raw)
To: ferruh.yigit; +Cc: dev, Shai Brandes
From: Shai Brandes <shaibran@amazon.com>
This update upgrades the ena-com module to the most recent version,
which includes various cosmetic changes and the removal of obsolete
routines.
Signed-off-by: Shai Brandes <shaibran@amazon.com>
---
drivers/net/ena/base/ena_com.c | 24 ++++++-------------
drivers/net/ena/base/ena_com.h | 2 --
.../net/ena/base/ena_defs/ena_eth_io_defs.h | 7 +++---
3 files changed, 11 insertions(+), 22 deletions(-)
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index 24bad19848..8018663e18 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -1799,7 +1799,9 @@ int ena_com_phc_config(struct ena_com_dev *ena_dev)
ENA_ADMIN_PHC_CONFIG,
ENA_ADMIN_PHC_FEATURE_VERSION_0);
if (unlikely(ret)) {
- ena_trc_err(ena_dev, "Failed to get PHC feature configuration, error: %d\n", ret);
+ ena_trc_err(ena_dev,
+ "Failed to get PHC feature configuration, error: %d\n",
+ ret);
return ret;
}
@@ -1833,7 +1835,9 @@ int ena_com_phc_config(struct ena_com_dev *ena_dev)
set_feat_cmd.aq_common_descriptor.opcode = ENA_ADMIN_SET_FEATURE;
set_feat_cmd.feat_common.feature_id = ENA_ADMIN_PHC_CONFIG;
set_feat_cmd.u.phc.output_length = sizeof(*phc->virt_addr);
- ret = ena_com_mem_addr_set(ena_dev, &set_feat_cmd.u.phc.output_address, phc->phys_addr);
+ ret = ena_com_mem_addr_set(ena_dev,
+ &set_feat_cmd.u.phc.output_address,
+ phc->phys_addr);
if (unlikely(ret)) {
ena_trc_err(ena_dev, "Failed setting PHC output address, error: %d\n", ret);
return ret;
@@ -2091,6 +2095,7 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev,
admin_queue->q_depth = ENA_ADMIN_QUEUE_DEPTH;
admin_queue->bus = ena_dev->bus;
+ admin_queue->ena_dev = ena_dev;
admin_queue->q_dmadev = ena_dev->dmadev;
admin_queue->polling = false;
admin_queue->curr_cmd_id = 0;
@@ -2148,7 +2153,6 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev,
if (unlikely(ret))
goto error;
- admin_queue->ena_dev = ena_dev;
admin_queue->running_state = true;
admin_queue->is_missing_admin_interrupt = false;
@@ -2728,23 +2732,9 @@ int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, u32 mtu)
return ret;
}
-int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
- struct ena_admin_feature_offload_desc *offload)
-{
- int ret;
- struct ena_admin_get_feat_resp resp;
- ret = ena_com_get_feature(ena_dev, &resp,
- ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
- if (unlikely(ret)) {
- ena_trc_err(ena_dev, "Failed to get offload capabilities %d\n", ret);
- return ret;
- }
- memcpy(offload, &resp.u.offload, sizeof(resp.u.offload));
- return 0;
-}
int ena_com_set_hash_function(struct ena_com_dev *ena_dev)
{
diff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h
index fbb0ea39ec..ce27e693c8 100644
--- a/drivers/net/ena/base/ena_com.h
+++ b/drivers/net/ena/base/ena_com.h
@@ -768,8 +768,6 @@ int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, u32 mtu);
*
* @return: 0 on Success and negative value otherwise.
*/
-int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
- struct ena_admin_feature_offload_desc *offload);
/* ena_com_rss_init - Init RSS
* @ena_dev: ENA communication layer struct
diff --git a/drivers/net/ena/base/ena_defs/ena_eth_io_defs.h b/drivers/net/ena/base/ena_defs/ena_eth_io_defs.h
index c93cd85632..4bbd1d0d9d 100644
--- a/drivers/net/ena/base/ena_defs/ena_eth_io_defs.h
+++ b/drivers/net/ena/base/ena_defs/ena_eth_io_defs.h
@@ -965,14 +965,15 @@ static inline void set_ena_eth_io_intr_reg_intr_unmask(struct ena_eth_io_intr_re
p->intr_control |= (val << ENA_ETH_IO_INTR_REG_INTR_UNMASK_SHIFT) & ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK;
}
-static inline uint32_t get_ena_eth_io_intr_reg_no_mod_update(const struct ena_eth_io_intr_reg *p)
+static inline
+uint32_t get_ena_eth_io_intr_reg_no_moderation_update(const struct ena_eth_io_intr_reg *p)
{
return (p->intr_control & ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_MASK) >>
ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_SHIFT;
}
-static inline void set_ena_eth_io_intr_reg_no_mod_update(struct ena_eth_io_intr_reg *p,
- uint32_t val)
+static inline
+void set_ena_eth_io_intr_reg_no_moderation_update(struct ena_eth_io_intr_reg *p, uint32_t val)
{
p->intr_control |= (val << ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_SHIFT) &
ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_MASK;
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/4] net/ena: add support for mutable RSS table size
2025-02-24 11:40 [PATCH 0/4] net/ena: release 2.12.0 shaibran
2025-02-24 11:40 ` [PATCH 1/4] net/ena/base: upgrade ena-com to the latest version shaibran
@ 2025-02-24 11:40 ` shaibran
2025-02-24 11:40 ` [PATCH 3/4] net/ena: remove deprecated notifications shaibran
2025-02-24 11:40 ` [PATCH 4/4] net/ena: upgrade driver version to 2.12.0 shaibran
3 siblings, 0 replies; 6+ messages in thread
From: shaibran @ 2025-02-24 11:40 UTC (permalink / raw)
To: ferruh.yigit; +Cc: dev, Shai Brandes, Yosef Raisman
From: Shai Brandes <shaibran@amazon.com>
This patch enables the configuration of a mutable RSS table size, allowing
it to adapt to the device's capabilities instead of relying on a fixed 128
hardcoded value.
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/rel_notes/release_25_03.rst | 4 ++
drivers/net/ena/base/ena_com.c | 60 ++++++++++---------
drivers/net/ena/base/ena_com.h | 3 +-
.../net/ena/base/ena_defs/ena_admin_defs.h | 3 +
drivers/net/ena/ena_ethdev.c | 31 ++++++++--
drivers/net/ena/ena_ethdev.h | 8 +--
| 48 ++++++++++++---
7 files changed, 111 insertions(+), 46 deletions(-)
diff --git a/doc/guides/rel_notes/release_25_03.rst b/doc/guides/rel_notes/release_25_03.rst
index 2b139fc35b..e7757e0d53 100644
--- a/doc/guides/rel_notes/release_25_03.rst
+++ b/doc/guides/rel_notes/release_25_03.rst
@@ -97,6 +97,10 @@ New Features
* Added ability to option to configure receive packet fanout mode.
* Added statistics for failed buffer allocation and missed packets.
+* **Updated Amazon ENA (Elastic Network Adapter) net driver.**
+
+ * Added support for mutable RSS table size based on device capabilities.
+
* **Updated AMD axgbe driver.**
* Added support for the TCP Segmentation Offload (TSO).
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index 8018663e18..238716de29 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -40,6 +40,7 @@
#define ENA_MAX_ADMIN_POLL_US 5000
+#define ENA_MAX_INDIR_TABLE_LOG_SIZE 16
/* PHC definitions */
#define ENA_PHC_DEFAULT_EXPIRE_TIMEOUT_USEC 10
#define ENA_PHC_DEFAULT_BLOCK_TIMEOUT_USEC 1000
@@ -1030,6 +1031,11 @@ static bool ena_com_check_supported_feature_id(struct ena_com_dev *ena_dev,
return true;
}
+bool ena_com_indirection_table_config_supported(struct ena_com_dev *ena_dev)
+{
+ return ena_com_check_supported_feature_id(ena_dev,
+ ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG);
+}
static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
struct ena_admin_get_feat_resp *get_resp,
enum ena_admin_aq_feature_id feature_id,
@@ -1175,55 +1181,55 @@ static void ena_com_hash_ctrl_destroy(struct ena_com_dev *ena_dev)
rss->hash_ctrl = NULL;
}
-static int ena_com_indirect_table_allocate(struct ena_com_dev *ena_dev,
- u16 log_size)
+static int ena_com_indirect_table_allocate(struct ena_com_dev *ena_dev)
{
- struct ena_rss *rss = &ena_dev->rss;
struct ena_admin_get_feat_resp get_resp;
- size_t tbl_size;
+ struct ena_rss *rss = &ena_dev->rss;
+ u16 requested_log_tbl_size;
+ int requested_tbl_size;
int ret;
ret = ena_com_get_feature(ena_dev, &get_resp,
- ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG, 0);
+ ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG,
+ ENA_ADMIN_RSS_FEATURE_VERSION_1);
+
if (unlikely(ret))
return ret;
- if ((get_resp.u.ind_table.min_size > log_size) ||
- (get_resp.u.ind_table.max_size < log_size)) {
- ena_trc_err(ena_dev, "Indirect table size doesn't fit. requested size: %d while min is:%d and max %d\n",
- 1 << log_size,
- 1 << get_resp.u.ind_table.min_size,
- 1 << get_resp.u.ind_table.max_size);
+ requested_log_tbl_size = get_resp.u.ind_table.max_size;
+
+ if (requested_log_tbl_size > ENA_MAX_INDIR_TABLE_LOG_SIZE) {
+ ena_trc_err(ena_dev, "Requested indirect table size too large. Requested log size: %u.\n",
+ requested_log_tbl_size);
return ENA_COM_INVAL;
}
- tbl_size = (1ULL << log_size) *
- sizeof(struct ena_admin_rss_ind_table_entry);
-
+ requested_tbl_size = (1ULL << requested_log_tbl_size) *
+ sizeof(struct ena_admin_rss_ind_table_entry);
ENA_MEM_ALLOC_COHERENT(ena_dev->dmadev,
- tbl_size,
- rss->rss_ind_tbl,
- rss->rss_ind_tbl_dma_addr,
- rss->rss_ind_tbl_mem_handle);
+ requested_tbl_size,
+ rss->rss_ind_tbl,
+ rss->rss_ind_tbl_dma_addr,
+ rss->rss_ind_tbl_mem_handle);
if (unlikely(!rss->rss_ind_tbl))
goto mem_err1;
- tbl_size = (1ULL << log_size) * sizeof(u16);
+ requested_tbl_size = (1ULL << requested_log_tbl_size) *
+ sizeof(u16);
rss->host_rss_ind_tbl =
- ENA_MEM_ALLOC(ena_dev->dmadev, tbl_size);
+ ENA_MEM_ALLOC(ena_dev->dmadev,
+ requested_tbl_size);
if (unlikely(!rss->host_rss_ind_tbl))
goto mem_err2;
- rss->tbl_log_size = log_size;
+ rss->tbl_log_size = requested_log_tbl_size;
return 0;
mem_err2:
- tbl_size = (1ULL << log_size) *
- sizeof(struct ena_admin_rss_ind_table_entry);
-
ENA_MEM_FREE_COHERENT(ena_dev->dmadev,
- tbl_size,
+ (1ULL << requested_log_tbl_size) *
+ sizeof(struct ena_admin_rss_ind_table_entry),
rss->rss_ind_tbl,
rss->rss_ind_tbl_dma_addr,
rss->rss_ind_tbl_mem_handle);
@@ -3146,13 +3152,13 @@ int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl)
return 0;
}
-int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 indr_tbl_log_size)
+int ena_com_rss_init(struct ena_com_dev *ena_dev)
{
int rc;
memset(&ena_dev->rss, 0x0, sizeof(ena_dev->rss));
- rc = ena_com_indirect_table_allocate(ena_dev, indr_tbl_log_size);
+ rc = ena_com_indirect_table_allocate(ena_dev);
if (unlikely(rc))
goto err_indr_tbl;
diff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h
index ce27e693c8..b2aede1be1 100644
--- a/drivers/net/ena/base/ena_com.h
+++ b/drivers/net/ena/base/ena_com.h
@@ -779,7 +779,7 @@ int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, u32 mtu);
*
* @return: 0 on Success and negative value otherwise.
*/
-int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size);
+int ena_com_rss_init(struct ena_com_dev *ena_dev);
/* ena_com_rss_destroy - Destroy rss
* @ena_dev: ENA communication layer struct
@@ -1144,6 +1144,7 @@ static inline void ena_com_disable_adaptive_moderation(struct ena_com_dev *ena_d
ena_dev->adaptive_coalescing = false;
}
+bool ena_com_indirection_table_config_supported(struct ena_com_dev *ena_dev);
/* ena_com_get_cap - query whether device supports a capability.
* @ena_dev: ENA communication layer struct
* @cap_id: enum value representing the capability
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 8a1bb0bb76..bdc6efadcf 100644
--- a/drivers/net/ena/base/ena_defs/ena_admin_defs.h
+++ b/drivers/net/ena/base/ena_defs/ena_admin_defs.h
@@ -840,6 +840,9 @@ struct ena_admin_feature_offload_desc {
uint32_t rx_enabled;
};
+enum ena_admin_rss_feature_version {
+ ENA_ADMIN_RSS_FEATURE_VERSION_1 = 1,
+};
enum ena_admin_hash_functions {
ENA_ADMIN_TOEPLITZ = 1,
ENA_ADMIN_CRC32 = 2,
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index aea2e5c929..71a60b0eff 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -603,7 +603,7 @@ __extension__ ({
ENA_TOUCH(ena_dev);
if (ind_tbl != adapter->indirect_table)
rte_memcpy(ind_tbl, adapter->indirect_table,
- sizeof(adapter->indirect_table));
+ sizeof(u32) * adapter->indirect_table_size);
}),
struct ena_com_dev *ena_dev, u32 *ind_tbl);
@@ -889,6 +889,13 @@ static void ena_config_debug_area(struct ena_adapter *adapter)
ena_com_delete_debug_area(&adapter->ena_dev);
}
+static inline void ena_indirect_table_release(struct ena_adapter *adapter)
+{
+ if (likely(adapter->indirect_table)) {
+ rte_free(adapter->indirect_table);
+ adapter->indirect_table = NULL;
+ }
+}
static int ena_close(struct rte_eth_dev *dev)
{
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
@@ -920,6 +927,7 @@ static int ena_close(struct rte_eth_dev *dev)
ena_rx_queue_release_all(dev);
ena_tx_queue_release_all(dev);
+ ena_indirect_table_release(adapter);
rte_free(adapter->drv_stats);
adapter->drv_stats = NULL;
@@ -2278,6 +2286,7 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
int rc;
static int adapters_found;
bool disable_meta_caching;
+ size_t indirect_table_size;
eth_dev->dev_ops = &ena_dev_ops;
eth_dev->rx_pkt_burst = ð_ena_recv_pkts;
@@ -2413,12 +2422,24 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
get_feat_ctx.dev_attr.mac_addr,
(struct rte_ether_addr *)adapter->mac_addr);
- rc = ena_com_rss_init(ena_dev, ENA_RX_RSS_TABLE_LOG_SIZE);
+ rc = ena_com_rss_init(ena_dev);
if (unlikely(rc != 0)) {
PMD_DRV_LOG_LINE(ERR, "Failed to initialize RSS in ENA device");
goto err_delete_debug_area;
}
+ indirect_table_size = ena_rss_get_indirection_table_size(adapter);
+ if (indirect_table_size) {
+ adapter->indirect_table = rte_zmalloc("adapter RSS indirection table",
+ sizeof(u32) * indirect_table_size,
+ RTE_CACHE_LINE_SIZE);
+ if (!adapter->indirect_table) {
+ PMD_DRV_LOG_LINE(ERR,
+ "Failed to allocate memory for RSS indirection table");
+ rc = -ENOMEM;
+ goto err_rss_destroy;
+ }
+ }
adapter->drv_stats = rte_zmalloc("adapter stats",
sizeof(*adapter->drv_stats),
RTE_CACHE_LINE_SIZE);
@@ -2426,7 +2447,7 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
PMD_DRV_LOG_LINE(ERR,
"Failed to allocate memory for adapter statistics");
rc = -ENOMEM;
- goto err_rss_destroy;
+ goto err_indirect_table_destroy;
}
rte_spinlock_init(&adapter->admin_lock);
@@ -2454,6 +2475,8 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
return 0;
err_control_path_destroy:
rte_free(adapter->drv_stats);
+err_indirect_table_destroy:
+ ena_indirect_table_release(adapter);
err_rss_destroy:
ena_com_rss_destroy(ena_dev);
err_delete_debug_area:
@@ -2643,7 +2666,7 @@ static int ena_infos_get(struct rte_eth_dev *dev,
dev_info->max_rx_queues = adapter->max_num_io_queues;
dev_info->max_tx_queues = adapter->max_num_io_queues;
- dev_info->reta_size = ENA_RX_RSS_TABLE_SIZE;
+ dev_info->reta_size = adapter->indirect_table_size;
dev_info->rx_desc_lim.nb_max = adapter->max_rx_ring_size;
dev_info->rx_desc_lim.nb_min = ENA_MIN_RING_DESC;
diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h
index b8aead8f46..335028ad19 100644
--- a/drivers/net/ena/ena_ethdev.h
+++ b/drivers/net/ena/ena_ethdev.h
@@ -29,8 +29,6 @@
#define ENA_RX_BUF_MIN_SIZE 1400
#define ENA_DEFAULT_RING_SIZE 1024
-#define ENA_RX_RSS_TABLE_LOG_SIZE 7
-#define ENA_RX_RSS_TABLE_SIZE (1 << ENA_RX_RSS_TABLE_LOG_SIZE)
#define ENA_MIN_MTU 128
@@ -65,8 +63,6 @@
#define ENA_IDX_NEXT_MASKED(idx, mask) (((idx) + 1) & (mask))
#define ENA_IDX_ADD_MASKED(idx, n, mask) (((idx) + (n)) & (mask))
-#define ENA_RX_RSS_TABLE_LOG_SIZE 7
-#define ENA_RX_RSS_TABLE_SIZE (1 << ENA_RX_RSS_TABLE_LOG_SIZE)
#define ENA_HASH_KEY_SIZE 40
@@ -333,7 +329,8 @@ struct ena_adapter {
struct ena_stats_dev dev_stats;
struct ena_admin_basic_stats basic_stats;
- u32 indirect_table[ENA_RX_RSS_TABLE_SIZE];
+ u32 *indirect_table;
+ size_t indirect_table_size;
uint32_t all_aenq_groups;
uint32_t active_aenq_groups;
@@ -360,6 +357,7 @@ struct ena_adapter {
alignas(RTE_CACHE_LINE_SIZE) struct ena_stats_srd srd_stats;
};
+size_t ena_rss_get_indirection_table_size(struct ena_adapter *adapter);
int ena_mp_indirect_table_set(struct ena_adapter *adapter);
int ena_mp_indirect_table_get(struct ena_adapter *adapter,
uint32_t *indirect_table);
--git a/drivers/net/ena/ena_rss.c b/drivers/net/ena/ena_rss.c
index 85c6152f0c..45578189b9 100644
--- a/drivers/net/ena/ena_rss.c
+++ b/drivers/net/ena/ena_rss.c
@@ -45,6 +45,17 @@ static void ena_reorder_rss_hash_key(uint8_t *reordered_key,
size_t key_size);
static int ena_get_rss_hash_key(struct ena_com_dev *ena_dev, uint8_t *rss_key);
+size_t ena_rss_get_indirection_table_size(struct ena_adapter *adapter)
+{
+ struct ena_com_dev *ena_dev = &adapter->ena_dev;
+ if (!ena_com_indirection_table_config_supported(ena_dev)) {
+ PMD_DRV_LOG_LINE(WARNING,
+ "Indirection table is not supported by the device.");
+ return 0;
+ }
+ adapter->indirect_table_size = (1UL << ena_dev->rss.tbl_log_size);
+ return adapter->indirect_table_size;
+}
void ena_rss_key_fill(void *key, size_t size)
{
static bool key_generated;
@@ -71,6 +82,7 @@ int ena_rss_reta_update(struct rte_eth_dev *dev,
u16 entry_value;
int conf_idx;
int idx;
+ size_t tbl_size;
if (reta_size == 0 || reta_conf == NULL)
return -EINVAL;
@@ -81,10 +93,11 @@ int ena_rss_reta_update(struct rte_eth_dev *dev,
return -ENOTSUP;
}
- if (reta_size > ENA_RX_RSS_TABLE_SIZE) {
- PMD_DRV_LOG_LINE(WARNING,
- "Requested indirection table size (%d) is bigger than supported: %d",
- reta_size, ENA_RX_RSS_TABLE_SIZE);
+ tbl_size = ena_rss_get_indirection_table_size(adapter);
+ if (reta_size != tbl_size) {
+ PMD_DRV_LOG_LINE(ERR,
+ "Requested indirection table size (%" PRIu16 ") isn't supported (expected: %zu)",
+ reta_size, tbl_size);
return -EINVAL;
}
@@ -129,12 +142,12 @@ int ena_rss_reta_query(struct rte_eth_dev *dev,
struct rte_eth_rss_reta_entry64 *reta_conf,
uint16_t reta_size)
{
- uint32_t indirect_table[ENA_RX_RSS_TABLE_SIZE];
struct ena_adapter *adapter = dev->data->dev_private;
int rc;
int i;
int reta_conf_idx;
int reta_idx;
+ size_t tbl_size;
if (reta_size == 0 || reta_conf == NULL)
return -EINVAL;
@@ -145,10 +158,22 @@ int ena_rss_reta_query(struct rte_eth_dev *dev,
return -ENOTSUP;
}
+ tbl_size = ena_rss_get_indirection_table_size(adapter);
+ if (reta_size != tbl_size) {
+ PMD_DRV_LOG_LINE(ERR,
+ "Cannot get indirection table: size (%" PRIu16 ") mismatch (expected: %zu)",
+ reta_size, tbl_size);
+ return -EINVAL;
+ }
+ if (!adapter->indirect_table) {
+ PMD_DRV_LOG_LINE(ERR,
+ "Cannot get indirection table: local table not allocated");
+ return -EINVAL;
+ }
rte_spinlock_lock(&adapter->admin_lock);
- rc = ena_mp_indirect_table_get(adapter, indirect_table);
- rte_spinlock_unlock(&adapter->admin_lock);
+ rc = ena_mp_indirect_table_get(adapter, adapter->indirect_table);
if (unlikely(rc != 0)) {
+ rte_spinlock_unlock(&adapter->admin_lock);
PMD_DRV_LOG_LINE(ERR, "Cannot get indirection table");
return rc;
}
@@ -158,8 +183,9 @@ int ena_rss_reta_query(struct rte_eth_dev *dev,
reta_idx = i % RTE_ETH_RETA_GROUP_SIZE;
if (TEST_BIT(reta_conf[reta_conf_idx].mask, reta_idx))
reta_conf[reta_conf_idx].reta[reta_idx] =
- ENA_IO_RXQ_IDX_REV(indirect_table[i]);
+ ENA_IO_RXQ_IDX_REV(adapter->indirect_table[i]);
}
+ rte_spinlock_unlock(&adapter->admin_lock);
return 0;
}
@@ -475,6 +501,7 @@ int ena_rss_configure(struct ena_adapter *adapter)
struct rte_eth_rss_conf *rss_conf;
struct ena_com_dev *ena_dev;
int rc;
+ size_t tbl_size;
ena_dev = &adapter->ena_dev;
rss_conf = &adapter->edev_data->dev_conf.rx_adv_conf.rss_conf;
@@ -482,11 +509,14 @@ int ena_rss_configure(struct ena_adapter *adapter)
if (adapter->edev_data->nb_rx_queues == 0)
return 0;
+ tbl_size = ena_rss_get_indirection_table_size(adapter);
+ if (!tbl_size)
+ return 0;
/* Restart the indirection table. The number of queues could change
* between start/stop calls, so it must be reinitialized with default
* values.
*/
- rc = ena_fill_indirect_table_default(ena_dev, ENA_RX_RSS_TABLE_SIZE,
+ rc = ena_fill_indirect_table_default(ena_dev, tbl_size,
adapter->edev_data->nb_rx_queues);
if (unlikely(rc != 0)) {
PMD_DRV_LOG_LINE(ERR,
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 3/4] net/ena: remove deprecated notifications
2025-02-24 11:40 [PATCH 0/4] net/ena: release 2.12.0 shaibran
2025-02-24 11:40 ` [PATCH 1/4] net/ena/base: upgrade ena-com to the latest version shaibran
2025-02-24 11:40 ` [PATCH 2/4] net/ena: add support for mutable RSS table size shaibran
@ 2025-02-24 11:40 ` shaibran
2025-02-24 11:40 ` [PATCH 4/4] net/ena: upgrade driver version to 2.12.0 shaibran
3 siblings, 0 replies; 6+ messages in thread
From: shaibran @ 2025-02-24 11:40 UTC (permalink / raw)
To: ferruh.yigit; +Cc: dev, Shai Brandes, Wajeeh Atrash
From: Shai Brandes <shaibran@amazon.com>
Remove deprecated asynchronous event notifications that may arrive
from the device. The removal ensures that only supported event
handling mechanisms are in use.
Signed-off-by: Wajeeh Atrash <atrwajee@amazon.com>
Signed-off-by: Shai Brandes <shaibran@amazon.com>
---
drivers/net/ena/ena_ethdev.c | 51 ------------------------------------
1 file changed, 51 deletions(-)
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index 71a60b0eff..705b0b3a85 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -1924,10 +1924,7 @@ static int ena_device_init(struct ena_adapter *adapter,
}
aenq_groups = BIT(ENA_ADMIN_LINK_CHANGE) |
- BIT(ENA_ADMIN_NOTIFICATION) |
BIT(ENA_ADMIN_KEEP_ALIVE) |
- BIT(ENA_ADMIN_FATAL_ERROR) |
- BIT(ENA_ADMIN_WARNING) |
BIT(ENA_ADMIN_CONF_NOTIFICATIONS);
aenq_groups &= get_feat_ctx->aenq.supported_groups;
@@ -3050,29 +3047,6 @@ eth_ena_prep_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
return i;
}
-static void ena_update_hints(struct ena_adapter *adapter,
- struct ena_admin_ena_hw_hints *hints)
-{
- if (hints->admin_completion_tx_timeout)
- adapter->ena_dev.admin_queue.completion_timeout =
- hints->admin_completion_tx_timeout * 1000;
-
- if (hints->mmio_read_timeout)
- /* convert to usec */
- adapter->ena_dev.mmio_read.reg_read_to =
- hints->mmio_read_timeout * 1000;
-
- if (hints->driver_watchdog_timeout) {
- if (hints->driver_watchdog_timeout == ENA_HW_HINTS_NO_TIMEOUT)
- adapter->keep_alive_timeout = ENA_HW_HINTS_NO_TIMEOUT;
- else
- // Convert msecs to ticks
- adapter->keep_alive_timeout =
- (hints->driver_watchdog_timeout *
- rte_get_timer_hz()) / 1000;
- }
-}
-
static void ena_tx_map_mbuf(struct ena_ring *tx_ring,
struct ena_tx_buffer *tx_info,
struct rte_mbuf *mbuf,
@@ -4078,30 +4052,6 @@ static void ena_update_on_link_change(void *adapter_data,
rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC, NULL);
}
-static void ena_notification(void *adapter_data,
- struct ena_admin_aenq_entry *aenq_e)
-{
- struct rte_eth_dev *eth_dev = adapter_data;
- struct ena_adapter *adapter = eth_dev->data->dev_private;
- struct ena_admin_ena_hw_hints *hints;
-
- if (aenq_e->aenq_common_desc.group != ENA_ADMIN_NOTIFICATION)
- PMD_DRV_LOG_LINE(WARNING, "Invalid AENQ group: %x. Expected: %x",
- aenq_e->aenq_common_desc.group,
- ENA_ADMIN_NOTIFICATION);
-
- switch (aenq_e->aenq_common_desc.syndrome) {
- case ENA_ADMIN_UPDATE_HINTS:
- hints = (struct ena_admin_ena_hw_hints *)
- (&aenq_e->inline_data_w4);
- ena_update_hints(adapter, hints);
- break;
- default:
- PMD_DRV_LOG_LINE(ERR, "Invalid AENQ notification link state: %d",
- aenq_e->aenq_common_desc.syndrome);
- }
-}
-
static void ena_keep_alive(void *adapter_data,
__rte_unused struct ena_admin_aenq_entry *aenq_e)
{
@@ -4156,7 +4106,6 @@ static void unimplemented_aenq_handler(__rte_unused void *data,
static struct ena_aenq_handlers aenq_handlers = {
.handlers = {
[ENA_ADMIN_LINK_CHANGE] = ena_update_on_link_change,
- [ENA_ADMIN_NOTIFICATION] = ena_notification,
[ENA_ADMIN_KEEP_ALIVE] = ena_keep_alive,
[ENA_ADMIN_CONF_NOTIFICATIONS] = ena_suboptimal_configuration
},
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread