ixgbe can do unnecessary allocations during tx
ixgbe_ring_tx, when LSO is active it may allocate and move around new mblk_ts based on the dblk_t alignment in order to get all of the headers (ethernet, IP, TCP/UDP) into a single aligned mblk_t. However, it then sets the copy threshold to the size of all the combined headers. This means the dblk_ts containing the headers (after all the shuffling) are not mapped to the device, but instead are copied into an already mapped buffer.
All of this shuffling also greatly complicates the TX code, making it hard to analyze or make changes, and is ultimately unnecessary -- we can copy the headers directly from their existing dblk_ts into an already mapped buffer and forgo the
allocb() calls, and then proceed as we currently do with the remaining contents of the packet. It also allows us to drastically simplify the logic in