[ovs-dev] [PATCHv2] ofproto-dpif: Add ability to disable megaflows.
Justin Pettit
jpettit at nicira.com
Sat Jun 29 01:40:11 UTC 2013
Thanks for the reviews. I pushed both patches to the relevant branches.
--Justin
On Jun 28, 2013, at 6:31 PM, Ethan Jackson <ethan at nicira.com> wrote:
> 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
More information about the dev
mailing list