git: eb65bcbf6cb5 - main - ena: Fix RSS sysctl panic when the RSS table is destroyed
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 02 Nov 2026 18:42:24 UTC
The branch main has been updated by akiyano:
URL: https://cgit.FreeBSD.org/src/commit/?id=eb65bcbf6cb5b8ace59504ea721ff1802e912296
commit eb65bcbf6cb5b8ace59504ea721ff1802e912296
Author: Arthur Kiyanovski <akiyano@amazon.com>
AuthorDate: 2026-10-30 01:38:44 +0000
Commit: Arthur Kiyanovski <akiyano@FreeBSD.org>
CommitDate: 2026-11-02 18:31:51 +0000
ena: Fix RSS sysctl panic when the RSS table is destroyed
ena_set_io_queue_count() destroys the ena-com RSS state but left
ENA_FLAG_RSS_ACTIVE set. The RSS sysctl handlers gate on that flag, so
they ran against state that was gone.
This causes 2 types of issues:
1. Kernel panic when reading dev.ena.0.rss.key or writing to
dev.ena.0.rss.indir_table
2. Returning a stale cached RSS table when reading
dev.ena.0.rss.indir_table, or a bogus 1 when reading
dev.ena.0.rss.indir_table_size
ena_set_io_queue_count() is called in 2 cases:
1. The io_queues_nb sysctl.
2. Device restore when the device comes back with fewer MSI-X vectors
than before.
Clear ENA_FLAG_RSS_ACTIVE when the RSS table is destroyed. The handlers
then fail with ENOTSUP until the next ena_up() rebuilds RSS.
This both fixes the panics, and stops returning cached and bogus values.
Note: A plain ifconfig down does not destroy the table, so the sysctls
keep working across a down/up cycle.
Reviewed by: cperciva
Fixes: 56d41ad5fe9c ("Add sysctl node for ENA IO queues number adjustment")
Fixes: 2d4d2ed3fef6 ("ena: Reinit RSS table on device restore when queue count shrinks")
MFC after: 3 days
Sponsored by: Amazon, Inc.
Differential Revision: https://reviews.freebsd.org/D61057
---
sys/dev/ena/ena.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c
index 74594fdb1496..2d43456f3e74 100644
--- a/sys/dev/ena/ena.c
+++ b/sys/dev/ena/ena.c
@@ -1302,6 +1302,7 @@ static void
ena_set_io_queue_count(struct ena_adapter *adapter, uint32_t num)
{
adapter->num_io_queues = num;
+ ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_RSS_ACTIVE, adapter);
/* Force indirection table to be reinitialized */
ena_com_rss_destroy(adapter->ena_dev);
}