Skip to content

Commit 20d2d3b

Browse files
nhormankamalmostafa
authored andcommitted
vmxnet3: fix netpoll race condition
commit d25f06e upstream. vmxnet3's netpoll driver is incorrectly coded. It directly calls vmxnet3_do_poll, which is the driver internal napi poll routine. As the netpoll controller method doesn't block real napi polls in any way, there is a potential for race conditions in which the netpoll controller method and the napi poll method run concurrently. The result is data corruption causing panics such as this one recently observed: PID: 1371 TASK: ffff88023762caa0 CPU: 1 COMMAND: "rs:main Q:Reg" #0 [ffff88023abd5780] machine_kexec at ffffffff81038f3b #1 [ffff88023abd57e0] crash_kexec at ffffffff810c5d92 #2 [ffff88023abd58b0] oops_end at ffffffff8152b570 #3 [ffff88023abd58e0] die at ffffffff81010e0b hardkernel#4 [ffff88023abd5910] do_trap at ffffffff8152add4 hardkernel#5 [ffff88023abd5970] do_invalid_op at ffffffff8100cf95 hardkernel#6 [ffff88023abd5a10] invalid_op at ffffffff8100bf9b [exception RIP: vmxnet3_rq_rx_complete+1968] RIP: ffffffffa00f1e80 RSP: ffff88023abd5ac8 RFLAGS: 00010086 RAX: 0000000000000000 RBX: ffff88023b5dcee0 RCX: 00000000000000c0 RDX: 0000000000000000 RSI: 00000000000005f2 RDI: ffff88023b5dcee0 RBP: ffff88023abd5b48 R8: 0000000000000000 R9: ffff88023a3b6048 R10: 0000000000000000 R11: 0000000000000002 R12: ffff8802398d4cd8 R13: ffff88023af35140 R14: ffff88023b60c890 R15: 0000000000000000 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 hardkernel#7 [ffff88023abd5b50] vmxnet3_do_poll at ffffffffa00f204a [vmxnet3] hardkernel#8 [ffff88023abd5b80] vmxnet3_netpoll at ffffffffa00f209c [vmxnet3] hardkernel#9 [ffff88023abd5ba0] netpoll_poll_dev at ffffffff81472bb7 The fix is to do as other drivers do, and have the poll controller call the top half interrupt handler, which schedules a napi poll properly to recieve frames Tested by myself, successfully. Signed-off-by: Neil Horman <nhorman@tuxdriver.com> CC: Shreyas Bhatewara <sbhatewara@vmware.com> CC: "VMware, Inc." <pv-drivers@vmware.com> CC: "David S. Miller" <davem@davemloft.net> Reviewed-by: Shreyas N Bhatewara <sbhatewara@vmware.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Kamal Mostafa <kamal@canonical.com>
1 parent 35becb3 commit 20d2d3b

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

drivers/net/vmxnet3/vmxnet3_drv.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,12 +1751,18 @@ static void
17511751
vmxnet3_netpoll(struct net_device *netdev)
17521752
{
17531753
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
1754+
int i;
17541755

1755-
if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE)
1756-
vmxnet3_disable_all_intrs(adapter);
1757-
1758-
vmxnet3_do_poll(adapter, adapter->rx_queue[0].rx_ring[0].size);
1759-
vmxnet3_enable_all_intrs(adapter);
1756+
switch (adapter->intr.type) {
1757+
case VMXNET3_IT_MSIX:
1758+
for (i = 0; i < adapter->num_rx_queues; i++)
1759+
vmxnet3_msix_rx(0, &adapter->rx_queue[i]);
1760+
break;
1761+
case VMXNET3_IT_MSI:
1762+
default:
1763+
vmxnet3_intr(0, adapter->netdev);
1764+
break;
1765+
}
17601766

17611767
}
17621768
#endif /* CONFIG_NET_POLL_CONTROLLER */

0 commit comments

Comments
 (0)