On Wed, Nov 16, 2022 at 7:43 AM Tobias Fiebig <tob...@fiebig.nl> wrote: > > Heho, > Just to keep you in the loop; Just applied the patch, but things didn't > really get better; I am currently doing a 'make clean; make' for good measure > (had built head first), and will also double-check that there is no > accidental use of system-qemu libs. > > If that still doesn't show an effect, I'll hold tcpdump to the wire again. > > With best regards, > Tobias
It might be also helpful to dump mss saw by Qemu to see if it really changes or differs a lot from 1500. Thanks > > -----Original Message----- > From: Stefan Hajnoczi <stefa...@redhat.com> > Sent: Tuesday, 15 November 2022 17:37 > To: qemu-devel@nongnu.org > Cc: jasow...@redhat.com; qemu-sta...@nongnu.org; Stefan Hajnoczi > <stefa...@redhat.com>; Russell King - ARM Linux <li...@armlinux.org.uk>; > Tobias Fiebig <tobias+...@fiebig.nl> > Subject: [PATCH for-7.2] rtl8139: honor large send MSS value > > The Large-Send Task Offload Tx Descriptor (9.2.1 Transmit) has a Large-Send > MSS value where the driver specifies the MSS. See the datasheet here: > http://realtek.info/pdf/rtl8139cp.pdf > > The code ignores this value and uses a hardcoded MSS of 1500 bytes instead. > When the MTU is less than 1500 bytes the hardcoded value results in IP > fragmentation and poor performance. > > Use the Large-Send MSS value to correctly size Large-Send packets. > > This issue was discussed in the past here: > https://lore.kernel.org/all/20161114162505.GD26664@stefanha-x1.localdomain/ > > Reported-by: Russell King - ARM Linux <li...@armlinux.org.uk> > Reported-by: Tobias Fiebig <tobias+...@fiebig.nl> > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1312 > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > --- > hw/net/rtl8139.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > Tobias: Please test this fix. Thanks! > > diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c index e6643e3c9d..ecc4dcb07f > 100644 > --- a/hw/net/rtl8139.c > +++ b/hw/net/rtl8139.c > @@ -77,7 +77,6 @@ > ( ( input ) & ( size - 1 ) ) > > #define ETHER_TYPE_LEN 2 > -#define ETH_MTU 1500 > > #define VLAN_TCI_LEN 2 > #define VLAN_HLEN (ETHER_TYPE_LEN + VLAN_TCI_LEN) @@ -2151,8 +2150,8 @@ > static int rtl8139_cplus_transmit_one(RTL8139State *s) > > int large_send_mss = (txdw0 >> 16) & CP_TC_LGSEN_MSS_MASK; > > - DPRINTF("+++ C+ mode offloaded task TSO MTU=%d IP data %d " > - "frame data %d specified MSS=%d\n", ETH_MTU, > + DPRINTF("+++ C+ mode offloaded task TSO IP data %d " > + "frame data %d specified MSS=%d\n", > ip_data_len, saved_size - ETH_HLEN, large_send_mss); > > int tcp_send_offset = 0; @@ -2177,9 +2176,13 @@ static int > rtl8139_cplus_transmit_one(RTL8139State *s) > goto skip_offload; > } > > - /* ETH_MTU = ip header len + tcp header len + payload */ > + /* MSS too small? */ > + if (tcp_hlen + hlen >= large_send_mss) { > + goto skip_offload; > + } > + > int tcp_data_len = ip_data_len - tcp_hlen; > - int tcp_chunk_size = ETH_MTU - hlen - tcp_hlen; > + int tcp_chunk_size = large_send_mss - hlen - tcp_hlen; > > DPRINTF("+++ C+ mode TSO IP data len %d TCP hlen %d TCP " > "data len %d TCP chunk size %d\n", ip_data_len, > -- > 2.38.1 > >