datapath: Break up GSO packets before sending to userspace.
authorBen Pfaff <blp@nicira.com>
Thu, 30 Apr 2009 20:46:44 +0000 (13:46 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 30 Apr 2009 20:46:44 +0000 (13:46 -0700)
commit62d3df93418f7b2bcfeef72e2159e0ac4076bdaf
treee9d7682d0dbf9987d5f478d56ecb144bdb44d619
parent7dda0ac981b62463f50ab3267a66d4d2222fc5dd
datapath: Break up GSO packets before sending to userspace.

On a Xen host, over-MTU GSO packets from virtual machines can end up sent
down by the virtual switch to userspace. This happens, for example, if a
TCP flow has a long enough "pause" that the datapath flow times out.  When
this happens, the packet is not marked as GSO when secchan sends it back up
via dpif_execute(), and the packet is then discarded in dp_xmit_skb() as
too large.

This commit solves the problem by breaking GSO packets into MTU-size pieces
before passing them along to userspace.

Tested by running "netperf" between two VMs on different boxes and running
"dpctl dp-del-flows" on the appropriate datapath a few times in the middle
and seeing that the total bandwidth didn't change much.  Verified that
packets were actually being broken up by adding a printk call inside the
"if (skb_is_gso())" block.

Thanks to Justin and Keith for review.

Bug #1133.
datapath/datapath.c