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] [thread-next>] [day] [month] [year] [list]
Message-ID: <aGKT8gP2D6A5fHy-@soc-5CG4396X81.clients.intel.com>
Date: Mon, 30 Jun 2025 15:41:06 +0200
From: Larysa Zaremba <larysa.zaremba@...el.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>, <michal.swiatkowski@...ux.intel.com>,
	<mengyuanlou@...-swift.com>, <duanqiangwen@...-swift.com>,
	<stable@...r.kernel.org>
Subject: Re: [PATCH net v3 2/3] net: wangxun: revert the adjustment of the
 IRQ vector sequence

On Thu, Jun 26, 2025 at 04:48:03PM +0800, Jiawen Wu wrote:
> 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>

Reviewed-by: Larysa Zaremba <larysa.zaremba@...el.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,
>  		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 dc468053bdf8..3885283681ec 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));
>  }
> @@ -131,7 +131,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;
>  	}
> @@ -183,7 +183,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