| From 48cf7df171d3c2cfd1d167d3271d3ef1942de188 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 19 Jan 2022 15:52:58 +0100 |
| Subject: igc: avoid kernel warning when changing RX ring parameters |
| |
| From: Corinna Vinschen <vinschen@redhat.com> |
| |
| [ Upstream commit 453307b569a0d41bddd07f26bf41b784cd82a4c9 ] |
| |
| Calling ethtool changing the RX ring parameters like this: |
| |
| $ ethtool -G eth0 rx 1024 |
| |
| on igc triggers kernel warnings like this: |
| |
| [ 225.198467] ------------[ cut here ]------------ |
| [ 225.198473] Missing unregister, handled but fix driver |
| [ 225.198485] WARNING: CPU: 7 PID: 959 at net/core/xdp.c:168 |
| xdp_rxq_info_reg+0x79/0xd0 |
| [...] |
| [ 225.198601] Call Trace: |
| [ 225.198604] <TASK> |
| [ 225.198609] igc_setup_rx_resources+0x3f/0xe0 [igc] |
| [ 225.198617] igc_ethtool_set_ringparam+0x30e/0x450 [igc] |
| [ 225.198626] ethnl_set_rings+0x18a/0x250 |
| [ 225.198631] genl_family_rcv_msg_doit+0xca/0x110 |
| [ 225.198637] genl_rcv_msg+0xce/0x1c0 |
| [ 225.198640] ? rings_prepare_data+0x60/0x60 |
| [ 225.198644] ? genl_get_cmd+0xd0/0xd0 |
| [ 225.198647] netlink_rcv_skb+0x4e/0xf0 |
| [ 225.198652] genl_rcv+0x24/0x40 |
| [ 225.198655] netlink_unicast+0x20e/0x330 |
| [ 225.198659] netlink_sendmsg+0x23f/0x480 |
| [ 225.198663] sock_sendmsg+0x5b/0x60 |
| [ 225.198667] __sys_sendto+0xf0/0x160 |
| [ 225.198671] ? handle_mm_fault+0xb2/0x280 |
| [ 225.198676] ? do_user_addr_fault+0x1eb/0x690 |
| [ 225.198680] __x64_sys_sendto+0x20/0x30 |
| [ 225.198683] do_syscall_64+0x38/0x90 |
| [ 225.198687] entry_SYSCALL_64_after_hwframe+0x44/0xae |
| [ 225.198693] RIP: 0033:0x7f7ae38ac3aa |
| |
| igc_ethtool_set_ringparam() copies the igc_ring structure but neglects to |
| reset the xdp_rxq_info member before calling igc_setup_rx_resources(). |
| This in turn calls xdp_rxq_info_reg() with an already registered xdp_rxq_info. |
| |
| Make sure to unregister the xdp_rxq_info structure first in |
| igc_setup_rx_resources. |
| |
| Fixes: 73f1071c1d29 ("igc: Add support for XDP_TX action") |
| Reported-by: Lennert Buytenhek <buytenh@arista.com> |
| Signed-off-by: Corinna Vinschen <vinschen@redhat.com> |
| Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> |
| Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c |
| index 629e4a644a9d..2a9ae53238f7 100644 |
| --- a/drivers/net/ethernet/intel/igc/igc_main.c |
| +++ b/drivers/net/ethernet/intel/igc/igc_main.c |
| @@ -505,6 +505,9 @@ int igc_setup_rx_resources(struct igc_ring *rx_ring) |
| u8 index = rx_ring->queue_index; |
| int size, desc_len, res; |
| |
| + /* XDP RX-queue info */ |
| + if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq)) |
| + xdp_rxq_info_unreg(&rx_ring->xdp_rxq); |
| res = xdp_rxq_info_reg(&rx_ring->xdp_rxq, ndev, index, |
| rx_ring->q_vector->napi.napi_id); |
| if (res < 0) { |
| -- |
| 2.34.1 |
| |