[ovs-dev] [RFC PATCH V4 0/9] netdev-dpdk: support multi-segment mbufs

Mark Kavanagh mark.b.kavanagh at intel.com
Fri Dec 8 12:01:49 UTC 2017


Overview
========
This patchset introduces support for multi-segment mbufs to OvS-DPDK.
Multi-segment mbufs are typically used when the size of an mbuf is
insufficient to contain the entirety of a packet's data. Instead, the
data is split across numerous mbufs, each carrying a portion, or
'segment', of the packet data. mbufs are chained via their 'next'
attribute (an mbuf pointer).

Use Cases
=========
i.  Handling oversized (guest-originated) frames, which are marked
    for hardware accelration/offload (TSO, for example).

    Packets which originate from a non-DPDK source may be marked for
    offload; as such, they may be larger than the permitted ingress
    interface's MTU, and may be stored in an oversized dp-packet. In
    order to transmit such packets over a DPDK port, their contents
    must be copied to a DPDK mbuf (via dpdk_do_tx_copy). However, in
    its current implementation, that function only copies data into
    a single mbuf; if the space available in the mbuf is exhausted,
    but not all packet data has been copied, then it is lost.
    Similarly, when cloning a DPDK mbuf, it must be considered
    whether that mbuf contains multiple segments. Both issues are
    resolved within this patchset.

ii. Handling jumbo frames.

    While OvS already supports jumbo frames, it does so by increasing
    mbuf size, such that the entirety of a jumbo frame may be handled
    in a single mbuf. This is certainly the preferred, and most
    performant approach (and remains the default). However, it places
    high demands on system memory; multi-segment mbufs may be
    prefereable for systems which are memory-constrained.

Enabling multi-segment mbufs
============================
Multi-segment and single-segment mbufs are mutually exclusive, and the
user must decide on which approach to adopt on init. The introduction
of a new OVSDB field, 'dpdk-multi-seg-mbufs', facilitates this.

This is a global boolean value, which determines how jumbo frames are
represented across all DPDK ports. In the absence of a user-supplied
value, 'dpdk-multi-seg-mbufs' defaults to false, i.e. multi-segment
mbufs must be explicitly enabled / single-segment mbufs remain the
default.

Setting the field is identical to setting existing DPDK-specific OVSDB
fields:

    ovs-vsctl set Open_vSwitch . other_config:dpdk-init=true
    ovs-vsctl set Open_vSwitch . other_config:dpdk-lcore-mask=0x10
    ovs-vsctl set Open_vSwitch . other_config:dpdk-socket-mem=4096,0
==> ovs-vsctl set Open_vSwitch . other_config:dpdk-multi-seg-mbufs=true


Notes
=====
This patchset was generated and built against:
- Current HEAD of OvS master[1] + DPDK v17.11 support patchset[2]
- DPDK v17.11

[1] 159cc1f ("datapath-windows: Correct endianness for deleting zone.")
[2] https://mail.openvswitch.org/pipermail/ovs-dev/2017-December/341786.html

---

v4: - restructure patchset
    - account for 128B ARM cacheline when sizing mbufs

Mark Kavanagh (5):
  netdev-dpdk: fix mbuf sizing
  dp-packet: fix reset_packet for multi-seg mbufs
  dp-packet: fix put_uninit for multi-seg mbufs
  dp-packet: init specific mbuf fields to 0
  netdev-dpdk: support multi-segment jumbo frames

Michael Qiu (4):
  dp-packet: Fix data_len issue with multi-seg mbufs
  dp-packet: copy mbuf info for packet copy
  dp-packet: copy data from multi-seg. DPDK mbuf
  netdev-dpdk: copy large packet to multi-seg. mbufs

 NEWS                 |   1 +
 lib/dp-packet.c      |  51 ++++++++++++++++-
 lib/dp-packet.h      |  26 ++++-----
 lib/dpdk.c           |   7 +++
 lib/netdev-dpdk.c    | 156 ++++++++++++++++++++++++++++++++++++++++++---------
 lib/netdev-dpdk.h    |   1 +
 vswitchd/vswitch.xml |  20 +++++++
 7 files changed, 220 insertions(+), 42 deletions(-)

-- 
1.9.3



More information about the dev mailing list