Ok, I see the problem. I think the solution looks good as Daniele said in a 
separate thread. As
mentioned, the flush logic needs a bit of a refactoring but this solution looks 
ok at this point.

> -----Original Message-----
> From: 通天晓0280 [mailto:do...@dtdream.com]
> Sent: Saturday, June 6, 2015 7:01 AM
> To: Gray, Mark D
> Cc: 钢锁0310; dev
> Subject: Re: [ovs-dev] [PATCH] netdev-dpdk: Do not flush tx queue which is
> shared among CPUs since it is always flushed
> 
> Sorry the last e-mail had wrong output format.
> 
> 
> 
> 
> We got a crash of ovs-vswitchd.
> I start ovs following the instructions of INSTALL.DPDK.md, with the ovs
> master code.
> In my enironment, there are four cpu cores, the "real_n_txq" of dpdk port is
> 1 and "txq_needs_locking" is "true"
> 
> 
> 
> 
> ...
> 
> ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
> 
> ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
> 
> ovs-vsctl add-port br0 dpdkvhost0 -- set Interface dpdkvhost0
> type=dpdkvhost
> 
> 
> 
> 
> It works, then i bring up a guest and do some tests, a segmentfault
> happenned to ovs-vswitchd when I run "iperf3" clients on guest and host at
> the same time.
> 
> guest:  iperf client sends tcp packets -> dpdkvhost0 -> OVS -> dpdk0 ->
> outside
> 
> host:  iperf client sends tcp packets -> br0 -> OVS -> dpdk0 -> outside
> 
> 
> 
> 
> The segmentfault like this:
> 
> 
> Program received signal SIGSEGV, Segmentation fault.
> eth_em_xmit_pkts (tx_queue=0x7f623d0f9880, tx_pkts=0x7f623d0ebee8,
>     nb_pkts=65535)
>     at  dpdk-2.0.0/lib/librte_pmd_e1000/em_rxtx.c:436
> 436   ol_flags = tx_pkt->ol_flags;
> (gdb) bt
> 
> #0  eth_em_xmit_pkts (tx_queue=0x7f623d0f9880,
> tx_pkts=0x7f623d0ebee8,  nb_pkts=65535)
>     at dpdk-2.0.0/lib/librte_pmd_e1000/em_rxtx.c:436
> #1  0x0000000000625d3d in rte_eth_tx_burst
> 
>  at dpdk-2.0.0/x86_64-native-linuxapp-gcc/include/rte_ethdev.h:2572
> #2  dpdk_queue_flush__ (dev=dev@entry=0x7f623d0f9940,
> qid=qid@entry=0)
> 
>  at lib/netdev-dpdk.c:808
> #3  0x0000000000627324 in dpdk_queue_pkts (cnt=1, pkts=0x7fff5da5a8f0,
> qid=0,  dev=0x7f623d0f9940)
> 
> at lib/netdev-dpdk.c:1003
> #4  dpdk_do_tx_copy (netdev=netdev@entry=0x7f623d0f9940,
> qid=qid@entry=0,
> 
> pkts=pkts@entry=0x7fff5da5ae80, cnt=cnt@entry=1) at lib/netdev-
> dpdk.c:1073
> 
> #5  0x0000000000627e96 in netdev_dpdk_send__ (may_steal=<optimized
> out>, cnt=1,
> 
>  pkts=0x7fff5da5ae80, qid=0, dev=0x7f623d0f9940)  at lib/netdev-
> dpdk.c:1116
> 
> #6  netdev_dpdk_eth_send (netdev=0x7f623d0f9940, qid=<optimized out>,
> pkts=0x7fff5da5ae80, cnt=1,
> 
> may_steal=<optimized out>) at lib/netdev-dpdk.c:1169
> 
> The traffics of guest and br0 are processing by  main thread and pmd thread
> seperately. The pkts of br0 are sent by "netdev_dpdk_send__" with lock
> "rte_spinlock_lock" via dpdk port, and the pmd main thread processes the
> sending direction pkts of dpdk port by dpdk_queue_flush without lock. The
> carsh seems to be caused by this.
> 
> We fixed it with this patch and the segmentfault did not happen again.
> 
> The modification does not affect the performance  phy to phy when the txq
> num is equal to cpu num, we tesed it on server with Intel Xecn E52630  and
> 82599 xge nic.
> 
> I guess it also does not affect the performance of the opposite condition(not
> equal) for the "flush_tx" of the txq is "true" and it will be flushed every 
> time
> in "dpdk_queue_pkts".
> 
> We dont clearly kown if there is better modificaion, some help will be
> greately appreciated.
> 
> 
> 
> 
> 
>       ------------------------------------------------------------------
> 
>       From:Gray, Mark D <mark.d.g...@intel.com>
> 
>       Time:2015 Jun 5 (Fri) 22:53
> 
>       To:钢锁0310 <l...@dtdream.com>, d...@openvswitch.com
> <d...@openvswitch.com>
> 
>       Subject:Re: [ovs-dev] [PATCH] netdev-dpdk: Do not flush tx queue
> which is shared among CPUs since it is always flushed
> 
> 
> 
> 
>       >
> 
>       > When tx queue is shared among CPUS,the pkts always be flush in
> 
>       > 'netdev_dpdk_eth_send'
> 
>       > So it is unnecessarily for flushing in netdev_dpdk_rxq_recv
> Otherwise tx will
> 
>       > be accessed without locking
> 
> 
> 
> 
>       Are you seeing a specific bug or is this just to account for a device
> with
> 
>       less queues than pmds?
> 
> 
> 
> 
>       >
> 
>       > Signed-off-by: Wei li <l...@dtdream.com>
> 
>       > ---
> 
>       >  lib/netdev-dpdk.c | 7 +++++--
> 
>       >  1 file changed, 5 insertions(+), 2 deletions(-)
> 
>       >
> 
>       > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index
> 63243d8..25e3a73
> 
>       > 100644
> 
>       > --- a/lib/netdev-dpdk.c
> 
>       > +++ b/lib/netdev-dpdk.c
> 
>       > @@ -892,8 +892,11 @@ netdev_dpdk_rxq_recv(struct netdev_rxq
> *rxq_,
> 
>       > struct dp_packet **packets,
> 
>       >      int nb_rx;
> 
>       >
> 
>       >      /* There is only one tx queue for this core.  Do not flush other
> 
>       > -     * queueus. */
> 
>       > -    if (rxq_->queue_id == rte_lcore_id()) {
> 
>       > +     * queueus.
> 
> 
> 
> 
>       s/queueus/queues
> 
> 
> 
> 
>       > +     * Do not flush tx queue which is shared among CPUs
> 
>       > +     * since it is always flushed */
> 
>       > +    if (rxq_->queue_id == rte_lcore_id() &&
> 
>       > +  OVS_LIKELY(!dev->txq_needs_locking)) {
> 
>       >          dpdk_queue_flush(dev, rxq_->queue_id);
> 
> 
> 
> 
>       Do you see any drop in performance in a simple phy-phy case before
> 
>       and after this patch?
> 
> 
> 
> 
>       >      }
> 
>       >
> 
>       > --
> 
>       > 1.9.5.msysgit.1
> 
>       >
> 
>       >
> 
>       > _______________________________________________
> 
>       > dev mailing list
> 
>       > dev@openvswitch.org
> 
>       > http://openvswitch.org/mailman/listinfo/dev
> 
>       _______________________________________________
> 
>       dev mailing list
> 
>       dev@openvswitch.org
> 
>       http://openvswitch.org/mailman/listinfo/dev
> 
> 
> 

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to