Just confirm, with the initialization, the intermittent test failures
(relate to ofproto-dpif megaflow tests) are gone.


On Wed, Dec 11, 2013 at 6:27 PM, Ethan Jackson <et...@nicira.com> wrote:

> Btw to whoever reviews this, this version of the patch fails to
> initialize skip_wildcards in xlate_in_init().
>
> Ethan
>
> On Sun, Dec 8, 2013 at 6:45 PM, Ethan Jackson <et...@nicira.com> wrote:
> > As time goes on and the classifier becomes more complicated, calculate
> > the wildcard mask will get more and more expensive.  This patch adds a
> > mechanism to xlate_actions() allowing callers to disable wildcard
> > calculation when it isn't really necessary.  Used in future patches.
> >
> > Signed-off-by: Ethan Jackson <et...@nicira.com>
> > ---
> >  ofproto/ofproto-dpif-xlate.c | 10 ++++++----
> >  ofproto/ofproto-dpif-xlate.h |  6 ++++++
> >  2 files changed, 12 insertions(+), 4 deletions(-)
> >
> > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> > index da03f06..58ec484 100644
> > --- a/ofproto/ofproto-dpif-xlate.c
> > +++ b/ofproto/ofproto-dpif-xlate.c
> > @@ -1870,9 +1870,10 @@ xlate_table_action(struct xlate_ctx *ctx,
> >                     ofp_port_t in_port, uint8_t table_id, bool
> may_packet_in)
> >  {
> >      if (xlate_resubmit_resource_check(ctx)) {
> > -        struct rule_dpif *rule;
> >          ofp_port_t old_in_port = ctx->xin->flow.in_port.ofp_port;
> > +        bool skip_wildcards = ctx->xin->skip_wildcards;
> >          uint8_t old_table_id = ctx->table_id;
> > +        struct rule_dpif *rule;
> >
> >          ctx->table_id = table_id;
> >
> > @@ -1880,8 +1881,8 @@ xlate_table_action(struct xlate_ctx *ctx,
> >           * original input port (otherwise OFPP_NORMAL and OFPP_IN_PORT
> will
> >           * have surprising behavior). */
> >          ctx->xin->flow.in_port.ofp_port = in_port;
> > -        rule_dpif_lookup_in_table(ctx->xbridge->ofproto,
> > -                                  &ctx->xin->flow, &ctx->xout->wc,
> > +        rule_dpif_lookup_in_table(ctx->xbridge->ofproto,
> &ctx->xin->flow,
> > +                                  !skip_wildcards ? &ctx->xout->wc :
> NULL,
> >                                    table_id, &rule);
> >          ctx->xin->flow.in_port.ofp_port = old_in_port;
> >
> > @@ -3077,7 +3078,8 @@ xlate_actions__(struct xlate_in *xin, struct
> xlate_out *xout)
> >      ctx.mpls_depth_delta = 0;
> >
> >      if (!xin->ofpacts && !ctx.rule) {
> > -        rule_dpif_lookup(ctx.xbridge->ofproto, flow, wc, &rule);
> > +        rule_dpif_lookup(ctx.xbridge->ofproto, flow,
> > +                         !xin->skip_wildcards ? wc : NULL, &rule);
> >          if (ctx.xin->resubmit_stats) {
> >              rule_dpif_credit_stats(rule, ctx.xin->resubmit_stats);
> >          }
> > diff --git a/ofproto/ofproto-dpif-xlate.h b/ofproto/ofproto-dpif-xlate.h
> > index f4ef1e1..68076ca 100644
> > --- a/ofproto/ofproto-dpif-xlate.h
> > +++ b/ofproto/ofproto-dpif-xlate.h
> > @@ -73,6 +73,12 @@ struct xlate_in {
> >       * not if we are just revalidating. */
> >      bool may_learn;
> >
> > +    /* If the caller of xlate_actions() doesn't need the flow_wildcards
> > +     * contained in struct xlate_out.  'skip_wildcards' can be set to
> true
> > +     * disabling the expensive wildcard computation.  When true, 'wc'
> in struct
> > +     * xlate_out is undefined and should not be read. */
> > +    bool skip_wildcards;
> > +
> >      /* The rule initiating translation or NULL. If both 'rule' and
> 'ofpacts'
> >       * are NULL, xlate_actions() will do the initial rule lookup
> itself. */
> >      struct rule_dpif *rule;
> > --
> > 1.8.1.2
> >
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to