Regards
_Sugesh


> -----Original Message-----
> From: pravin shelar [mailto:pshe...@ovn.org]
> Sent: Thursday, April 14, 2016 5:59 PM
> To: Chandran, Sugesh <sugesh.chand...@intel.com>
> Cc: ovs dev <dev@openvswitch.org>
> Subject: Re: [ovs-dev] [PATCH v2] tunneling: Improving tunneling
> performance using DPDK Rx checksum offloading feature.
> 
> On Wed, Apr 13, 2016 at 7:42 AM, Sugesh Chandran
> <sugesh.chand...@intel.com> wrote:
> > Optimizing tunneling performance in userspace datapath by offloading
> > the rx checksum validation on tunnel packets to the NIC when it is
> supported.
> >
> > This patch improves the bidirectional VxLAN tunneling performance by
> > 8% and decapsulation performance by 24%. However it introduces 1%
> > performance drop in PHY-PHY case due to the overhead of validating
> > invalid checksum flag reported by NIC.
> >
> > Signed-off-by: Sugesh Chandran <sugesh.chand...@intel.com>
> > ---
> >  lib/dpif-netdev.c     | 40 ++++++++++++++++++++++++++++++++--------
> >  lib/netdev-dpdk.c     | 39 +++++++++++++++++++++++++--------------
> >  lib/netdev-provider.h |  3 +++
> >  lib/netdev-vport.c    | 25 +++++++++++++++----------
> >  lib/netdev.c          |  1 +
> >  lib/netdev.h          |  5 +++++
> >  lib/packets.h         |  1 +
> >  7 files changed, 82 insertions(+), 32 deletions(-)
> >
> > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index
> > 2870951..5de5c6a 100644
> > --- a/lib/dpif-netdev.c
> > +++ b/lib/dpif-netdev.c
> > @@ -70,6 +70,7 @@
> >  #include "util.h"
> >
> >  #include "openvswitch/vlog.h"
> > +#include "netdev-provider.h"
> >
> >  VLOG_DEFINE_THIS_MODULE(dpif_netdev);
> >
> > @@ -479,7 +480,8 @@ static void dp_netdev_execute_actions(struct
> dp_netdev_pmd_thread *pmd,
> >                                        const struct nlattr *actions,
> >                                        size_t actions_len);  static
> > void dp_netdev_input(struct dp_netdev_pmd_thread *,
> > -                            struct dp_packet **, int cnt, odp_port_t 
> > port_no);
> > +                                      struct dp_packet **, int cnt,
> > +                                      struct dp_netdev_port *port);
> >  static void dp_netdev_recirculate(struct dp_netdev_pmd_thread *,
> >                                    struct dp_packet **, int cnt);
> >
> > @@ -2572,7 +2574,7 @@ dp_netdev_process_rxq_port(struct
> dp_netdev_pmd_thread *pmd,
> >          *recirc_depth_get() = 0;
> >
> >          cycles_count_start(pmd);
> > -        dp_netdev_input(pmd, packets, cnt, port->port_no);
> > +        dp_netdev_input(pmd, packets, cnt, port);
> >          cycles_count_end(pmd, PMD_CYCLES_PROCESSING);
> >      } else if (error != EAGAIN && error != EOPNOTSUPP) {
> >          static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1,
> > 5); @@ -3394,6 +3396,20 @@ dp_netdev_queue_batches(struct
> dp_packet *pkt,
> >      packet_batch_update(batch, pkt, mf);  }
> >
> > +static inline bool
> > +is_checksum_valid(struct dp_packet *packet) { #ifdef DPDK_NETDEV
> > +    if (packet->mbuf.ol_flags & (PKT_RX_IP_CKSUM_BAD |
> > +                                 PKT_RX_L4_CKSUM_BAD)) {
> > +        return 0;
> > +    }
> > +    packet->md.ol_flags = NETDEV_RX_CHECKSUM_OFFLOAD;
> There is no need to define redundant flags for same information in
> dp_packet. We can just access packet->mbuf members to check the
> checksum flag.
[Sugesh] mbuf doesn’t have a flag for checksum. However  the checksum 
Invalid flags in mbuf get set when a packet received with invalid checksum on a 
checksum 
offloaded port. So a packet with a valid checksum cannot say if the checksum is 
already validated in the NIC/not. We need this information in the packet to 
bypass checksum validation in tunneling code.
> 
> > +    return 1;
> > +#else
> > +    return 0;
> > +#endif
> > +}
> > +
> >  /* Try to process all ('cnt') the 'packets' using only the exact match 
> > cache
> >   * 'pmd->flow_cache'. If a flow is not found for a packet 'packets[i]', the
> >   * miniflow is copied into 'keys' and the packet pointer is moved at
> > the @@ -3409,11 +3425,13 @@ static inline size_t
> > emc_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet
> **packets,
> >                 size_t cnt, struct netdev_flow_key *keys,
> >                 struct packet_batch batches[], size_t *n_batches,
> > -               bool md_is_valid, odp_port_t port_no)
> > +               bool md_is_valid, struct dp_netdev_port *port)
> >  {
> >      struct emc_cache *flow_cache = &pmd->flow_cache;
> >      struct netdev_flow_key *key = &keys[0];
> >      size_t i, n_missed = 0, n_dropped = 0;
> > +    bool rx_cksm_ol_enable = port && (port->netdev->ol_flags &
> > +                                    NETDEV_RX_CHECKSUM_OFFLOAD);
> >
> >      for (i = 0; i < cnt; i++) {
> >          struct dp_netdev_flow *flow;
> > @@ -3425,6 +3443,12 @@ emc_processing(struct dp_netdev_pmd_thread
> *pmd, struct dp_packet **packets,
> >              continue;
> >          }
> >
> > +        if (OVS_UNLIKELY(rx_cksm_ol_enable &&
> > + !is_checksum_valid(packet))) {
> Is checking for rx_cksum_ol_enable really required? No other netdev
> implementation would initialize the packet ckecksum flags. So only DPDK
> packets should return a invalid checksum here.
[Sugesh] Yes, But all the DPDK ports may not able to do the Rx checksum
offloading. So its necessary to check if the port have rx checksum offloading 
enabled or not.
> 
> > +            dp_packet_delete(packet);
> > +            n_dropped++;
> > +            continue;
> > +        }
> > +
> Calling checksum validation from datapath for all packets is odd. I am not 
> sure
> about the reasoning. I think we can validate the packet checksum  flags in
> tunnel code.
[Sugesh] Agreed, Will move the code to the tunneling code. The idea was to
discard packets  as early as possible before spending more CPU cycles on the 
invalid packets.


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

Reply via email to