[ovs-dev] [PATCHv2] ofproto-dpif: Add ability to disable megaflows.

Ethan Jackson ethan at nicira.com
Sat Jun 29 01:31:28 UTC 2013


Looks good to me thanks.

Acked-by: Ethan Jackson <ethan at nicira.com>


On Fri, Jun 28, 2013 at 6:26 PM, Justin Pettit <jpettit at nicira.com> wrote:
> Add new "dpif/disable-megaflows" and "dpif/enable-megaflows" commands to
> ovs-appctl to disable and enable megaflows, respectively.  By default,
> megaflows are enabled, and these commands should only be used for
> debugging.
>
> Feature #18265.
>
> Requested-by: Ronghua Zhang <rzhang at vmware.com>
> Signed-off-by: Justin Pettit <jpettit at nicira.com>
> ---
>  ofproto/ofproto-dpif.c |   62 ++++++++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 58 insertions(+), 4 deletions(-)
>
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 5ca16b7..2d42c83 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -404,6 +404,10 @@ static void update_moving_averages(struct dpif_backer *backer);
>   * for debugging the asynchronous flow_mod implementation.) */
>  static bool clogged;
>
> +/* By default, flows in the datapath are wildcarded (megaflows).  They
> + * may be disabled with the "ovs-appctl dpif/disable-megaflows" command. */
> +static bool enable_megaflows = true;
> +
>  /* All existing ofproto_dpif instances, indexed by ->up.name. */
>  static struct hmap all_ofproto_dpifs = HMAP_INITIALIZER(&all_ofproto_dpifs);
>
> @@ -3476,8 +3480,10 @@ handle_flow_miss_with_facet(struct flow_miss *miss, struct facet *facet,
>          subfacet->path = want_path;
>
>          ofpbuf_use_stack(&op->mask, &op->maskbuf, sizeof op->maskbuf);
> -        odp_flow_key_from_mask(&op->mask, &facet->xout.wc.masks,
> -                               &miss->flow, UINT32_MAX);
> +        if (enable_megaflows) {
> +            odp_flow_key_from_mask(&op->mask, &facet->xout.wc.masks,
> +                                   &miss->flow, UINT32_MAX);
> +        }
>
>          op->xout_garbage = false;
>          op->dpif_op.type = DPIF_OP_FLOW_PUT;
> @@ -5064,8 +5070,10 @@ subfacet_install(struct subfacet *subfacet, const struct ofpbuf *odp_actions,
>      }
>
>      ofpbuf_use_stack(&mask, &maskbuf, sizeof maskbuf);
> -    odp_flow_key_from_mask(&mask, &facet->xout.wc.masks,
> -                           &facet->flow, UINT32_MAX);
> +    if (enable_megaflows) {
> +        odp_flow_key_from_mask(&mask, &facet->xout.wc.masks,
> +                               &facet->flow, UINT32_MAX);
> +    }
>
>      ret = dpif_flow_put(subfacet->backer->dpif, flags, subfacet->key,
>                          subfacet->key_len,  mask.data, mask.size,
> @@ -6388,6 +6396,48 @@ ofproto_unixctl_dpif_dump_megaflows(struct unixctl_conn *conn,
>      ds_destroy(&ds);
>  }
>
> +/* Disable using the megaflows.
> + *
> + * This command is only needed for advanced debugging, so it's not
> + * documented in the man page. */
> +static void
> +ofproto_unixctl_dpif_disable_megaflows(struct unixctl_conn *conn,
> +                                       int argc OVS_UNUSED,
> +                                       const char *argv[] OVS_UNUSED,
> +                                       void *aux OVS_UNUSED)
> +{
> +    struct ofproto_dpif *ofproto;
> +
> +    enable_megaflows = false;
> +
> +    HMAP_FOR_EACH (ofproto, all_ofproto_dpifs_node, &all_ofproto_dpifs) {
> +        flush(&ofproto->up);
> +    }
> +
> +    unixctl_command_reply(conn, "megaflows disabled");
> +}
> +
> +/* Re-enable using megaflows.
> + *
> + * This command is only needed for advanced debugging, so it's not
> + * documented in the man page. */
> +static void
> +ofproto_unixctl_dpif_enable_megaflows(struct unixctl_conn *conn,
> +                                      int argc OVS_UNUSED,
> +                                      const char *argv[] OVS_UNUSED,
> +                                      void *aux OVS_UNUSED)
> +{
> +    struct ofproto_dpif *ofproto;
> +
> +    enable_megaflows = true;
> +
> +    HMAP_FOR_EACH (ofproto, all_ofproto_dpifs_node, &all_ofproto_dpifs) {
> +        flush(&ofproto->up);
> +    }
> +
> +    unixctl_command_reply(conn, "megaflows enabled");
> +}
> +
>  static void
>  ofproto_unixctl_dpif_dump_flows(struct unixctl_conn *conn,
>                                  int argc OVS_UNUSED, const char *argv[],
> @@ -6501,6 +6551,10 @@ ofproto_dpif_unixctl_init(void)
>                               ofproto_unixctl_dpif_del_flows, NULL);
>      unixctl_command_register("dpif/dump-megaflows", "bridge", 1, 1,
>                               ofproto_unixctl_dpif_dump_megaflows, NULL);
> +    unixctl_command_register("dpif/disable-megaflows", "", 0, 0,
> +                             ofproto_unixctl_dpif_disable_megaflows, NULL);
> +    unixctl_command_register("dpif/enable-megaflows", "", 0, 0,
> +                             ofproto_unixctl_dpif_enable_megaflows, NULL);
>  }
>
>  /* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
> --
> 1.7.5.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
X-CudaMail-Whitelist-To: dev at openvswitch.org



More information about the dev mailing list