mirror_ubuntu-kernels/drivers/net/ethernet/intel/ice
Petr Oros 67f6317dfa ice: Fix NULL pointer deref during VF reset
During stress test with attaching and detaching VF from KVM and
simultaneously changing VFs spoofcheck and trust there was a
NULL pointer dereference in ice_reset_vf that VF's VSI is null.

More than one instance of ice_reset_vf() can be running at a given
time. When we rebuild the VSI in ice_reset_vf, another reset can be
triaged from ice_service_task. In this case we can access the currently
uninitialized VSI and cause panic. The window for this racing condition
has been around for a long time but it's much worse after commit
227bf4500a ("ice: move VSI delete outside deconfig") because
the reset runs faster. ice_reset_vf() using vf->cfg_lock and when
we move this lock before accessing to the VF VSI, we can fix
BUG for all cases.

Panic occurs sometimes in ice_vsi_is_rx_queue_active() and sometimes
in ice_vsi_stop_all_rx_rings()

With our reproducer, we can hit BUG:
~8h before commit 227bf4500a ("ice: move VSI delete outside deconfig").
~20m after commit 227bf4500a ("ice: move VSI delete outside deconfig").
After this fix we are not able to reproduce it after ~48h

There was commit cf90b74341 ("ice: Fix call trace with null VSI during
VF reset") which also tried to fix this issue, but it was only
partially resolved and the bug still exists.

[ 6420.658415] BUG: kernel NULL pointer dereference, address: 0000000000000000
[ 6420.665382] #PF: supervisor read access in kernel mode
[ 6420.670521] #PF: error_code(0x0000) - not-present page
[ 6420.675659] PGD 0
[ 6420.677679] Oops: 0000 [#1] PREEMPT SMP NOPTI
[ 6420.682038] CPU: 53 PID: 326472 Comm: kworker/53:0 Kdump: loaded Not tainted 5.14.0-317.el9.x86_64 #1
[ 6420.691250] Hardware name: Dell Inc. PowerEdge R750/04V528, BIOS 1.6.5 04/15/2022
[ 6420.698729] Workqueue: ice ice_service_task [ice]
[ 6420.703462] RIP: 0010:ice_vsi_is_rx_queue_active+0x2d/0x60 [ice]
[ 6420.705860] ice 0000:ca:00.0: VF 0 is now untrusted
[ 6420.709494] Code: 00 00 66 83 bf 76 04 00 00 00 48 8b 77 10 74 3e 31 c0 eb 0f 0f b7 97 76 04 00 00 48 83 c0 01 39 c2 7e 2b 48 8b 97 68 04 00 00 <0f> b7 0c 42 48 8b 96 20 13 00 00 48 8d 94 8a 00 00 12 00 8b 12 83
[ 6420.714426] ice 0000:ca:00.0 ens7f0: Setting MAC 22:22:22:22:22:00 on VF 0. VF driver will be reinitialized
[ 6420.733120] RSP: 0018:ff778d2ff383fdd8 EFLAGS: 00010246
[ 6420.733123] RAX: 0000000000000000 RBX: ff2acf1916294000 RCX: 0000000000000000
[ 6420.733125] RDX: 0000000000000000 RSI: ff2acf1f2c6401a0 RDI: ff2acf1a27301828
[ 6420.762346] RBP: ff2acf1a27301828 R08: 0000000000000010 R09: 0000000000001000
[ 6420.769476] R10: ff2acf1916286000 R11: 00000000019eba3f R12: ff2acf19066460d0
[ 6420.776611] R13: ff2acf1f2c6401a0 R14: ff2acf1f2c6401a0 R15: 00000000ffffffff
[ 6420.783742] FS:  0000000000000000(0000) GS:ff2acf28ffa80000(0000) knlGS:0000000000000000
[ 6420.791829] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 6420.797575] CR2: 0000000000000000 CR3: 00000016ad410003 CR4: 0000000000773ee0
[ 6420.804708] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 6420.811034] vfio-pci 0000:ca:01.0: enabling device (0000 -> 0002)
[ 6420.811840] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 6420.811841] PKRU: 55555554
[ 6420.811842] Call Trace:
[ 6420.811843]  <TASK>
[ 6420.811844]  ice_reset_vf+0x9a/0x450 [ice]
[ 6420.811876]  ice_process_vflr_event+0x8f/0xc0 [ice]
[ 6420.841343]  ice_service_task+0x23b/0x600 [ice]
[ 6420.845884]  ? __schedule+0x212/0x550
[ 6420.849550]  process_one_work+0x1e2/0x3b0
[ 6420.853563]  ? rescuer_thread+0x390/0x390
[ 6420.857577]  worker_thread+0x50/0x3a0
[ 6420.861242]  ? rescuer_thread+0x390/0x390
[ 6420.865253]  kthread+0xdd/0x100
[ 6420.868400]  ? kthread_complete_and_exit+0x20/0x20
[ 6420.873194]  ret_from_fork+0x1f/0x30
[ 6420.876774]  </TASK>
[ 6420.878967] Modules linked in: vfio_pci vfio_pci_core vfio_iommu_type1 vfio iavf vhost_net vhost vhost_iotlb tap tun xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT nf_reject_ipv4 nft_compat nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nft_counter nf_tables bridge stp llc sctp ip6_udp_tunnel udp_tunnel nfp tls nfnetlink bluetooth mlx4_en mlx4_core rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache netfs rfkill sunrpc intel_rapl_msr intel_rapl_common i10nm_edac nfit libnvdimm ipmi_ssif x86_pkg_temp_thermal intel_powerclamp coretemp irdma kvm_intel i40e kvm iTCO_wdt dcdbas ib_uverbs irqbypass iTCO_vendor_support mgag200 mei_me ib_core dell_smbios isst_if_mmio isst_if_mbox_pci rapl i2c_algo_bit drm_shmem_helper intel_cstate drm_kms_helper syscopyarea sysfillrect isst_if_common sysimgblt intel_uncore fb_sys_fops dell_wmi_descriptor wmi_bmof intel_vsec mei i2c_i801 acpi_ipmi ipmi_si i2c_smbus ipmi_devintf intel_pch_thermal acpi_power_meter pcspk
 r

Fixes: efe4186000 ("ice: Fix memory corruption in VF driver")
Fixes: f23df5220d ("ice: Fix spurious interrupt during removal of trusted VF")
Signed-off-by: Petr Oros <poros@redhat.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2023-08-21 09:27:02 -07:00
..
ice_adminq_cmd.h ice: update ICE_PHY_TYPE_HIGH_MAX_INDEX 2023-05-17 08:38:22 -07:00
ice_arfs.c ice: add individual interrupt allocation 2023-05-16 09:38:38 -07:00
ice_arfs.h
ice_base.c ice: fix receive buffer size miscalculation 2023-08-21 09:19:47 -07:00
ice_base.h
ice_cgu_regs.h
ice_common.c ice: Remove managed memory usage in ice_get_fw_log_cfg() 2023-06-22 11:14:24 -07:00
ice_common.h ice: make writes to /dev/gnssX synchronous 2023-06-07 10:51:58 +01:00
ice_controlq.c ice: remove null checks before devm_kfree() calls 2023-06-22 10:30:34 -07:00
ice_controlq.h ice: reduce initial wait for control queue messages 2023-06-22 10:23:44 -07:00
ice_dcb_lib.c ice: Fix undersized tx_flags variable 2023-05-12 09:27:44 +01:00
ice_dcb_lib.h ice: Prevent set_channel from changing queues while RDMA active 2023-01-27 11:32:18 -08:00
ice_dcb_nl.c
ice_dcb_nl.h
ice_dcb.c ice: Fix DSCP PFC TLV creation 2023-03-07 13:02:01 -08:00
ice_dcb.h ice: Handle LLDP MIB Pending change 2023-01-19 08:18:03 -08:00
ice_ddp.c ice: Move support DDP code out of ice_flex_pipe.c 2023-01-19 08:18:03 -08:00
ice_ddp.h overflow: Add struct_size_t() helper 2023-05-26 13:52:19 -07:00
ice_devids.h ice: support features on new E810T variants 2022-09-28 11:40:57 -07:00
ice_devlink.c devlink: move port_split/unsplit() ops into devlink_port_ops 2023-05-30 10:32:20 -07:00
ice_devlink.h ice: Prevent ADQ, DCB coexistence with Custom Tx scheduler 2022-11-17 21:41:28 -08:00
ice_eswitch.c ice: Block switchdev mode when ADQ is active and vice versa 2023-08-17 11:55:40 -07:00
ice_eswitch.h ice: use src VSI instead of src MAC in slow-path 2023-05-19 09:10:39 -07:00
ice_ethtool_fdir.c ice: Fix memory management in ice_ethtool_fdir.c 2023-07-24 17:07:51 -07:00
ice_ethtool.c ice: prevent NULL pointer deref during reload 2023-07-14 09:56:20 -07:00
ice_ethtool.h ice: update PHY type to ethtool link mode mapping 2023-05-17 08:43:01 -07:00
ice_fdir.c
ice_fdir.h
ice_flex_pipe.c ice: Reduce scope of variables 2023-01-19 08:18:03 -08:00
ice_flex_pipe.h ice: Move support DDP code out of ice_flex_pipe.c 2023-01-19 08:18:03 -08:00
ice_flex_type.h ice: Move support DDP code out of ice_flex_pipe.c 2023-01-19 08:18:03 -08:00
ice_flow.c ice: remove null checks before devm_kfree() calls 2023-06-22 10:30:34 -07:00
ice_flow.h
ice_fltr.c ice: sync netdev filters after clearing VSI 2023-02-03 09:54:18 -08:00
ice_fltr.h
ice_fw_update.c
ice_fw_update.h
ice_gnss.c ice: Don't dereference NULL in ice_gnss_read error path 2023-06-08 08:38:56 -07:00
ice_gnss.h ice: make writes to /dev/gnssX synchronous 2023-06-07 10:51:58 +01:00
ice_hw_autogen.h ice: Add support Flex RXD 2022-10-27 13:23:43 +02:00
ice_idc_int.h
ice_idc.c ice: add dynamic interrupt allocation 2023-05-16 09:38:38 -07:00
ice_irq.c ice: add dynamic interrupt allocation 2023-05-16 09:38:38 -07:00
ice_irq.h ice: add dynamic interrupt allocation 2023-05-16 09:38:38 -07:00
ice_lag.c ice: Remove LAG+SRIOV mutual exclusion 2023-05-17 08:43:47 -07:00
ice_lag.h ice: Remove LAG+SRIOV mutual exclusion 2023-05-17 08:43:47 -07:00
ice_lan_tx_rx.h ice: Remove and replace ice speed defines with ethtool.h versions 2022-11-23 08:59:42 -08:00
ice_lib.c ice: Unregister netdev and devlink_port only once 2023-07-14 09:45:10 -07:00
ice_lib.h ice: track interrupt vectors with xarray 2023-05-16 09:38:38 -07:00
ice_main.c ice: Block switchdev mode when ADQ is active and vice versa 2023-08-17 11:55:40 -07:00
ice_nvm.c ice: Remove cppcheck suppressions 2023-01-19 08:18:03 -08:00
ice_nvm.h ice: Add additional flags to ice_nvm_write_activate 2022-08-24 08:45:54 -07:00
ice_osdep.h
ice_pf_vsi_vlan_ops.c
ice_pf_vsi_vlan_ops.h
ice_protocol_type.h ice: use src VSI instead of src MAC in slow-path 2023-05-19 09:10:39 -07:00
ice_ptp_consts.h
ice_ptp_hw.c ice: make Tx and Rx vernier offset calibration independent 2022-12-08 13:15:03 -08:00
ice_ptp_hw.h ice: make Tx and Rx vernier offset calibration independent 2022-12-08 13:15:03 -08:00
ice_ptp.c ice: introduce ICE_TX_TSTAMP_WORK enumeration 2023-06-08 10:20:12 -07:00
ice_ptp.h ice: introduce ICE_TX_TSTAMP_WORK enumeration 2023-06-08 10:20:12 -07:00
ice_repr.c ice: use src VSI instead of src MAC in slow-path 2023-05-19 09:10:39 -07:00
ice_repr.h ice: use src VSI instead of src MAC in slow-path 2023-05-19 09:10:39 -07:00
ice_sbq_cmd.h
ice_sched.c ice: remove null checks before devm_kfree() calls 2023-06-22 10:30:34 -07:00
ice_sched.h ice: Add an option to pre-allocate memory for ice_sched_node 2022-11-17 21:41:28 -08:00
ice_sriov.c Revert "ice: Fix ice VF reset during iavf initialization" 2023-08-21 09:25:59 -07:00
ice_sriov.h ice: move ice_is_malicious_vf() to ice_virtchnl.c 2023-03-13 11:06:06 -07:00
ice_switch.c ice: remove null checks before devm_kfree() calls 2023-06-22 10:30:34 -07:00
ice_switch.h ice: use src VSI instead of src MAC in slow-path 2023-05-19 09:10:39 -07:00
ice_tc_lib.c ice: Fix tx queue rate limit when TCs are configured 2023-07-05 09:29:37 -07:00
ice_tc_lib.h ice: Fix tx queue rate limit when TCs are configured 2023-07-05 09:29:37 -07:00
ice_trace.h
ice_txrx_lib.c ice: fix W=1 headers mismatch 2023-03-28 09:42:05 -07:00
ice_txrx_lib.h ice: Micro-optimize .ndo_xdp_xmit() path 2023-02-13 19:13:13 +01:00
ice_txrx.c ice: recycle/free all of the fragments from multi-buffer frame 2023-06-01 09:59:39 -07:00
ice_txrx.h ice: Fix undersized tx_flags variable 2023-05-12 09:27:44 +01:00
ice_type.h ice: move VF overflow message count into struct ice_mbx_vf_info 2023-03-13 10:32:32 -07:00
ice_vf_lib_private.h ice: introduce ice_vf_init_host_cfg function 2023-02-06 09:41:56 -08:00
ice_vf_lib.c ice: Fix NULL pointer deref during VF reset 2023-08-21 09:27:02 -07:00
ice_vf_lib.h Revert "ice: Fix ice VF reset during iavf initialization" 2023-08-21 09:25:59 -07:00
ice_vf_mbx.c ice: merge ice_mbx_report_malvf with ice_mbx_vf_state_handler 2023-03-13 11:00:10 -07:00
ice_vf_mbx.h ice: initialize mailbox snapshot earlier in PF init 2023-03-13 11:06:05 -07:00
ice_vf_vsi_vlan_ops.c ice: Fix disabling Rx VLAN filtering with port VLAN enabled 2023-02-06 15:13:02 -08:00
ice_vf_vsi_vlan_ops.h
ice_virtchnl_allowlist.c ice: Add support Flex RXD 2022-10-27 13:23:43 +02:00
ice_virtchnl_allowlist.h
ice_virtchnl_fdir.c ice: Reset FDIR counter in FDIR init stage 2023-04-04 08:34:52 -07:00
ice_virtchnl_fdir.h
ice_virtchnl.c Revert "ice: Fix ice VF reset during iavf initialization" 2023-08-21 09:25:59 -07:00
ice_virtchnl.h ice: call ice_is_malicious_vf() from ice_vc_process_vf_msg() 2023-03-13 11:06:06 -07:00
ice_vlan_mode.c ice: define meta data to match in switch 2023-05-19 08:57:43 -07:00
ice_vlan_mode.h
ice_vlan.h
ice_vsi_vlan_lib.c
ice_vsi_vlan_lib.h
ice_vsi_vlan_ops.c
ice_vsi_vlan_ops.h
ice_xsk.c ice: add individual interrupt allocation 2023-05-16 09:38:38 -07:00
ice_xsk.h ice: xsk: change batched Tx descriptor cleaning 2022-09-27 08:11:02 -07:00
ice.h ice: handle extts in the miscellaneous interrupt thread 2023-06-08 10:06:40 -07:00
Makefile ice: move interrupt related code to separate file 2023-05-16 09:16:53 -07:00