-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tunneled LSO/CSO Support #614
base: master
Are you sure you want to change the base?
Conversation
Accidentally over-counted by the ETH header, and illumos is sending down chunks of size n×MSS. This would split one TSO packet into three (versus baseline two).
fbae192
to
3042e76
Compare
Needed for older propolis (falcon), which does not preallocate sufficient headroom for us to push into.
This makes sure that if we're receiving a packet which has benefited from real/pseudo GRO, viona is able to split it up if the guest can't actually take those packets.
Goodbye CI, I knew thee well.
Back to target perf.
At the very least, this compiles. We needed to regenerate `ip.rs`, on account of the many `extern` -> `unsafe extern` block changes.
CI on recent PRs is breaking, due to rustup 1.28.0+ no longer autoinstalling the correct rust toolchain version. This hurts us immediately since we have *two* toolchains (pinned nightly and stable), and deliberately specified the nightly for some tooling. This PR changes this over to use buildomat's auto-installation for the stable variant, and the new toolchain show -> install pattern for nightly. This also lets us place `$NIGHTLY` into most of our `cargo fmt` invocations, which should reduce the busywork in future compiler bumps for XDE.
@@ -0,0 +1,107 @@ | |||
// This Source Code Form is subject to the terms of the Mozilla Public |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Most of this file is moved out of port/mod.rs (formerly port.rs). The discussion of "opte:"
reserved keys and the use of INTERNAL_TARGET
are new.
@@ -204,7 +204,7 @@ impl DlsStream { | |||
/// but for now we pass only a single packet at a time. | |||
pub fn tx_drop_on_no_desc( | |||
&self, | |||
pkt: MsgBlk, | |||
pkt: impl AsMblk, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The AsMblk
changes here would ordinarily support later functionality like Tx/Rx of batches of packets (blocked on the flows rework, naturally). I've pulled it forward here because, strictly speaking, mac_hw_emul
can turn (1..n) packets into (0..m) packets even if we're only using it to emulate checksums one-at-a-time.
This PR makes use of in-progress illumos bits to detect common offloads between underlay devices, and advertises LSO/CSO capabilities on
opte
ports, relying illumos's emulation functionality to split packets and insert checksums if not oncxgbe
(or other compatible NIC).This allows for a few nice things:
Ultimately, we have control over the MSS we advertise to the NIC for LSO. The useful part of this is that when we know we are using a purely rack-internal path, we can elevate the MSS up to
MTU - overheads
. I've added a system of 'well-known'ActionMeta
KV pairs which allow for layers likeoverlay
to propagate this knowledge out. Given that the use of a larger MTU vastly reduces inbound packet rate on the receive half (the main bottleneck today), this gets us to around 8Gbps iPerf for rack-local traffic (and 17Gbps for two or more parallel streams) onglasgow
.On
dublin
with a full control plane, this resolves to around 4Gbps sled-to-sled and 14-Gbps sled-local between Linux VMs – we want to investigate the drop here once this is on dogfood. illumos as a guest doesn't do much better than before since it does not advertise GRO (illumos-as-host will fragment the packets) or LSO (it will never send TCP packets > MTU).Closes #328, closes #329.
Based on #688.