diff mbox series

[net] ice: fix rx buffers handling for flow director packets

Message ID 20230306102024.1375464-1-piotr.raczynski@intel.com (mailing list archive)
State Awaiting Upstream
Delegated to: Netdev Maintainers
Headers show
Series [net] ice: fix rx buffers handling for flow director packets | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 22 this patch: 22
netdev/cc_maintainers fail 2 blamed authors not CCed: daniel@iogearbox.net alexandr.lobakin@intel.com; 8 maintainers not CCed: pabeni@redhat.com davem@davemloft.net jesse.brandeburg@intel.com daniel@iogearbox.net intel-wired-lan@lists.osuosl.org alexandr.lobakin@intel.com edumazet@google.com kuba@kernel.org
netdev/build_clang success Errors and warnings before: 20 this patch: 20
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 22 this patch: 22
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 7 lines checked
netdev/kdoc success Errors and warnings before: 2 this patch: 2
netdev/source_inline success Was 0 now: 0

Commit Message

Piotr Raczynski March 6, 2023, 10:20 a.m. UTC
Adding flow director filters stopped working correctly after
commit 2fba7dc5157b ("ice: Add support for XDP multi-buffer
on Rx side"). As a result, only first flow director filter
can be added, adding next filter leads to NULL pointer
dereference attached below.

Rx buffer handling and reallocation logic has been optimized,
however flow director specific traffic was not accounted for.
As a result driver handled those packets incorrectly since new
logic was based on ice_rx_ring::first_desc which was not set
in this case.

Fix this by setting struct ice_rx_ring::first_desc to next_to_clean
for flow director received packets.

[  438.544867] BUG: kernel NULL pointer dereference, address: 0000000000000000
[  438.551840] #PF: supervisor read access in kernel mode
[  438.556978] #PF: error_code(0x0000) - not-present page
[  438.562115] PGD 7c953b2067 P4D 0
[  438.565436] Oops: 0000 [#1] PREEMPT SMP NOPTI
[  438.569794] CPU: 0 PID: 0 Comm: swapper/0 Kdump: loaded Not tainted 6.2.0-net-bug #1
[  438.577531] Hardware name: Intel Corporation M50CYP2SBSTD/M50CYP2SBSTD, BIOS SE5C620.86B.01.01.0005.2202160810 02/16/2022
[  438.588470] RIP: 0010:ice_clean_rx_irq+0x2b9/0xf20 [ice]
[  438.593860] Code: 45 89 f7 e9 ac 00 00 00 8b 4d 78 41 31 4e 10 41 09 d5 4d 85 f6 0f 84 82 00 00 00 49 8b 4e 08 41 8b 76
1c 65 8b 3d 47 36 4a 3f <48> 8b 11 48 c1 ea 36 39 d7 0f 85 a6 00 00 00 f6 41 08 02 0f 85 9c
[  438.612605] RSP: 0018:ff8c732640003ec8 EFLAGS: 00010082
[  438.617831] RAX: 0000000000000800 RBX: 00000000000007ff RCX: 0000000000000000
[  438.624957] RDX: 0000000000000800 RSI: 0000000000000000 RDI: 0000000000000000
[  438.632089] RBP: ff4ed275a2158200 R08: 00000000ffffffff R09: 0000000000000020
[  438.639222] R10: 0000000000000000 R11: 0000000000000020 R12: 0000000000001000
[  438.646356] R13: 0000000000000000 R14: ff4ed275d0daffe0 R15: 0000000000000000
[  438.653485] FS:  0000000000000000(0000) GS:ff4ed2738fa00000(0000) knlGS:0000000000000000
[  438.661563] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  438.667310] CR2: 0000000000000000 CR3: 0000007c9f0d6006 CR4: 0000000000771ef0
[  438.674444] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  438.681573] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[  438.688697] PKRU: 55555554
[  438.691404] Call Trace:
[  438.693857]  <IRQ>
[  438.695877]  ? profile_tick+0x17/0x80
[  438.699542]  ice_msix_clean_ctrl_vsi+0x24/0x50 [ice]
[  438.702571] ice 0000:b1:00.0: VF 1: ctrl_vsi irq timeout
[  438.704542]  __handle_irq_event_percpu+0x43/0x1a0
[  438.704549]  handle_irq_event+0x34/0x70
[  438.704554]  handle_edge_irq+0x9f/0x240
[  438.709901] iavf 0000:b1:01.1: Failed to add Flow Director filter with status: 6
[  438.714571]  __common_interrupt+0x63/0x100
[  438.714580]  common_interrupt+0xb4/0xd0
[  438.718424] iavf 0000:b1:01.1: Rule ID: 127 dst_ip: 0.0.0.0 src_ip 0.0.0.0 UDP: dst_port 4 src_port 0
[  438.722255]  </IRQ>
[  438.722257]  <TASK>
[  438.722257]  asm_common_interrupt+0x22/0x40
[  438.722262] RIP: 0010:cpuidle_enter_state+0xc8/0x430
[  438.722267] Code: 6e e9 25 ff e8 f9 ef ff ff 8b 53 04 49 89 c5 0f 1f 44 00 00 31 ff e8 d7 f1 24 ff 45
84 ff 0f 85 57 02 00 00 fb 0f 1f 44 00 00 <45> 85 f6 0f 88 85 01 00 00 49 63 d6 48 8d 04 52 48 8d 04 82 49 8d
[  438.722269] RSP: 0018:ffffffff86003e50 EFLAGS: 00000246
[  438.784108] RAX: ff4ed2738fa00000 RBX: ffbe72a64fc01020 RCX: 0000000000000000
[  438.791234] RDX: 0000000000000000 RSI: ffffffff858d84de RDI: ffffffff85893641
[  438.798365] RBP: 0000000000000002 R08: 0000000000000002 R09: 000000003158af9d
[  438.805490] R10: 0000000000000008 R11: 0000000000000354 R12: ffffffff862365a0
[  438.812622] R13: 000000661b472a87 R14: 0000000000000002 R15: 0000000000000000
[  438.819757]  cpuidle_enter+0x29/0x40
[  438.823333]  do_idle+0x1b6/0x230
[  438.826566]  cpu_startup_entry+0x19/0x20
[  438.830492]  rest_init+0xcb/0xd0
[  438.833717]  arch_call_rest_init+0xa/0x30
[  438.837731]  start_kernel+0x776/0xb70
[  438.841396]  secondary_startup_64_no_verify+0xe5/0xeb
[  438.846449]  </TASK>

Fixes: 2fba7dc5157b ("ice: Add support for XDP multi-buffer on Rx side")
Signed-off-by: Piotr Raczynski <piotr.raczynski@intel.com>
Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
---
 drivers/net/ethernet/intel/ice/ice_txrx.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Simon Horman March 6, 2023, 1:11 p.m. UTC | #1
On Mon, Mar 06, 2023 at 11:20:24AM +0100, Piotr Raczynski wrote:
> Adding flow director filters stopped working correctly after
> commit 2fba7dc5157b ("ice: Add support for XDP multi-buffer
> on Rx side"). As a result, only first flow director filter
> can be added, adding next filter leads to NULL pointer
> dereference attached below.
> 
> Rx buffer handling and reallocation logic has been optimized,
> however flow director specific traffic was not accounted for.
> As a result driver handled those packets incorrectly since new
> logic was based on ice_rx_ring::first_desc which was not set
> in this case.
> 
> Fix this by setting struct ice_rx_ring::first_desc to next_to_clean
> for flow director received packets.
> 
> [  438.544867] BUG: kernel NULL pointer dereference, address: 0000000000000000
> [  438.551840] #PF: supervisor read access in kernel mode
> [  438.556978] #PF: error_code(0x0000) - not-present page
> [  438.562115] PGD 7c953b2067 P4D 0
> [  438.565436] Oops: 0000 [#1] PREEMPT SMP NOPTI
> [  438.569794] CPU: 0 PID: 0 Comm: swapper/0 Kdump: loaded Not tainted 6.2.0-net-bug #1
> [  438.577531] Hardware name: Intel Corporation M50CYP2SBSTD/M50CYP2SBSTD, BIOS SE5C620.86B.01.01.0005.2202160810 02/16/2022
> [  438.588470] RIP: 0010:ice_clean_rx_irq+0x2b9/0xf20 [ice]
> [  438.593860] Code: 45 89 f7 e9 ac 00 00 00 8b 4d 78 41 31 4e 10 41 09 d5 4d 85 f6 0f 84 82 00 00 00 49 8b 4e 08 41 8b 76
> 1c 65 8b 3d 47 36 4a 3f <48> 8b 11 48 c1 ea 36 39 d7 0f 85 a6 00 00 00 f6 41 08 02 0f 85 9c
> [  438.612605] RSP: 0018:ff8c732640003ec8 EFLAGS: 00010082
> [  438.617831] RAX: 0000000000000800 RBX: 00000000000007ff RCX: 0000000000000000
> [  438.624957] RDX: 0000000000000800 RSI: 0000000000000000 RDI: 0000000000000000
> [  438.632089] RBP: ff4ed275a2158200 R08: 00000000ffffffff R09: 0000000000000020
> [  438.639222] R10: 0000000000000000 R11: 0000000000000020 R12: 0000000000001000
> [  438.646356] R13: 0000000000000000 R14: ff4ed275d0daffe0 R15: 0000000000000000
> [  438.653485] FS:  0000000000000000(0000) GS:ff4ed2738fa00000(0000) knlGS:0000000000000000
> [  438.661563] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  438.667310] CR2: 0000000000000000 CR3: 0000007c9f0d6006 CR4: 0000000000771ef0
> [  438.674444] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [  438.681573] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> [  438.688697] PKRU: 55555554
> [  438.691404] Call Trace:
> [  438.693857]  <IRQ>
> [  438.695877]  ? profile_tick+0x17/0x80
> [  438.699542]  ice_msix_clean_ctrl_vsi+0x24/0x50 [ice]
> [  438.702571] ice 0000:b1:00.0: VF 1: ctrl_vsi irq timeout
> [  438.704542]  __handle_irq_event_percpu+0x43/0x1a0
> [  438.704549]  handle_irq_event+0x34/0x70
> [  438.704554]  handle_edge_irq+0x9f/0x240
> [  438.709901] iavf 0000:b1:01.1: Failed to add Flow Director filter with status: 6
> [  438.714571]  __common_interrupt+0x63/0x100
> [  438.714580]  common_interrupt+0xb4/0xd0
> [  438.718424] iavf 0000:b1:01.1: Rule ID: 127 dst_ip: 0.0.0.0 src_ip 0.0.0.0 UDP: dst_port 4 src_port 0
> [  438.722255]  </IRQ>
> [  438.722257]  <TASK>
> [  438.722257]  asm_common_interrupt+0x22/0x40
> [  438.722262] RIP: 0010:cpuidle_enter_state+0xc8/0x430
> [  438.722267] Code: 6e e9 25 ff e8 f9 ef ff ff 8b 53 04 49 89 c5 0f 1f 44 00 00 31 ff e8 d7 f1 24 ff 45
> 84 ff 0f 85 57 02 00 00 fb 0f 1f 44 00 00 <45> 85 f6 0f 88 85 01 00 00 49 63 d6 48 8d 04 52 48 8d 04 82 49 8d
> [  438.722269] RSP: 0018:ffffffff86003e50 EFLAGS: 00000246
> [  438.784108] RAX: ff4ed2738fa00000 RBX: ffbe72a64fc01020 RCX: 0000000000000000
> [  438.791234] RDX: 0000000000000000 RSI: ffffffff858d84de RDI: ffffffff85893641
> [  438.798365] RBP: 0000000000000002 R08: 0000000000000002 R09: 000000003158af9d
> [  438.805490] R10: 0000000000000008 R11: 0000000000000354 R12: ffffffff862365a0
> [  438.812622] R13: 000000661b472a87 R14: 0000000000000002 R15: 0000000000000000
> [  438.819757]  cpuidle_enter+0x29/0x40
> [  438.823333]  do_idle+0x1b6/0x230
> [  438.826566]  cpu_startup_entry+0x19/0x20
> [  438.830492]  rest_init+0xcb/0xd0
> [  438.833717]  arch_call_rest_init+0xa/0x30
> [  438.837731]  start_kernel+0x776/0xb70
> [  438.841396]  secondary_startup_64_no_verify+0xe5/0xeb
> [  438.846449]  </TASK>
> 
> Fixes: 2fba7dc5157b ("ice: Add support for XDP multi-buffer on Rx side")
> Signed-off-by: Piotr Raczynski <piotr.raczynski@intel.com>
> Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>

Reviewed-by: Simon Horman <simon.horman@corigine.com>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
index dfd22862e926..b61dd9f01540 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
@@ -1210,6 +1210,7 @@  int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
 				ice_vc_fdir_irq_handler(ctrl_vsi, rx_desc);
 			if (++ntc == cnt)
 				ntc = 0;
+			rx_ring->first_desc = ntc;
 			continue;
 		}