[dpdk-dev] [PATCH RFC 00/11] ixgbe/mbuf: add TSO support

Olivier Matz olivier.matz at 6wind.com
Fri May 9 16:50:27 CEST 2014


This series add TSO support in ixgbe DPDK driver. As discussed
previously on the list [1], one problem is that there is not enough room
in rte_mbuf today to store the required information to implement this
feature:
  - a new ol_flag
  - the MSS
  - the L4 header len

A solution would be to increase the size of the mbuf to 2 cache lines
but it could have a bad impact on performance. This series proposes some
rework to drastically reduce the size of the rte_mbuf structures before
implementing the TSO, avoiding to change the mbuf size to 128 bytes.

After the rework of mbuf structures, the size of rte_mbuf structure is
reduced by 9 bytes. The implementation of TSO requires to double the
size of ol_flags (16 to 32 bits) and to double the size of offload
information in order to add the mss and the l4 header length (32 to 64
bits). At the end of the whole series, sizeof(rte_mbuf) is still 64
bytes and 4 bytes are available for future use.

This rework causes a lot of modifications in the mbuf structure,
implying some changes in the applications that directly use the mbuf
structure fields instead of using the API functions (sometimes there is
no function). That's why this series is a RFC. In my opinion, it's the
proper moment for this evolution as the 1.7.0 window is open.

About TSO, the new fields in mbuf try to be generic enough to apply to
other hardware in the future. To delegate the TCP segmentation to the
hardware, the user has to:

  - set the PKT_TX_TCP_SEG flag in mbuf->ol_flags (this flag implies
    PKT_TX_IP_CKSUM and PKT_TX_TCP_CKSUM)
  - fill the mbuf->hw_offload information: l2_len, l3_len, l4_len, mss
  - calculate the pseudo header checksum and set it in the TCP header,
    as required when doing hardware TCP checksum offload
  - set the IP checksum to 0

Compilation of DPDK and examples is tested for the following
targets: x86_64-*-linuxapp-gcc, i686-*-linuxapp-gcc, x86_64-*-bsdapp-gcc

The mbuf rework series is validated with autotests:

  cd dpdk.org/
  make install T=x86_64-default-linuxapp-gcc
  cd x86_64-default-linuxapp-gcc/
  modprobe uio
  insmod kmod/igb_uio.ko
  python ../tools/igb_uio_bind.py -b igb_uio 0000:02:00.0
  echo 0 > /proc/sys/kernel/randomize_va_space
  echo 1000 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
  echo 1000 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
  mount -t hugetlbfs none /mnt/huge
  make test

TSO is validated with IPv4 and IPv6 with testpmd (see the commit log of
last patch for details).

The performance non-regression has been tested with 6WINDGate fast path.

Note: this patches may conflict with patch [2] which is pushed yet, but
will probably be integrated before this series.

[1] http://dpdk.org/ml/archives/dev/2013-October/thread.html#572
[2] http://dpdk.org/ml/archives/dev/2014-April/002166.html


Olivier Matz (11):
  igb/ixgbe: fix IP checksum calculation
  mbuf: rename RTE_MBUF_SCATTER_GATHER into RTE_MBUF_REFCNT
  mbuf: remove rte_ctrlmbuf
  mbuf: remove the rte_pktmbuf structure
  mbuf: merge physaddr and buf_len in a bitfield
  mbuf: replace data pointer by an offset
  mbuf: add functions to get the name of an ol_flag
  mbuf: change ol_flags to 32 bits
  mbuf: rename vlan_macip_len in hw_offload and increase its size
  testpmd: modify source address to validate checksum calculation
  ixgbe/mbuf: add TSO support

 app/test-pmd/cmdline.c                             |  60 ++-
 app/test-pmd/config.c                              |  18 +-
 app/test-pmd/csumonly.c                            |  50 ++-
 app/test-pmd/ieee1588fwd.c                         |   6 +-
 app/test-pmd/macfwd-retry.c                        |   2 +-
 app/test-pmd/macfwd.c                              |   8 +-
 app/test-pmd/rxonly.c                              |  47 +-
 app/test-pmd/testpmd.c                             |  10 +-
 app/test-pmd/testpmd.h                             |  15 +-
 app/test-pmd/txonly.c                              |  47 +-
 app/test/commands.c                                |   2 -
 app/test/test_mbuf.c                               | 100 +----
 app/test/test_sched.c                              |   4 +-
 config/defconfig_i686-default-linuxapp-gcc         |   2 +-
 config/defconfig_i686-default-linuxapp-icc         |   2 +-
 config/defconfig_x86_64-default-bsdapp-gcc         |   2 +-
 config/defconfig_x86_64-default-linuxapp-gcc       |   2 +-
 config/defconfig_x86_64-default-linuxapp-icc       |   2 +-
 doc/doxy-api.conf                                  |   2 +-
 examples/dpdk_qat/crypto.c                         |  22 +-
 examples/dpdk_qat/main.c                           |   2 +-
 examples/exception_path/main.c                     |  11 +-
 examples/ip_reassembly/ipv4_rsmbl.h                |  20 +-
 examples/ip_reassembly/main.c                      |   6 +-
 examples/ipv4_frag/Makefile                        |   4 +-
 examples/ipv4_frag/main.c                          |   4 +-
 examples/ipv4_frag/rte_ipv4_frag.h                 |  42 +-
 examples/ipv4_multicast/Makefile                   |   4 +-
 examples/ipv4_multicast/main.c                     |  16 +-
 examples/l3fwd-power/main.c                        |   2 +-
 examples/l3fwd-vf/main.c                           |   2 +-
 examples/l3fwd/main.c                              |  10 +-
 examples/load_balancer/runtime.c                   |   2 +-
 .../client_server_mp/mp_client/client.c            |   2 +-
 examples/quota_watermark/qw/main.c                 |   4 +-
 examples/vhost/main.c                              |  27 +-
 examples/vhost_xen/main.c                          |  22 +-
 .../bsdapp/eal/include/exec-env/rte_kni_common.h   |   2 +-
 .../linuxapp/eal/include/exec-env/rte_kni_common.h |   2 +-
 lib/librte_mbuf/rte_mbuf.c                         |  91 ++--
 lib/librte_mbuf/rte_mbuf.h                         | 476 +++++++++------------
 lib/librte_pmd_e1000/em_rxtx.c                     | 143 ++++---
 lib/librte_pmd_e1000/igb_rxtx.c                    | 192 +++++----
 lib/librte_pmd_ixgbe/ixgbe_rxtx.c                  | 381 ++++++++++-------
 lib/librte_pmd_ixgbe/ixgbe_rxtx.h                  |   8 +-
 lib/librte_pmd_pcap/rte_eth_pcap.c                 |  14 +-
 lib/librte_pmd_virtio/virtio_rxtx.c                |  18 +-
 lib/librte_pmd_virtio/virtqueue.h                  |   7 +-
 lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c              |  29 +-
 lib/librte_pmd_xenvirt/rte_eth_xenvirt.c           |  14 +-
 lib/librte_pmd_xenvirt/virtqueue.h                 |   4 +-
 lib/librte_sched/rte_sched.c                       |  14 +-
 lib/librte_sched/rte_sched.h                       |  10 +-
 53 files changed, 986 insertions(+), 1002 deletions(-)

-- 
1.9.2



More information about the dev mailing list