I'm having a bit of trouble understanding this patch. It seems to me like it continues to do accounting when removing facets, what it's actually doing is avoiding learning when removing them. I may be misinterpreting though. Just to make sure I'm understanding: this is an optimization because it avoid the redundant call to xlate_actions() in facet_learn()?
Why remove "facet->accounted_bytes = facet->byte_count" from facet_account(), every caller seems to do it manually now. I think I'm just a bit confused, it may be worth expanding the commit message a bit. Ethan On Mon, Apr 16, 2012 at 17:18, Ben Pfaff <b...@nicira.com> wrote: > From: Ben Pfaff <b...@hardrock.nicira.com> > > Signed-off-by: Ben Pfaff <b...@hardrock.nicira.com> > --- > ofproto/ofproto-dpif.c | 90 > +++++++++++++++++++++++++----------------------- > 1 files changed, 47 insertions(+), 43 deletions(-) > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index 594a705..cc96ccf 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -209,17 +209,13 @@ struct action_xlate_ctx { > * revalidating without a packet to refer to. */ > const struct ofpbuf *packet; > > - /* Should OFPP_NORMAL update the MAC learning table? We want to update > it > - * if we are actually processing a packet, or if we are accounting for > - * packets that the datapath has processed, but not if we are just > - * revalidating. */ > - bool may_learn_macs; > - > - /* Should "learn" actions update the flow table? We want to update it if > - * we are actually processing a packet, or in most cases if we are > - * accounting for packets that the datapath has processed, but not if we > - * are just revalidating. */ > - bool may_flow_mod; > + /* Should OFPP_NORMAL update the MAC learning table? Should "learn" > + * actions update the flow table? > + * > + * We want to update these tables if we are actually processing a packet, > + * or if we are accounting for packets that the datapath has processed, > but > + * not if we are just revalidating. */ > + bool may_learn; > > /* The rule that we are currently translating, or NULL. */ > struct rule_dpif *rule; > @@ -352,7 +348,8 @@ static void facet_flush_stats(struct facet *); > static void facet_update_time(struct facet *, long long int used); > static void facet_reset_counters(struct facet *); > static void facet_push_stats(struct facet *); > -static void facet_account(struct facet *, bool may_flow_mod); > +static void facet_learn(struct facet *); > +static void facet_account(struct facet *); > > static bool facet_is_controller_flow(struct facet *); > > @@ -2998,7 +2995,11 @@ update_stats(struct ofproto_dpif *p) > facet->tcp_flags |= stats->tcp_flags; > > subfacet_update_time(subfacet, stats->used); > - facet_account(facet, true); > + if (facet->accounted_bytes < facet->byte_count) { > + facet_learn(facet); > + facet_account(facet); > + facet->accounted_bytes = facet->byte_count; > + } > facet_push_stats(facet); > } else { > if (!VLOG_DROP_WARN(&rl)) { > @@ -3294,42 +3295,43 @@ facet_remove(struct facet *facet) > facet_free(facet); > } > > +/* Feed information from 'facet' back into the learning table to keep it in > + * sync with what is actually flowing through the datapath. */ > static void > -facet_account(struct facet *facet, bool may_flow_mod) > +facet_learn(struct facet *facet) > { > struct ofproto_dpif *ofproto = ofproto_dpif_cast(facet->rule->up.ofproto); > - uint64_t n_bytes; > - struct subfacet *subfacet; > - const struct nlattr *a; > - unsigned int left; > - ovs_be16 vlan_tci; > + struct action_xlate_ctx ctx; > > - if (facet->byte_count <= facet->accounted_bytes) { > + if (!facet->has_learn > + && !facet->has_normal > + && (!facet->has_fin_timeout > + || !(facet->tcp_flags & (TCP_FIN | TCP_RST)))) { > return; > } > - n_bytes = facet->byte_count - facet->accounted_bytes; > - facet->accounted_bytes = facet->byte_count; > - > - /* Feed information from the active flows back into the learning table to > - * ensure that table is always in sync with what is actually flowing > - * through the datapath. */ > - if (facet->has_learn || facet->has_normal > - || (facet->has_fin_timeout > - && facet->tcp_flags & (TCP_FIN | TCP_RST))) { > - struct action_xlate_ctx ctx; > > - action_xlate_ctx_init(&ctx, ofproto, &facet->flow, > - facet->flow.vlan_tci, > - facet->rule, facet->tcp_flags, NULL); > - ctx.may_learn_macs = true; > - ctx.may_flow_mod = may_flow_mod; > - ofpbuf_delete(xlate_actions(&ctx, facet->rule->up.actions, > - facet->rule->up.n_actions)); > - } > + action_xlate_ctx_init(&ctx, ofproto, &facet->flow, > + facet->flow.vlan_tci, > + facet->rule, facet->tcp_flags, NULL); > + ctx.may_learn = true; > + ofpbuf_delete(xlate_actions(&ctx, facet->rule->up.actions, > + facet->rule->up.n_actions)); > +} > + > +static void > +facet_account(struct facet *facet) > +{ > + struct ofproto_dpif *ofproto = > ofproto_dpif_cast(facet->rule->up.ofproto); > + struct subfacet *subfacet; > + const struct nlattr *a; > + unsigned int left; > + ovs_be16 vlan_tci; > + uint64_t n_bytes; > > if (!facet->has_normal || !ofproto->has_bonded_bundles) { > return; > } > + n_bytes = facet->byte_count - facet->accounted_bytes; > > /* This loop feeds byte counters to bond_account() for rebalancing to use > * as a basis. We also need to track the actual VLAN on which the packet > @@ -3396,7 +3398,10 @@ facet_flush_stats(struct facet *facet) > } > > facet_push_stats(facet); > - facet_account(facet, false); > + if (facet->accounted_bytes < facet->byte_count) { > + facet_account(facet); > + facet->accounted_bytes = facet->byte_count; > + } > > if (ofproto->netflow && !facet_is_controller_flow(facet)) { > struct ofexpired expired; > @@ -5025,7 +5030,7 @@ do_xlate_actions(const union ofp_action *in, size_t > n_in, > > case OFPUTIL_NXAST_LEARN: > ctx->has_learn = true; > - if (ctx->may_flow_mod) { > + if (ctx->may_learn) { > xlate_learn_action(ctx, (const struct nx_action_learn *) ia); > } > break; > @@ -5078,8 +5083,7 @@ action_xlate_ctx_init(struct action_xlate_ctx *ctx, > ctx->base_flow.vlan_tci = initial_tci; > ctx->rule = rule; > ctx->packet = packet; > - ctx->may_learn_macs = packet != NULL; > - ctx->may_flow_mod = packet != NULL; > + ctx->may_learn = packet != NULL; > ctx->tcp_flags = tcp_flags; > ctx->resubmit_hook = NULL; > } > @@ -5707,7 +5711,7 @@ xlate_normal(struct action_xlate_ctx *ctx) > } > > /* Learn source MAC. */ > - if (ctx->may_learn_macs) { > + if (ctx->may_learn) { > update_learning_table(ctx->ofproto, &ctx->flow, vlan, in_bundle); > } > > -- > 1.7.9 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev