[dpdk-dev] [PATCH v6 0/3] Support TCP/IPv4 GRO in DPDK
Tan, Jianfeng
jianfeng.tan at intel.com
Sun Jun 25 18:03:33 CEST 2017
On 6/23/2017 10:43 PM, Jiayu Hu wrote:
> Generic Receive Offload (GRO) is a widely used SW-based offloading
> technique to reduce per-packet processing overhead. It gains performance
> by reassembling small packets into large ones. Therefore, we propose to
> support GRO in DPDK.
>
> To enable more flexibility to applications, DPDK GRO is implemented as
> a user library. Applications explicitly use the GRO library to merge
> small packets into large ones. DPDK GRO provides two reassembly modes:
> lightweigth mode and heavyweight mode. If applications want to merge
> packets in a simple way, they can select lightweight mode API. If
> applications need more fine-grained controls, they can select heavyweigth
> mode API.
>
> This patchset is to support TCP/IPv4 GRO in DPDK. The first patch is to
> provide a GRO API framework. The second patch is to support TCP/IPv4 GRO.
> The last patch is to enable TCP/IPv4 GRO in testpmd.
>
> We perform many iperf tests to see the performance gains from DPDK GRO.
>
> The test environment is:
> a. two 25Gbps physical ports (p0 and p1) are linked together. Assign p0
> to one networking namespace and assign p1 to DPDK;
> b. enable TSO for p0. Run iperf client on p0;
> c. launch testpmd with p1 and a vhost-user port, and run it in csum
> forwarding mode. Select TCP HW checksum calculation for the
> vhost-user port in csum forwarding engine. And for better
> performance, we select IPv4 and TCP HW checksum calculation for p1
> too;
> d. launch a VM with one CPU core and a virtio-net port. The VM OS is
> ubuntu 16.04 whose virtio-net driver supports GRO. Enables RX csum
> offloading and mrg_rxbuf for the VM. Iperf server runs in the VM;
> e. to run iperf tests, we need to avoid the csum forwarding engine
> compulsorily changes packet mac addresses. SO in our tests, we
> comment these codes out (line701 ~ line704 in csumonly.c).
>
> In each test, we run iperf with the following three configurations:
> - single flow and single TCP stream
> - multiple flows and single TCP stream
> - single flow and parallel TCP streams
To me, flow == TCP stream; so could you explain what does flow mean?
>
> We run above iperf tests on three scenatios:
> s1: disabling kernel GRO and enabling DPDK GRO
> s2: disabling kernel GRO and disabling DPDK GRO
> s3: enabling kernel GRO and disabling DPDK GRO
> Comparing the throughput of s1 with s2, we can see the performance gains
> from DPDK GRO. Comparing the throughput of s1 and s3, we can compare DPDK
> GRO performance with kernel GRO performance.
>
> Test results:
> - DPDK GRO throughput is almost 2 times than the throughput of no
> DPDK GRO and no kernel GRO;
> - DPDK GRO throughput is almost 1.2 times than the throughput of
> kernel GRO.
>
> Change log
> ==========
> v6:
> - avoid checksum validation and calculation
> - enable to process IP fragmented packets
> - add a command in testpmd
> - update documents
> - modify rte_gro_timeout_flush and rte_gro_reassemble_burst
> - rename veriable name
> v5:
> - fix some bugs
> - fix coding style issues
> v4:
> - implement DPDK GRO as an application-used library
> - introduce lightweight and heavyweight working modes to enable
> fine-grained controls to applications
> - replace cuckoo hash tables with simpler table structure
> v3:
> - fix compilation issues.
> v2:
> - provide generic reassembly function;
> - implement GRO as a device ability:
> add APIs for devices to support GRO;
> add APIs for applications to enable/disable GRO;
> - update testpmd example.
>
> Jiayu Hu (3):
> lib: add Generic Receive Offload API framework
> lib/gro: add TCP/IPv4 GRO support
> app/testpmd: enable TCP/IPv4 GRO
>
> app/test-pmd/cmdline.c | 125 +++++++++
> app/test-pmd/config.c | 37 +++
> app/test-pmd/csumonly.c | 5 +
> app/test-pmd/testpmd.c | 3 +
> app/test-pmd/testpmd.h | 11 +
> config/common_base | 5 +
> doc/guides/rel_notes/release_17_08.rst | 7 +
> doc/guides/testpmd_app_ug/testpmd_funcs.rst | 34 +++
> lib/Makefile | 2 +
> lib/librte_gro/Makefile | 51 ++++
> lib/librte_gro/rte_gro.c | 221 ++++++++++++++++
> lib/librte_gro/rte_gro.h | 195 ++++++++++++++
> lib/librte_gro/rte_gro_tcp.c | 393 ++++++++++++++++++++++++++++
> lib/librte_gro/rte_gro_tcp.h | 188 +++++++++++++
> lib/librte_gro/rte_gro_version.map | 12 +
> mk/rte.app.mk | 1 +
> 16 files changed, 1290 insertions(+)
> create mode 100644 lib/librte_gro/Makefile
> create mode 100644 lib/librte_gro/rte_gro.c
> create mode 100644 lib/librte_gro/rte_gro.h
> create mode 100644 lib/librte_gro/rte_gro_tcp.c
> create mode 100644 lib/librte_gro/rte_gro_tcp.h
> create mode 100644 lib/librte_gro/rte_gro_version.map
>
More information about the dev
mailing list