[ovs-dev] [PATCH] dpif-netdev: Avoid copying netdev_flow_key in emc_processing().

Andy Zhou azhou at ovn.org
Tue Jan 26 02:20:02 UTC 2016


On Sun, Jan 24, 2016 at 8:32 AM, Ben Pfaff <blp at ovn.org> wrote:

> Before this commit, emc_processing() copied a netdev_flow_key if there was
> no exact-match cache (EMC) hit.  This commit eliminates the copy by
> constructing the netdev_flow_key in the place it would be copied.
>
> Found by inspection.
>
> Shahbaz (CCed) reports that this reduces the cost of an EMC miss by 72
> cycles in his test case in which the EMC is disabled.  Presumably this
> is similarly valuable in cases where the EMC merely has few hits.
>
> CC: Muhammad Shahbaz <mshahbaz at cs.princeton.edu>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
>

Logic looks good to me.

Acked-by: Andy Zhou <azhou at ovn.org>

I think Daniele is testing on performance impact on this patch. so it is
may be worthwhile
to wait for his input before pushing the change.

---
>  AUTHORS           |  1 +
>  lib/dpif-netdev.c | 17 ++++++++---------
>  2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/AUTHORS b/AUTHORS
> index 7ae64d3..420aa2d 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -352,6 +352,7 @@ Mike Kruze              mkruze at nicira.com
>  Min Chen                ustcer.tonychan at gmail.com
>  Mikael Doverhag         mdoverhag at nicira.com
>  Mrinmoy Das             mrdas at ixiacom.com
> +Muhammad Shahbaz        mshahbaz at cs.princeton.edu
>  Murali R                muralirdev at gmail.com
>  Nagi Reddy Jonnala      njonnala at Brocade.com
>  Niels van Adrichem      N.L.M.vanAdrichem at tudelft.nl
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index cd72e62..97c4cde 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
> + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2016 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -3210,7 +3210,6 @@ emc_processing(struct dp_netdev_pmd_thread *pmd,
> struct dp_packet **packets,
>                 struct packet_batch batches[], size_t *n_batches)
>  {
>      struct emc_cache *flow_cache = &pmd->flow_cache;
> -    struct netdev_flow_key key;
>      size_t i, notfound_cnt = 0;
>
>      for (i = 0; i < cnt; i++) {
> @@ -3226,20 +3225,20 @@ emc_processing(struct dp_netdev_pmd_thread *pmd,
> struct dp_packet **packets,
>              OVS_PREFETCH(dp_packet_data(packets[i+1]));
>          }
>
> -        miniflow_extract(packets[i], &key.mf);
> -        key.len = 0; /* Not computed yet. */
> -        key.hash = dpif_netdev_packet_get_rss_hash(packets[i], &key.mf);
> +        struct netdev_flow_key *key = &keys[notfound_cnt];
> +        miniflow_extract(packets[i], &key->mf);
> +        key->len = 0; /* Not computed yet. */
> +        key->hash = dpif_netdev_packet_get_rss_hash(packets[i], &key->mf);
>
> -        flow = emc_lookup(flow_cache, &key);
> +        flow = emc_lookup(flow_cache, key);
>          if (OVS_LIKELY(flow)) {
> -            dp_netdev_queue_batches(packets[i], flow, &key.mf, batches,
> +            dp_netdev_queue_batches(packets[i], flow, &key->mf, batches,
>                                      n_batches);
>          } else {
>              if (i != notfound_cnt) {
>                  dp_packet_swap(&packets[i], &packets[notfound_cnt]);
>              }
> -
> -            keys[notfound_cnt++] = key;
> +            notfound_cnt++;
>          }
>      }
>
> --
> 2.1.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list