bnx2x_attn_int_deasserted3:4323 MC assert!
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
linux (Ubuntu) |
Fix Released
|
Undecided
|
Daniel Axtens | ||
Trusty |
Fix Released
|
Undecided
|
Unassigned | ||
Xenial |
Fix Released
|
Undecided
|
Unassigned | ||
Artful |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
SRU Justification
=================
A ppc64le system runs as a guest under PowerVM. This guest has a bnx2x card attached, and uses openvswitch to bridge an ibmveth interface for traffic from other LPARs.
We see the following crash sometimes when running netperf:
May 10 17:16:32 tuk6r1phn2 kernel: bnx2x: [bnx2x_
May 10 17:16:32 tuk6r1phn2 kernel: bnx2x: [bnx2x_
May 10 17:16:32 tuk6r1phn2 kernel: bnx2x: [bnx2x_
May 10 17:16:32 tuk6r1phn2 kernel: bnx2x: [bnx2x_
May 10 17:16:32 tuk6r1phn2 kernel: bnx2x: [bnx2x_
May 10 17:16:32 tuk6r1phn2 kernel: bnx2x: [bnx2x_
... (dump of registers follows) ...
Subsequent debugging reveals that the packets causing the issue come through the ibmveth interface - from the AIX LPAR. The veth protocol is 'special' - communication between LPARs on the same chassis can use very large (64k) frames to reduce overhead. Normal networks cannot handle such large packets, so traditionally, the VIOS partition would signal to the AIX partitions that it was 'special', and AIX would send regular, ethernet-sized packets to VIOS, which VIOS would then send out.
This signalling between VIOS and AIX is done in a way that is not standards-
In some cases (e.g. with TCP), multiple TCP segments are coalesced into one large packet. In Linux, this goes through the generic receive offload code, using a similar mechanism to GSO. These segments can be very large which presents as a very large MSS (maximum segment size) or gso_size.
Normally, the large packet is simply passed to whatever network application on Linux is going to consume it, and everything is OK.
However, in this case, the packets go through Open vSwitch, and are then passed to the bnx2x driver. The bnx2x driver/hardware supports TSO and GSO, but with a restriction: the maximum segment size is limited to around 9700 bytes. Normally this is more than adequate. However, if a large packet with very large (>9700 byte) TCP segments arrives through ibmveth, and is passed to bnx2x, the hardware will panic.
[Impact]
bnx2x card panics, requiring power cycle to restore functionality.
The workaround is turning off TSO, which prevents the crash as the kernel resegments *all* packets in software, not just ones that are too big. This has a performance cost.
[Fix]
Test packet size in bnx2x feature check path and disable GSO if it is too large. To do this we move a function from one file to another and add another in the networking core.
[Regression Potential]
A/B/X: The changes to the network core are easily reviewed. The changes to behaviour are limited to the bnx2x card driver.
The most likely failure case is a false-positive on the size check, which would lead to a performance regression only.
T: This also involves a different change to the networking core to add the old-style GSO checking, which is more invasive. However the changes are simple and easily reviewed.
description: | updated |
description: | updated |
description: | updated |
Changed in linux (Ubuntu Artful): | |
status: | New → Fix Committed |
Changed in linux (Ubuntu Xenial): | |
status: | New → Fix Committed |
Changed in linux (Ubuntu Trusty): | |
status: | New → Fix Committed |
tags: |
added: verification-done-xenial removed: verification-needed-xenial |
A set of 2 patches to fix this was accepted upstream:
https:/ /github. com/torvalds/ linux/commit/ 2b16f048729bf35 e6c28a40cbfad07 239f9dcd90 /github. com/torvalds/ linux/commit/ 8914a595110a6ec a69a5e275b323f5 d09e18f4f9
https:/
I will send an SRU shortly.