[ovs-dev] [PATCH V3] netdev-dpdk: Add Jumbo Frame Support.

Flavio Leitner fbl at sysclose.org
Fri Feb 12 14:09:14 UTC 2016


On Mon, 8 Feb 2016 10:54:08 +0000
"Kavanagh, Mark B" <mark.b.kavanagh at intel.com> wrote:

> >
> >Hi,
> >
> >Some comments below.
> >  
> 
> Hi Flavio,
> 
> Thanks for your review!
> 
> I've responded to your comments inline - I've also addressed the
> cosmetic changes that you suggested in V3 of the patch.
> 
> Thanks again,
> Mark
> 
> >
> >On Mon,  1 Feb 2016 10:18:54 +0000
> >Mark Kavanagh <mark.b.kavanagh at intel.com> wrote:
> >  
> >> Add support for Jumbo Frames to DPDK-enabled port types,
> >> using single-segment-mbufs.
> >>
> >> Using this approach, the amount of memory allocated for each mbuf
> >> to store frame data is increased to a value greater than 1518B
> >> (typical Ethernet maximum frame length). The increased space
> >> available in the mbuf means that an entire Jumbo Frame can be
> >> carried in a single mbuf, as opposed to partitioning it across
> >> multiple mbuf segments.
> >>
> >> The amount of space allocated to each mbuf to hold frame data is
> >> defined dynamically by the user when adding a DPDK port to a
> >> bridge. If an MTU value is not supplied, or the user-supplied
> >> value is invalid, the MTU for the port defaults to standard
> >> Ethernet MTU (i.e. 1500B).
> >>
> >> Signed-off-by: Mark Kavanagh <mark.b.kavanagh at intel.com>
> >> ---
> >>  INSTALL.DPDK.md   |  59 +++++++++-
> >>  NEWS              |   2 +
> >>  lib/netdev-dpdk.c | 347
> >> +++++++++++++++++++++++++++++++++++++++++------------- 3 files
> >> changed, 328 insertions(+), 80 deletions(-)
[...]

> >> +When Jumbo Frames are enabled, the size of a DPDK port's mbuf
> >> segments are +increased, such that a full Jumbo Frame may be
> >> accommodated inside a single +mbuf segment. Once set, the MTU for a
> >> DPDK port is immutable. +  
> >
> >I think we need some protection here because if someone tries to
> >change that, it will segfault PMD threads.
> >  
> 
> Could you elaborate on this a bit more; do you mean that PMD threads
> would segfault if a user attempts to change the MTU of a running DPDK
> port? If so, how would that be possible (AFAIA, there's no way to
> programmatically modify the MTU of OVS ports, outside of standard
> Linux utilities such as ifconfig, which DPDK ports typically aren't
> subject to; there's also AFAIA no way to programmatically modify MTU
> of DPDK ports outside of modifying the source code).

I have a ovs bridge with two dpdk ports created with these commands:

# ovs-vsctl add-port ovsbr0 dpdk0 \
        -- set interface dpdk0 type=dpdk options:dpdk-mtu=9000 ofport_request=10
# ovs-vsctl add-port ovsbr0 dpdk1 \
        -- set interface dpdk1 type=dpdk options:dpdk-mtu=9000 ofport_request=11

Now I am pushing traffic (jumbo frames or small frames) and then
I change dpdk-mtu to 1500.

# ovs-vsctl set interface dpdk1 options:dpdk-mtu=1500

Then I see this:
2016-02-12T13:19:20.142Z|00003|daemon_unix(monitor)|ERR|1 crashes: 
pid 78009 died, killed (Segmentation fault), core dumped, restarting
...

This is the backtrace:
#0  0x00007f1909cf4423 in _recv_raw_pkts_vec () from /lib64/libdpdk.so
#1  0x00000000004fd595 in rte_eth_rx_burst (nb_pkts=32, rx_pkts=0x7f18c37fd970, queue_id=2, 
    port_id=1 '\001') at /root/dpdk/x86_64-native-linuxapp-gcc/include/rte_ethdev.h:2510
#2  netdev_dpdk_rxq_recv (rxq_=<optimized out>, packets=0x7f18c37fd970, c=0x7f18c37fd96c)
    at ../lib/netdev-dpdk.c:1216
#3  0x000000000047c3c1 in netdev_rxq_recv (rx=<optimized out>, buffers=buffers at entry=0x7f18c37fd970, 
    cnt=cnt at entry=0x7f18c37fd96c) at ../lib/netdev.c:654
#4  0x000000000045e566 in dp_netdev_process_rxq_port (pmd=pmd at entry=0x1e1cd90, rxq=<optimized out>, 
    port=<optimized out>, port=<optimized out>) at ../lib/dpif-netdev.c:2555
#5  0x000000000045e9f9 in pmd_thread_main (f_=0x1e1cd90) at ../lib/dpif-netdev.c:2691
#6  0x00000000004bab64 in ovsthread_wrapper (aux_=<optimized out>) at ../lib/ovs-thread.c:340
#7  0x00007f1909583555 in start_thread (arg=0x7f18c37fe700) at pthread_create.c:333
#8  0x00007f1908daeb9d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109


Dump of assembler code for function _recv_raw_pkts_vec:
   0x00007fa8d51ccf30 <+0>:     push   %r15
   0x00007fa8d51ccf32 <+2>:     mov    %edx,%r15d
   0x00007fa8d51ccf35 <+5>:     push   %r14
   0x00007fa8d51ccf37 <+7>:     push   %r13
   0x00007fa8d51ccf39 <+9>:     push   %r12
   0x00007fa8d51ccf3b <+11>:    push   %rbp
   0x00007fa8d51ccf3c <+12>:    push   %rbx
   0x00007fa8d51ccf3d <+13>:    sub    $0x38,%rsp
=> 0x00007fa8d51ccf41 <+17>:    movzbl 0x69(%rdi),%eax

rdi            0x0      0

Looks like dev->data->rx_queues[queue_id] is NULL.

-- 
fbl




More information about the dev mailing list