| Message ID | 20251205082459.1586143-1-aaron.ma@canonical.com |
|---|---|
| State | Changes Requested |
| Headers | show |
| Series | [v2,1/2] ice: Fix NULL pointer dereference in ice_vsi_set_napi_queues | expand |
On Fri, Dec 05, 2025 at 04:24:58PM +0800, Aaron Ma wrote: > Add NULL pointer checks in ice_vsi_set_napi_queues() to prevent crashes > during resume from suspend when rings[q_idx]->q_vector is NULL. Hi Aaron, This is not a review. But a request for the future: please don't post revised patchsets to netdev more than once every 24h. Reasons for this include: allowing allow time for review; and reducing load on shared CI infrastructure. Link: https://docs.kernel.org/process/maintainer-netdev.html Thanks!
On Fri, Dec 5, 2025 at 11:11 PM Simon Horman <horms@kernel.org> wrote: > > On Fri, Dec 05, 2025 at 04:24:58PM +0800, Aaron Ma wrote: > > Add NULL pointer checks in ice_vsi_set_napi_queues() to prevent crashes > > during resume from suspend when rings[q_idx]->q_vector is NULL. > > Hi Aaron, > > This is not a review. But a request for the future: > please don't post revised patchsets to netdev more than once every 24h. > > Reasons for this include: allowing allow time for review; and reducing > load on shared CI infrastructure. > > Link: https://docs.kernel.org/process/maintainer-netdev.html > Thanks, and I will keep it in mind. Aaron > Thanks!
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf > Of Aaron Ma > Sent: Friday, December 5, 2025 9:25 AM > To: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; Kitszel, > Przemyslaw <przemyslaw.kitszel@intel.com>; andrew+netdev@lunn.ch; > davem@davemloft.net; edumazet@google.com; kuba@kernel.org; > pabeni@redhat.com; intel-wired-lan@lists.osuosl.org; > netdev@vger.kernel.org; linux-kernel@vger.kernel.org > Subject: [Intel-wired-lan] [PATCH v2 1/2] ice: Fix NULL pointer > dereference in ice_vsi_set_napi_queues > > Add NULL pointer checks in ice_vsi_set_napi_queues() to prevent > crashes during resume from suspend when rings[q_idx]->q_vector is > NULL. > > Tested adaptor: > 60:00.0 Ethernet controller [0200]: Intel Corporation Ethernet > Controller E810-XXV for SFP [8086:159b] (rev 02) > Subsystem: Intel Corporation Ethernet Network Adapter E810- > XXV-2 [8086:4003] > > SR-IOV state: both disabled and enabled can reproduce this issue. > > kernel version: v6.18 > > Reproduce steps: > Bootup and execute suspend like systemctl suspend or rtcwake. > > Log: > <1>[ 231.443607] BUG: kernel NULL pointer dereference, address: > 0000000000000040 <1>[ 231.444052] #PF: supervisor read access in > kernel mode <1>[ 231.444484] #PF: error_code(0x0000) - not-present > page <6>[ 231.444913] PGD 0 P4D 0 <4>[ 231.445342] Oops: Oops: 0000 > [#1] SMP NOPTI <4>[ 231.446635] RIP: > 0010:netif_queue_set_napi+0xa/0x170 > <4>[ 231.447067] Code: 31 f6 31 ff c3 cc cc cc cc 0f 1f 80 00 00 00 > 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 0f 1f 44 00 00 48 > 85 c9 74 0b <48> 83 79 30 00 0f 84 39 01 00 00 55 41 89 d1 49 89 f8 89 > f2 48 89 <4>[ 231.447513] RSP: 0018:ffffcc780fc078c0 EFLAGS: 00010202 > <4>[ 231.447961] RAX: ffff8b848ca30400 RBX: ffff8b848caf2028 RCX: > 0000000000000010 <4>[ 231.448443] RDX: 0000000000000000 RSI: > 0000000000000000 RDI: ffff8b848dbd4000 <4>[ 231.448896] RBP: > ffffcc780fc078e8 R08: 0000000000000000 R09: 0000000000000000 <4>[ > 231.449345] R10: 0000000000000000 R11: 0000000000000000 R12: > 0000000000000001 <4>[ 231.449817] R13: ffff8b848dbd4000 R14: > ffff8b84833390c8 R15: 0000000000000000 <4>[ 231.450265] FS: > 00007c7b29e9d740(0000) GS:ffff8b8c068e2000(0000) > knlGS:0000000000000000 <4>[ 231.450715] CS: 0010 DS: 0000 ES: 0000 > CR0: 0000000080050033 <4>[ 231.451179] CR2: 0000000000000040 CR3: > 000000030626f004 CR4: 0000000000f72ef0 <4>[ 231.451629] PKRU: > 55555554 <4>[ 231.452076] Call Trace: > <4>[ 231.452549] <TASK> > <4>[ 231.452996] ? ice_vsi_set_napi_queues+0x4d/0x110 [ice] <4>[ > 231.453482] ice_resume+0xfd/0x220 [ice] <4>[ 231.453977] ? > __pfx_pci_pm_resume+0x10/0x10 <4>[ 231.454425] > pci_pm_resume+0x8c/0x140 <4>[ 231.454872] ? > __pfx_pci_pm_resume+0x10/0x10 <4>[ 231.455347] > dpm_run_callback+0x5f/0x160 <4>[ 231.455796] ? > dpm_wait_for_superior+0x107/0x170 <4>[ 231.456244] > device_resume+0x177/0x270 <4>[ 231.456708] dpm_resume+0x209/0x2f0 > <4>[ 231.457151] dpm_resume_end+0x15/0x30 <4>[ 231.457596] > suspend_devices_and_enter+0x1da/0x2b0 > <4>[ 231.458054] enter_state+0x10e/0x570 > > Add defensive checks for both the ring pointer and its q_vector before > dereferencing, allowing the system to resume successfully even when > q_vectors are unmapped. > > Fixes: 2a5dc090b92cf ("ice: move netif_queue_set_napi to rtnl- > protected sections") > Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> > Signed-off-by: Aaron Ma <aaron.ma@canonical.com> > --- > V1 -> V2: add test device info. > > drivers/net/ethernet/intel/ice/ice_lib.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c > b/drivers/net/ethernet/intel/ice/ice_lib.c > index 15621707fbf81..9d1178bde4495 100644 > --- a/drivers/net/ethernet/intel/ice/ice_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_lib.c > @@ -2779,11 +2779,13 @@ void ice_vsi_set_napi_queues(struct ice_vsi > *vsi) > > ASSERT_RTNL(); > ice_for_each_rxq(vsi, q_idx) > - netif_queue_set_napi(netdev, q_idx, > NETDEV_QUEUE_TYPE_RX, > + if (vsi->rx_rings[q_idx] && vsi->rx_rings[q_idx]- > >q_vector) > + netif_queue_set_napi(netdev, q_idx, > NETDEV_QUEUE_TYPE_RX, > &vsi->rx_rings[q_idx]->q_vector- > >napi); > > ice_for_each_txq(vsi, q_idx) > - netif_queue_set_napi(netdev, q_idx, > NETDEV_QUEUE_TYPE_TX, > + if (vsi->tx_rings[q_idx] && vsi->tx_rings[q_idx]- > >q_vector) > + netif_queue_set_napi(netdev, q_idx, > NETDEV_QUEUE_TYPE_TX, > &vsi->tx_rings[q_idx]->q_vector- > >napi); Av'e got an idea, to improve indentation and logging /*just in case */ What do you think about this: ice_for_each_rxq(vsi, q_idx) { if (!vsi->rx_rings[q_idx] || !vsi->rx_rings[q_idx]->q_vector) { netdev_warn_once(netdev, "RX ring %d or q_vector is NULL\n", q_idx); continue; } netif_queue_set_napi(netdev, q_idx, NETDEV_QUEUE_TYPE_RX, &vsi->rx_rings[q_idx]->q_vector->napi); } With the best regards Alex > /* Also set the interrupt number for the NAPI */ > ice_for_each_q_vector(vsi, v_idx) { > -- > 2.43.0
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 15621707fbf81..9d1178bde4495 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -2779,11 +2779,13 @@ void ice_vsi_set_napi_queues(struct ice_vsi *vsi) ASSERT_RTNL(); ice_for_each_rxq(vsi, q_idx) - netif_queue_set_napi(netdev, q_idx, NETDEV_QUEUE_TYPE_RX, + if (vsi->rx_rings[q_idx] && vsi->rx_rings[q_idx]->q_vector) + netif_queue_set_napi(netdev, q_idx, NETDEV_QUEUE_TYPE_RX, &vsi->rx_rings[q_idx]->q_vector->napi); ice_for_each_txq(vsi, q_idx) - netif_queue_set_napi(netdev, q_idx, NETDEV_QUEUE_TYPE_TX, + if (vsi->tx_rings[q_idx] && vsi->tx_rings[q_idx]->q_vector) + netif_queue_set_napi(netdev, q_idx, NETDEV_QUEUE_TYPE_TX, &vsi->tx_rings[q_idx]->q_vector->napi); /* Also set the interrupt number for the NAPI */ ice_for_each_q_vector(vsi, v_idx) {
Add NULL pointer checks in ice_vsi_set_napi_queues() to prevent crashes during resume from suspend when rings[q_idx]->q_vector is NULL. Tested adaptor: 60:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller E810-XXV for SFP [8086:159b] (rev 02) Subsystem: Intel Corporation Ethernet Network Adapter E810-XXV-2 [8086:4003] SR-IOV state: both disabled and enabled can reproduce this issue. kernel version: v6.18 Reproduce steps: Bootup and execute suspend like systemctl suspend or rtcwake. Log: <1>[ 231.443607] BUG: kernel NULL pointer dereference, address: 0000000000000040 <1>[ 231.444052] #PF: supervisor read access in kernel mode <1>[ 231.444484] #PF: error_code(0x0000) - not-present page <6>[ 231.444913] PGD 0 P4D 0 <4>[ 231.445342] Oops: Oops: 0000 [#1] SMP NOPTI <4>[ 231.446635] RIP: 0010:netif_queue_set_napi+0xa/0x170 <4>[ 231.447067] Code: 31 f6 31 ff c3 cc cc cc cc 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 0f 1f 44 00 00 48 85 c9 74 0b <48> 83 79 30 00 0f 84 39 01 00 00 55 41 89 d1 49 89 f8 89 f2 48 89 <4>[ 231.447513] RSP: 0018:ffffcc780fc078c0 EFLAGS: 00010202 <4>[ 231.447961] RAX: ffff8b848ca30400 RBX: ffff8b848caf2028 RCX: 0000000000000010 <4>[ 231.448443] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff8b848dbd4000 <4>[ 231.448896] RBP: ffffcc780fc078e8 R08: 0000000000000000 R09: 0000000000000000 <4>[ 231.449345] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001 <4>[ 231.449817] R13: ffff8b848dbd4000 R14: ffff8b84833390c8 R15: 0000000000000000 <4>[ 231.450265] FS: 00007c7b29e9d740(0000) GS:ffff8b8c068e2000(0000) knlGS:0000000000000000 <4>[ 231.450715] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 <4>[ 231.451179] CR2: 0000000000000040 CR3: 000000030626f004 CR4: 0000000000f72ef0 <4>[ 231.451629] PKRU: 55555554 <4>[ 231.452076] Call Trace: <4>[ 231.452549] <TASK> <4>[ 231.452996] ? ice_vsi_set_napi_queues+0x4d/0x110 [ice] <4>[ 231.453482] ice_resume+0xfd/0x220 [ice] <4>[ 231.453977] ? __pfx_pci_pm_resume+0x10/0x10 <4>[ 231.454425] pci_pm_resume+0x8c/0x140 <4>[ 231.454872] ? __pfx_pci_pm_resume+0x10/0x10 <4>[ 231.455347] dpm_run_callback+0x5f/0x160 <4>[ 231.455796] ? dpm_wait_for_superior+0x107/0x170 <4>[ 231.456244] device_resume+0x177/0x270 <4>[ 231.456708] dpm_resume+0x209/0x2f0 <4>[ 231.457151] dpm_resume_end+0x15/0x30 <4>[ 231.457596] suspend_devices_and_enter+0x1da/0x2b0 <4>[ 231.458054] enter_state+0x10e/0x570 Add defensive checks for both the ring pointer and its q_vector before dereferencing, allowing the system to resume successfully even when q_vectors are unmapped. Fixes: 2a5dc090b92cf ("ice: move netif_queue_set_napi to rtnl-protected sections") Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Signed-off-by: Aaron Ma <aaron.ma@canonical.com> --- V1 -> V2: add test device info. drivers/net/ethernet/intel/ice/ice_lib.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)