* [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero.
@ 2021-08-09 12:50 Ken Cox
2021-08-09 14:22 ` Venkataramanan, Anirudh
2021-08-11 8:27 ` Szlosek, Marek
0 siblings, 2 replies; 5+ messages in thread
From: Ken Cox @ 2021-08-09 12:50 UTC (permalink / raw)
To: intel-wired-lan
It is possible to disable VFs while the PF driver is processing requests
from the VF driver. This can result in a panic.
BUG: unable to handle kernel paging request at 000000000000106c
PGD 0 P4D 0
Oops: 0000 [#1] SMP NOPTI
CPU: 8 PID: 0 Comm: swapper/8 Kdump: loaded Tainted: G I --------- - -
Hardware name: Dell Inc. PowerEdge R740/06WXJT, BIOS 2.8.2 08/27/2020
RIP: 0010:ixgbe_msg_task+0x4c8/0x1690 [ixgbe]
Code: 00 00 48 8d 04 40 48 c1 e0 05 89 7c 24 24 89 fd 48 89 44 24 10 83 ff 01 0f 84 b8 04 00 00 4c 8b 64 24 10 4d 03 a5 48 22 00 00 <41> 80 7c 24 4c 00 0f 84 8a 03 00 00 0f b7 c7 83 f8 08 0f 84 8f 0a
RSP: 0018:ffffb337869f8df8 EFLAGS: 00010002
RAX: 0000000000001020 RBX: 0000000000000000 RCX: 000000000000002b
RDX: 0000000000000002 RSI: 0000000000000008 RDI: 0000000000000006
RBP: 0000000000000006 R08: 0000000000000002 R09: 0000000000029780
R10: 00006957d8f42832 R11: 0000000000000000 R12: 0000000000001020
R13: ffff8a00e8978ac0 R14: 000000000000002b R15: ffff8a00e8979c80
FS: 0000000000000000(0000) GS:ffff8a07dfd00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000000000000106c CR3: 0000000063e10004 CR4: 00000000007726e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
PKRU: 55555554
Call Trace:
<IRQ>
? ttwu_do_wakeup+0x19/0x140
? try_to_wake_up+0x1cd/0x550
? ixgbevf_update_xcast_mode+0x71/0xc0 [ixgbevf]
ixgbe_msix_other+0x17e/0x310 [ixgbe]
__handle_irq_event_percpu+0x40/0x180
handle_irq_event_percpu+0x30/0x80
handle_irq_event+0x36/0x53
handle_edge_irq+0x82/0x190
handle_irq+0x1c/0x30
do_IRQ+0x49/0xd0
common_interrupt+0xf/0xf
This can be eventually be reproduced with the following script:
while :
do
echo 63 > /sys/class/net/ens3f0/device/sriov_numvfs
sleep 1
echo 0 > /sys/class/net/ens3f0/device/sriov_numvfs
sleep 1
done
Signed-off-by: Ken Cox <jkc@redhat.com>
---
drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 +
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 9 +++++++++
2 files changed, 10 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index a604552fa634..696bb2a61ea7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -807,6 +807,7 @@ enum ixgbe_state_t {
__IXGBE_PTP_RUNNING,
__IXGBE_PTP_TX_IN_PROGRESS,
__IXGBE_RESET_REQUESTED,
+ __IXGBE_DISABLING_VFS,
};
struct ixgbe_cb {
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index 214a38de3f41..e2df7729876d 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -206,8 +206,12 @@ int ixgbe_disable_sriov(struct ixgbe_adapter *adapter)
unsigned int num_vfs = adapter->num_vfs, vf;
int rss;
+ while (test_and_set_bit(__IXGBE_DISABLING_VFS, &adapter->state))
+ usleep_range(1000, 2000);
+
/* set num VFs to 0 to prevent access to vfinfo */
adapter->num_vfs = 0;
+ clear_bit(__IXGBE_DISABLING_VFS, &adapter->state);
/* put the reference to all of the vf devices */
for (vf = 0; vf < num_vfs; ++vf) {
@@ -1292,6 +1296,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
return retval;
}
+
static void ixgbe_rcv_ack_from_vf(struct ixgbe_adapter *adapter, u32 vf)
{
struct ixgbe_hw *hw = &adapter->hw;
@@ -1307,6 +1312,9 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)
struct ixgbe_hw *hw = &adapter->hw;
u32 vf;
+ if (test_and_set_bit(__IXGBE_DISABLING_VFS, &adapter->state))
+ return;
+
for (vf = 0; vf < adapter->num_vfs; vf++) {
/* process any reset requests */
if (!ixgbe_check_for_rst(hw, vf))
@@ -1320,6 +1328,7 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)
if (!ixgbe_check_for_ack(hw, vf))
ixgbe_rcv_ack_from_vf(adapter, vf);
}
+ clear_bit(__IXGBE_DISABLING_VFS, &adapter->state);
}
void ixgbe_disable_tx_rx(struct ixgbe_adapter *adapter)
--
2.26.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero.
2021-08-09 12:50 [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero Ken Cox
@ 2021-08-09 14:22 ` Venkataramanan, Anirudh
2021-08-11 8:27 ` Szlosek, Marek
1 sibling, 0 replies; 5+ messages in thread
From: Venkataramanan, Anirudh @ 2021-08-09 14:22 UTC (permalink / raw)
To: intel-wired-lan
On Mon, 2021-08-09 at 07:50 -0500, Ken Cox wrote:
> It is possible to disable VFs while the PF driver is processing
> requests
> from the VF driver.? This can result in a panic.
>
> BUG: unable to handle kernel paging request at 000000000000106c
> PGD 0 P4D 0
> Oops: 0000 [#1] SMP NOPTI
> CPU: 8 PID: 0 Comm: swapper/8 Kdump: loaded Tainted: G????????? I?????
> --------- -? -
> Hardware name: Dell Inc. PowerEdge R740/06WXJT, BIOS 2.8.2 08/27/2020
> RIP: 0010:ixgbe_msg_task+0x4c8/0x1690 [ixgbe]
> Code: 00 00 48 8d 04 40 48 c1 e0 05 89 7c 24 24 89 fd 48 89 44 24 10 83
> ff 01 0f 84 b8 04 00 00 4c 8b 64 24 10 4d 03 a5 48 22 00 00 <41> 80 7c
> 24 4c 00 0f 84 8a 03 00 00 0f b7 c7 83 f8 08 0f 84 8f 0a
> RSP: 0018:ffffb337869f8df8 EFLAGS: 00010002
> RAX: 0000000000001020 RBX: 0000000000000000 RCX: 000000000000002b
> RDX: 0000000000000002 RSI: 0000000000000008 RDI: 0000000000000006
> RBP: 0000000000000006 R08: 0000000000000002 R09: 0000000000029780
> R10: 00006957d8f42832 R11: 0000000000000000 R12: 0000000000001020
> R13: ffff8a00e8978ac0 R14: 000000000000002b R15: ffff8a00e8979c80
> FS:? 0000000000000000(0000) GS:ffff8a07dfd00000(0000)
> knlGS:0000000000000000
> CS:? 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 000000000000106c CR3: 0000000063e10004 CR4: 00000000007726e0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> PKRU: 55555554
> Call Trace:
> ?<IRQ>
> ?? ttwu_do_wakeup+0x19/0x140
> ?? try_to_wake_up+0x1cd/0x550
> ?? ixgbevf_update_xcast_mode+0x71/0xc0 [ixgbevf]
> ?ixgbe_msix_other+0x17e/0x310 [ixgbe]
> ?__handle_irq_event_percpu+0x40/0x180
> ?handle_irq_event_percpu+0x30/0x80
> ?handle_irq_event+0x36/0x53
> ?handle_edge_irq+0x82/0x190
> ?handle_irq+0x1c/0x30
> ?do_IRQ+0x49/0xd0
> ?common_interrupt+0xf/0xf
>
> This can be eventually be reproduced with the following script:
>
> while :
> do
> ????????echo 63 > /sys/class/net/ens3f0/device/sriov_numvfs
> ????????sleep 1
> ????????echo 0 > /sys/class/net/ens3f0/device/sriov_numvfs
> ??????? sleep 1
> done
>
> Signed-off-by: Ken Cox <jkc@redhat.com>
> ---
> ?drivers/net/ethernet/intel/ixgbe/ixgbe.h?????? | 1 +
> ?drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 9 +++++++++
> ?2 files changed, 10 insertions(+)
>
Acked-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero.
2021-08-09 12:50 [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero Ken Cox
2021-08-09 14:22 ` Venkataramanan, Anirudh
@ 2021-08-11 8:27 ` Szlosek, Marek
1 sibling, 0 replies; 5+ messages in thread
From: Szlosek, Marek @ 2021-08-11 8:27 UTC (permalink / raw)
To: intel-wired-lan
It is possible to disable VFs while the PF driver is processing requests from the VF driver. This can result in a panic.
BUG: unable to handle kernel paging request at 000000000000106c PGD 0 P4D 0
Oops: 0000 [#1] SMP NOPTI
CPU: 8 PID: 0 Comm: swapper/8 Kdump: loaded Tainted: G I --------- - -
Hardware name: Dell Inc. PowerEdge R740/06WXJT, BIOS 2.8.2 08/27/2020
RIP: 0010:ixgbe_msg_task+0x4c8/0x1690 [ixgbe]
Code: 00 00 48 8d 04 40 48 c1 e0 05 89 7c 24 24 89 fd 48 89 44 24 10 83 ff 01 0f 84 b8 04 00 00 4c 8b 64 24 10 4d 03 a5 48 22 00 00 <41> 80 7c 24 4c 00 0f 84 8a 03 00 00 0f b7 c7 83 f8 08 0f 84 8f 0a
RSP: 0018:ffffb337869f8df8 EFLAGS: 00010002
RAX: 0000000000001020 RBX: 0000000000000000 RCX: 000000000000002b
RDX: 0000000000000002 RSI: 0000000000000008 RDI: 0000000000000006
RBP: 0000000000000006 R08: 0000000000000002 R09: 0000000000029780
R10: 00006957d8f42832 R11: 0000000000000000 R12: 0000000000001020
R13: ffff8a00e8978ac0 R14: 000000000000002b R15: ffff8a00e8979c80
FS: 0000000000000000(0000) GS:ffff8a07dfd00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000000000000106c CR3: 0000000063e10004 CR4: 00000000007726e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
PKRU: 55555554
Call Trace:
<IRQ>
? ttwu_do_wakeup+0x19/0x140
? try_to_wake_up+0x1cd/0x550
? ixgbevf_update_xcast_mode+0x71/0xc0 [ixgbevf]
ixgbe_msix_other+0x17e/0x310 [ixgbe]
__handle_irq_event_percpu+0x40/0x180
handle_irq_event_percpu+0x30/0x80
handle_irq_event+0x36/0x53
handle_edge_irq+0x82/0x190
handle_irq+0x1c/0x30
do_IRQ+0x49/0xd0
common_interrupt+0xf/0xf
This can be eventually be reproduced with the following script:
while :
do
echo 63 > /sys/class/net/ens3f0/device/sriov_numvfs
sleep 1
echo 0 > /sys/class/net/ens3f0/device/sriov_numvfs
sleep 1
done
Signed-off-by: Ken Cox <jkc@redhat.com>
---
drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 +
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 9 +++++++++
2 files changed, 10 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index a604552fa634..696bb2a61ea7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -807,6 +807,7 @@ enum ixgbe_state_t {
__IXGBE_PTP_RUNNING,
__IXGBE_PTP_TX_IN_PROGRESS,
__IXGBE_RESET_REQUESTED,
+ __IXGBE_DISABLING_VFS,
};
struct ixgbe_cb {
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index 214a38de3f41..e2df7729876d 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -206,8 +206,12 @@ int ixgbe_disable_sriov(struct ixgbe_adapter *adapter)
unsigned int num_vfs = adapter->num_vfs, vf;
int rss;
+ while (test_and_set_bit(__IXGBE_DISABLING_VFS, &adapter->state))
+ usleep_range(1000, 2000);
+
/* set num VFs to 0 to prevent access to vfinfo */
adapter->num_vfs = 0;
+ clear_bit(__IXGBE_DISABLING_VFS, &adapter->state);
/* put the reference to all of the vf devices */
for (vf = 0; vf < num_vfs; ++vf) {
@@ -1292,6 +1296,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
return retval;
}
+
static void ixgbe_rcv_ack_from_vf(struct ixgbe_adapter *adapter, u32 vf) {
struct ixgbe_hw *hw = &adapter->hw;
@@ -1307,6 +1312,9 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)
struct ixgbe_hw *hw = &adapter->hw;
u32 vf;
+ if (test_and_set_bit(__IXGBE_DISABLING_VFS, &adapter->state))
+ return;
+
for (vf = 0; vf < adapter->num_vfs; vf++) {
/* process any reset requests */
if (!ixgbe_check_for_rst(hw, vf))
@@ -1320,6 +1328,7 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)
if (!ixgbe_check_for_ack(hw, vf))
ixgbe_rcv_ack_from_vf(adapter, vf);
}
+ clear_bit(__IXGBE_DISABLING_VFS, &adapter->state);
}
void ixgbe_disable_tx_rx(struct ixgbe_adapter *adapter)
--
2.26.3
Tested-by: Marek Szlosek <marek.szlosek@intel.com>
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero
2021-11-17 10:46 Radoslaw Tyl
@ 2021-12-12 13:13 ` Jankowski, Konrad0
0 siblings, 0 replies; 5+ messages in thread
From: Jankowski, Konrad0 @ 2021-12-12 13:13 UTC (permalink / raw)
To: intel-wired-lan
Still is Call trace:
[ +0.000004] WARNING: CPU: 48 PID: 9330 at kernel/softirq.c:362 __local_bh_enable_ip+0x68/0x70
[ +0.000015] Modules linked in: ixgbevf(+) xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT nf_reject_ipv4 nft_compat nft_counter nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables nfnetlink tun intel_rapl_msr sd_mod t10_pi sg intel_rapl_common amd64_edac edac_mce_amd kvm_amd kvm irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel rapl pcspkr wmi_bmof ahci libahci i40e libata joydev ipmi_ssif ccp sp5100_tco k10temp i2c_piix4 acpi_ipmi ipmi_si ipmi_devintf ipmi_msghandler acpi_power_meter ip_tables rpcsec_gss_krb5 bridge stp llc rfkill drm_kms_helper syscopyarea sysfillrect sysimgblt ixgbe fb_sys_fops mdio drm tg3 dca i2c_algo_bit wmi sctp libcrc32c crc32c_intel ip6_udp_tunnel udp_tunnel fuse
[ +0.000063] CPU: 48 PID: 9330 Comm: systemd-udevd Kdump: loaded Not tainted 5.16.0-rc4_next-queue_dev-queue-01129-gac735b4b67a1 #1
[ +0.000004] Hardware name: Dell Inc. PowerEdge R7525/0590KW, BIOS 2.2.5 04/08/2021
[ +0.000005] RIP: 0010:__local_bh_enable_ip+0x68/0x70
[ +0.000004] Code: 85 c0 75 05 e8 60 d4 f1 ff c3 48 c7 c7 0e 0d 24 9d e8 cc 5f a4 00 65 66 8b 05 54 b1 14 64 66 85 c0 74 cc e8 0a ff ff ff eb c5 <0f> 0b eb a7 0f 1f 40 00 0f 1f 44 00 00 53 bf 00 00 01 00 e8 b0 b7
[ +0.000002] RSP: 0018:ffffb1860d3c0e00 EFLAGS: 00010006
[ +0.000002] RAX: 0000000080010202 RBX: 000000000000003f RCX: 000000000000000e
[ +0.000003] RDX: 0000000000000003 RSI: 0000000000000201 RDI: ffffffffc0501e95
[ +0.000001] RBP: 0000000000000001 R08: 0000000080000000 R09: 0000000000000000
[ +0.000001] R10: 0000000000000000 R11: ffffb1860d3c0ad0 R12: 0000000000000002
[ +0.000002] R13: 000000000000003f R14: ffff9fbcd09fca40 R15: ffff9fbcd09fdb80
[ +0.000001] FS: 00007ff5037a0180(0000) GS:ffff9fd45f800000(0000) knlGS:0000000000000000
[ +0.000003] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ +0.000001] CR2: 0000555fda5f6d00 CR3: 00000018a4aee000 CR4: 0000000000350ee0
[ +0.000002] Call Trace:
[ +0.000009] <IRQ>
[ +0.000007] ixgbe_msg_task+0x4a5/0x15c0 [ixgbe]
[ +0.000058] ixgbe_msix_other+0x15d/0x2e0 [ixgbe]
[ +0.000011] __handle_irq_event_percpu+0x39/0x180
[ +0.000007] handle_irq_event_percpu+0x30/0x70
[ +0.000002] handle_irq_event+0x34/0x60
[ +0.000003] handle_edge_irq+0x9a/0x1c0
[ +0.000006] __common_interrupt+0x65/0x100
[ +0.000004] common_interrupt+0xb4/0xd0
[ +0.000007] </IRQ>
[ +0.000001] <TASK>
[ +0.000001] asm_common_interrupt+0x1e/0x40
[ +0.000009] RIP: 0010:sha256_ni_transform+0x4e/0x330
[ +0.000008] Code: 66 0f 3a 0f ca 08 66 0f 3a 0e d7 f0 66 44 0f 6f 05 e7 fc 2a 01 48 8d 05 e0 fb 2a 01 66 44 0f 6f c9 66 44 0f 6f d2 f3 0f 6f 06 <66> 41 0f 38 00 c0 66 0f 6f d8 66 0f fe 00 0f 38 cb d1 66 0f 70 c0
[ +0.000002] RSP: 0018:ffffb18622917b80 EFLAGS: 00000287
[ +0.000001] RAX: ffffffff9d17eb40 RBX: ffff9fbcd096b980 RCX: ffff9fbcd096b9b0
[ +0.000002] RDX: ffffb18627ec7140 RSI: ffffb18627c37440 RDI: ffff9fbcd096b988
[ +0.000001] RBP: ffff9fbcd096b988 R08: 0000000000000018 R09: 0000000000000000
[ +0.000002] R10: 000000000000000c R11: 0000000000000004 R12: ffff9fc3fbd10540
[ +0.000001] R13: ffffffff9becef20 R14: 00000000003b4140 R15: ffffb18627b13000
[ +0.000001] ? sha256_ssse3_update+0x30/0x30
[ +0.000004] sha256_finup+0x27c/0x320
[ +0.000004] pkcs7_digest.isra.2+0xd8/0x250
[ +0.000009] pkcs7_verify+0x83/0x570
[ +0.000003] verify_pkcs7_message_sig+0x62/0x100
[ +0.000006] verify_pkcs7_signature+0x59/0x70
[ +0.000003] mod_verify_sig+0x84/0xb0
[ +0.000008] load_module+0x10f/0x1cb0
[ +0.000003] ? __kernel_read+0x150/0x2d0
[ +0.000007] ? kernel_read_file+0x25b/0x2d0
[ +0.000010] ? __do_sys_finit_module+0xaa/0x110
[ +0.000002] __do_sys_finit_module+0xaa/0x110
[ +0.000004] do_syscall_64+0x3a/0x80
[ +0.000003] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ +0.000003] RIP: 0033:0x7ff50238552d
[ +0.000004] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 2b 79 2c 00 f7 d8 64 89 01 48
[ +0.000002] RSP: 002b:00007ffc37e250b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ +0.000003] RAX: ffffffffffffffda RBX: 0000555fda5974d0 RCX: 00007ff50238552d
[ +0.000001] RDX: 0000000000000000 RSI: 00007ff502ef986d RDI: 0000000000000007
[ +0.000001] RBP: 00007ff502ef986d R08: 0000000000000000 R09: 00007ffc37e251e0
[ +0.000001] R10: 0000000000000007 R11: 0000000000000246 R12: 0000000000000000
[ +0.000001] R13: 0000555fda65e570 R14: 0000000000020000 R15: 0000000000000000
[ +0.000003] </TASK>
[ +0.000001] ---[ end trace 6eabda8081b2ba26 ]---
[ +0.008823] ixgbe 0000:a1:00.0 eth0: VF 0 requested invalid api version 6
[ +0.001006] ixgbevf 0000:a1:10.0: MAC address not assigned by administrator.
[ +0.000003] ixgbevf 0000:a1:10.0: Assigning random MAC address
[ +0.001449] ixgbevf 0000:a1:10.0: 8e:00:3e:e2:c7:17
[ +0.000003] ixgbevf 0000:a1:10.0: MAC: 1
[ +0.000001] ixgbevf 0000:a1:10.0: Intel(R) 82599 Virtual Function
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero
@ 2021-11-17 10:46 Radoslaw Tyl
2021-12-12 13:13 ` Jankowski, Konrad0
0 siblings, 1 reply; 5+ messages in thread
From: Radoslaw Tyl @ 2021-11-17 10:46 UTC (permalink / raw)
To: intel-wired-lan
It is possible to disable VFs while the PF driver is processing requests
from the VF driver. This can result in a panic.
BUG: unable to handle kernel paging request at 000000000000106c
PGD 0 P4D 0
Oops: 0000 [#1] SMP NOPTI
CPU: 8 PID: 0 Comm: swapper/8 Kdump: loaded Tainted: G I --------- -
Hardware name: Dell Inc. PowerEdge R740/06WXJT, BIOS 2.8.2 08/27/2020
RIP: 0010:ixgbe_msg_task+0x4c8/0x1690 [ixgbe]
Code: 00 00 48 8d 04 40 48 c1 e0 05 89 7c 24 24 89 fd 48 89 44 24 10 83 ff
01 0f 84 b8 04 00 00 4c 8b 64 24 10 4d 03 a5 48 22 00 00 <41> 80 7c 24 4c
00 0f 84 8a 03 00 00 0f b7 c7 83 f8 08 0f 84 8f 0a
RSP: 0018:ffffb337869f8df8 EFLAGS: 00010002
RAX: 0000000000001020 RBX: 0000000000000000 RCX: 000000000000002b
RDX: 0000000000000002 RSI: 0000000000000008 RDI: 0000000000000006
RBP: 0000000000000006 R08: 0000000000000002 R09: 0000000000029780
R10: 00006957d8f42832 R11: 0000000000000000 R12: 0000000000001020
R13: ffff8a00e8978ac0 R14: 000000000000002b R15: ffff8a00e8979c80
FS: 0000000000000000(0000) GS:ffff8a07dfd00000(0000) knlGS:00000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000000000000106c CR3: 0000000063e10004 CR4: 00000000007726e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
PKRU: 55555554
Call Trace:
<IRQ>
? ttwu_do_wakeup+0x19/0x140
? try_to_wake_up+0x1cd/0x550
? ixgbevf_update_xcast_mode+0x71/0xc0 [ixgbevf]
ixgbe_msix_other+0x17e/0x310 [ixgbe]
__handle_irq_event_percpu+0x40/0x180
handle_irq_event_percpu+0x30/0x80
handle_irq_event+0x36/0x53
handle_edge_irq+0x82/0x190
handle_irq+0x1c/0x30
do_IRQ+0x49/0xd0
common_interrupt+0xf/0xf
This can be eventually be reproduced with the following script:
while :
do
echo 63 > /sys/class/net/<devname>/device/sriov_numvfs
sleep 1
echo 0 > /sys/class/net/<devname>/device/sriov_numvfs
sleep 1
done
Add lock when disabling SR-IOV to prevent process VF mailbox communication.
Signed-off-by: Radoslaw Tyl <radoslawx.tyl@intel.com>
---
drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 +
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 3 +++
.../net/ethernet/intel/ixgbe/ixgbe_sriov.c | 26 ++++++++++++-------
3 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 4a69823e6a..bf496fa754 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -773,6 +773,7 @@ struct ixgbe_adapter {
#ifdef CONFIG_IXGBE_IPSEC
struct ixgbe_ipsec *ipsec;
#endif /* CONFIG_IXGBE_IPSEC */
+ spinlock_t vfs_lock;
};
static inline int ixgbe_determine_xdp_q_idx(int cpu)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 0f9f022260..5faeb76897 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -6398,6 +6398,9 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,
/* n-tuple support exists, always init our spinlock */
spin_lock_init(&adapter->fdir_perfect_lock);
+ /* init spinlock to avoid concurrency of VF resources */
+ spin_lock_init(&adapter->vfs_lock);
+
#ifdef CONFIG_IXGBE_DCB
ixgbe_init_dcb(adapter);
#endif
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index 214a38de3f..5c7ff18f1b 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -206,6 +206,7 @@ int ixgbe_disable_sriov(struct ixgbe_adapter *adapter)
unsigned int num_vfs = adapter->num_vfs, vf;
int rss;
+ spin_lock_bh(&adapter->vfs_lock);
/* set num VFs to 0 to prevent access to vfinfo */
adapter->num_vfs = 0;
@@ -226,6 +227,7 @@ int ixgbe_disable_sriov(struct ixgbe_adapter *adapter)
/* free macvlan list */
kfree(adapter->mv_list);
adapter->mv_list = NULL;
+ spin_unlock_bh(&adapter->vfs_lock);
/* if SR-IOV is already disabled then there is nothing to do */
if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))
@@ -1307,19 +1309,23 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)
struct ixgbe_hw *hw = &adapter->hw;
u32 vf;
- for (vf = 0; vf < adapter->num_vfs; vf++) {
- /* process any reset requests */
- if (!ixgbe_check_for_rst(hw, vf))
- ixgbe_vf_reset_event(adapter, vf);
+ spin_lock_bh(&adapter->vfs_lock);
+ if (adapter->vfinfo) {
+ for (vf = 0; vf < adapter->num_vfs; vf++) {
+ /* process any reset requests */
+ if (!ixgbe_check_for_rst(hw, vf))
+ ixgbe_vf_reset_event(adapter, vf);
- /* process any messages pending */
- if (!ixgbe_check_for_msg(hw, vf))
- ixgbe_rcv_msg_from_vf(adapter, vf);
+ /* process any messages pending */
+ if (!ixgbe_check_for_msg(hw, vf))
+ ixgbe_rcv_msg_from_vf(adapter, vf);
- /* process any acks */
- if (!ixgbe_check_for_ack(hw, vf))
- ixgbe_rcv_ack_from_vf(adapter, vf);
+ /* process any acks */
+ if (!ixgbe_check_for_ack(hw, vf))
+ ixgbe_rcv_ack_from_vf(adapter, vf);
+ }
}
+ spin_unlock_bh(&adapter->vfs_lock);
}
void ixgbe_disable_tx_rx(struct ixgbe_adapter *adapter)
--
2.27.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-12-12 13:13 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-09 12:50 [Intel-wired-lan] [PATCH] ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero Ken Cox
2021-08-09 14:22 ` Venkataramanan, Anirudh
2021-08-11 8:27 ` Szlosek, Marek
2021-11-17 10:46 Radoslaw Tyl
2021-12-12 13:13 ` Jankowski, Konrad0
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.