[PATCH v1 1/1] net/iavf: workaround for IRQ map size mismatch

Anatoly Burakov anatoly.burakov at intel.com
Fri Jun 26 16:25:54 CEST 2026


Some out-of-tree ICE kernel driver versions have a known issue where they
expect size of IRQ queue vector map command to be bigger than needed, and
because the driver rejects the correct size as invalid, a workaround is
needed to send down a "wrong" size and configure the IRQ maps.

Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
 drivers/net/intel/iavf/iavf_vchnl.c | 30 ++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index 0643a835d5..408ff31aa5 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -1566,7 +1566,8 @@ iavf_config_irq_map(struct iavf_adapter *adapter)
 static int
 iavf_config_irq_map_lv_chunk(struct iavf_adapter *adapter,
 		uint16_t chunk_sz,
-		uint16_t chunk_start)
+		uint16_t chunk_start,
+		bool wrong_size)
 {
 	struct {
 		struct virtchnl_queue_vector_maps map_info;
@@ -1593,9 +1594,19 @@ iavf_config_irq_map_lv_chunk(struct iavf_adapter *adapter,
 		qv_maps->vector_id = vf->qv_map[chunk_start + i].vector_id;
 	}
 
-	/* for some reason PF side checks for buffer being too big, so adjust it down */
-	buf_len = sizeof(struct virtchnl_queue_vector_maps) +
-		  sizeof(struct virtchnl_queue_vector) * (chunk_sz - 1);
+	/*
+	 * in out-of-tree kernel driver versions 2.6.4 and 2.6.6 there is a
+	 * known issue where the PF side expects the buffer size to be bigger
+	 * than necessary. this is a workaround for that issue.
+	 */
+	if (wrong_size)
+		/* send N+1 instead of N to workaround PF side bug */
+		buf_len = sizeof(struct virtchnl_queue_vector_maps) +
+			sizeof(struct virtchnl_queue_vector) * (chunk_sz);
+	else
+		/* virtchnl_queue_vector_maps already contains 1 queue_vector */
+		buf_len = sizeof(struct virtchnl_queue_vector_maps) +
+			sizeof(struct virtchnl_queue_vector) * (chunk_sz - 1);
 
 	args.ops = VIRTCHNL_OP_MAP_QUEUE_VECTOR;
 	args.in_args = (u8 *)map_info;
@@ -1609,12 +1620,21 @@ iavf_config_irq_map_lv_chunk(struct iavf_adapter *adapter,
 int
 iavf_config_irq_map_lv(struct iavf_adapter *adapter, uint16_t num)
 {
+	static bool wrong_size;
 	uint16_t c;
 	int err;
 
 	for (c = 0; c < num; c += IAVF_CFG_Q_NUM_PER_BUF) {
 		uint16_t chunk_sz = RTE_MIN(num - c, IAVF_CFG_Q_NUM_PER_BUF);
-		err = iavf_config_irq_map_lv_chunk(adapter, chunk_sz, c);
+		err = iavf_config_irq_map_lv_chunk(adapter, chunk_sz, c, wrong_size);
+		if (err) {
+			/* try workaround for a known issue */
+			err = iavf_config_irq_map_lv_chunk(adapter, chunk_sz, c, true);
+			if (err == 0) {
+				PMD_DRV_LOG(DEBUG, "Using workaround for IRQ map");
+				wrong_size = true;
+			}
+		}
 		if (err) {
 			PMD_DRV_LOG(ERR, "Failed to configure irq map chunk [%u, %u)",
 					c, c + chunk_sz);
-- 
2.47.3



More information about the dev mailing list