lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <C50076FF-334C-4414-BC9D-878B68E7520B@net-swift.com>
Date: Mon, 23 Jun 2025 16:05:30 +0800
From: "mengyuanlou@...-swift.com" <mengyuanlou@...-swift.com>
To: Jiawen Wu <jiawenwu@...stnetic.com>
Cc: netdev@...r.kernel.org,
 andrew+netdev@...n.ch,
 davem@...emloft.net,
 edumazet@...gle.com,
 kuba@...nel.org,
 pabeni@...hat.com,
 horms@...nel.org,
 duanqiangwen@...-swift.com,
 stable@...r.kernel.org
Subject: Re: [PATCH net 2/2] net: wangxun: revert the adjustment of the IRQ
 vector sequence



> 2025年6月20日 16:57,Jiawen Wu <jiawenwu@...stnetic.com> 写道:
> 
> Due to hardware limitations of NGBE, queue IRQs can only be requested
> on vector 0 to 7. When the number of queues is set to the maximum 8,
> the PCI IRQ vectors are allocated from 0 to 8. The vector 0 is used by
> MISC interrupt, and althrough the vector 8 is used by queue interrupt,
> it is unable to receive packets. This will cause some packets to be
> dropped when RSS is enabled and they are assigned to queue 8.
> 
> So revert the adjustment of the MISC IRQ location, to make it be the
> last one in IRQ vectors.
> 
> Fixes: 937d46ecc5f9 ("net: wangxun: add ethtool_ops for channel number")
> Cc: stable@...r.kernel.org
> Signed-off-by: Jiawen Wu <jiawenwu@...stnetic.com>
> ---
> drivers/net/ethernet/wangxun/libwx/wx_lib.c     | 17 ++++++++---------
> drivers/net/ethernet/wangxun/libwx/wx_type.h    |  2 +-
> drivers/net/ethernet/wangxun/ngbe/ngbe_main.c   |  2 +-
> drivers/net/ethernet/wangxun/ngbe/ngbe_type.h   |  2 +-
> drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c  |  6 +++---
> drivers/net/ethernet/wangxun/txgbe/txgbe_type.h |  4 ++--
> 6 files changed, 16 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
> index 7f2e6cddfeb1..66eaf5446115 100644
> --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c
> +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
> @@ -1746,7 +1746,7 @@ static void wx_set_num_queues(struct wx *wx)
>  */
> static int wx_acquire_msix_vectors(struct wx *wx)
> {
> - struct irq_affinity affd = { .pre_vectors = 1 };
> + struct irq_affinity affd = { .post_vectors = 1 };
> int nvecs, i;
> 
> /* We start by asking for one vector per queue pair */
> @@ -1783,16 +1783,17 @@ static int wx_acquire_msix_vectors(struct wx *wx)
> return nvecs;
> }
> 
> - wx->msix_entry->entry = 0;
> - wx->msix_entry->vector = pci_irq_vector(wx->pdev, 0);
> nvecs -= 1;
> for (i = 0; i < nvecs; i++) {
> wx->msix_q_entries[i].entry = i;
> - wx->msix_q_entries[i].vector = pci_irq_vector(wx->pdev, i + 1);
> + wx->msix_q_entries[i].vector = pci_irq_vector(wx->pdev, i);
> }
> 
> wx->num_q_vectors = nvecs;
> 
> + wx->msix_entry->entry = nvecs;
> + wx->msix_entry->vector = pci_irq_vector(wx->pdev, nvecs);
> +
> return 0;
> }
> 
> @@ -2299,8 +2300,6 @@ static void wx_set_ivar(struct wx *wx, s8 direction,


> if ((wx->mac.type == wx_mac_em && wx->num_vfs == 7))
Misc and queue should reuse vector[0]

> wr32(wx, WX_PX_MISC_IVAR, ivar);
> } else {
> /* tx or rx causes */
> - if (!(wx->mac.type == wx_mac_em && wx->num_vfs == 7))
> - msix_vector += 1; /* offset for queue vectors */
> msix_vector |= WX_PX_IVAR_ALLOC_VAL;
> index = ((16 * (queue & 1)) + (8 * direction));
> ivar = rd32(wx, WX_PX_IVAR(queue >> 1));
> @@ -2339,7 +2338,7 @@ void wx_write_eitr(struct wx_q_vector *q_vector)
> 
> itr_reg |= WX_PX_ITR_CNT_WDIS;
> 
> - wr32(wx, WX_PX_ITR(v_idx + 1), itr_reg);
> + wr32(wx, WX_PX_ITR(v_idx), itr_reg);
> }
> 
> /**
> @@ -2392,9 +2391,9 @@ void wx_configure_vectors(struct wx *wx)
> wx_write_eitr(q_vector);
> }
> 
> - wx_set_ivar(wx, -1, 0, 0);
> + wx_set_ivar(wx, -1, 0, v_idx);
> if (pdev->msix_enabled)
> - wr32(wx, WX_PX_ITR(0), 1950);
> + wr32(wx, WX_PX_ITR(v_idx), 1950);
> }
> EXPORT_SYMBOL(wx_configure_vectors);
> 
> diff --git a/drivers/net/ethernet/wangxun/libwx/wx_type.h b/drivers/net/ethernet/wangxun/libwx/wx_type.h
> index 7730c9fc3e02..d392394791b3 100644
> --- a/drivers/net/ethernet/wangxun/libwx/wx_type.h
> +++ b/drivers/net/ethernet/wangxun/libwx/wx_type.h
> @@ -1343,7 +1343,7 @@ struct wx {
> };
> 
> #define WX_INTR_ALL (~0ULL)
> -#define WX_INTR_Q(i) BIT((i) + 1)
> +#define WX_INTR_Q(i) BIT((i))
> 
> /* register operations */
> #define wr32(a, reg, value) writel((value), ((a)->hw_addr + (reg)))
> diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> index b5022c49dc5e..68415a7ef12f 100644
> --- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> +++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> @@ -161,7 +161,7 @@ static void ngbe_irq_enable(struct wx *wx, bool queues)
> if (queues)
> wx_intr_enable(wx, NGBE_INTR_ALL);
> else
> - wx_intr_enable(wx, NGBE_INTR_MISC);
> + wx_intr_enable(wx, NGBE_INTR_MISC(wx));
> }
> 
> /**
> diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_type.h b/drivers/net/ethernet/wangxun/ngbe/ngbe_type.h
> index bb74263f0498..6eca6de475f7 100644
> --- a/drivers/net/ethernet/wangxun/ngbe/ngbe_type.h
> +++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_type.h
> @@ -87,7 +87,7 @@
> #define NGBE_PX_MISC_IC_TIMESYNC BIT(11) /* time sync */
> 
> #define NGBE_INTR_ALL 0x1FF
> -#define NGBE_INTR_MISC BIT(0)
> +#define NGBE_INTR_MISC(A) BIT((A)->num_q_vectors)
> 
> #define NGBE_PHY_CONFIG(reg_offset) (0x14000 + ((reg_offset) * 4))
> #define NGBE_CFG_LAN_SPEED 0x14440
> diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c
> index 20b9a28bcb55..21fc86ec25ce 100644
> --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c
> +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c
> @@ -31,7 +31,7 @@ void txgbe_irq_enable(struct wx *wx, bool queues)
> wr32(wx, WX_PX_MISC_IEN, misc_ien);
> 
> /* unmask interrupt */
> - wx_intr_enable(wx, TXGBE_INTR_MISC);
> + wx_intr_enable(wx, TXGBE_INTR_MISC(wx));
> if (queues)
> wx_intr_enable(wx, TXGBE_INTR_QALL(wx));
> }
> @@ -132,7 +132,7 @@ static irqreturn_t txgbe_misc_irq_handle(int irq, void *data)
> txgbe->eicr = eicr;
> if (eicr & TXGBE_PX_MISC_IC_VF_MBOX) {
> wx_msg_task(txgbe->wx);
> - wx_intr_enable(wx, TXGBE_INTR_MISC);
> + wx_intr_enable(wx, TXGBE_INTR_MISC(wx));
> }
> return IRQ_WAKE_THREAD;
> }
> @@ -184,7 +184,7 @@ static irqreturn_t txgbe_misc_irq_thread_fn(int irq, void *data)
> nhandled++;
> }
> 
> - wx_intr_enable(wx, TXGBE_INTR_MISC);
> + wx_intr_enable(wx, TXGBE_INTR_MISC(wx));
> return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE);
> }
> 
> diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
> index 42ec815159e8..41915d7dd372 100644
> --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
> +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
> @@ -302,8 +302,8 @@ struct txgbe_fdir_filter {
> #define TXGBE_DEFAULT_RX_WORK           128
> #endif
> 
> -#define TXGBE_INTR_MISC       BIT(0)
> -#define TXGBE_INTR_QALL(A)    GENMASK((A)->num_q_vectors, 1)
> +#define TXGBE_INTR_MISC(A)    BIT((A)->num_q_vectors)
> +#define TXGBE_INTR_QALL(A)    (TXGBE_INTR_MISC(A) - 1)
> 
> #define TXGBE_MAX_EITR        GENMASK(11, 3)
> 
> -- 
> 2.48.1
> 
> 
> 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ