[ovs-dev] [xc 4/4] ofproto-dpif: Track relevant fields for wildcarding and add xout cache.
Ben Pfaff
blp at nicira.com
Thu Jun 6 22:48:48 UTC 2013
Thanks for all the improvements! They sound good to me.
On Thu, Jun 06, 2013 at 03:34:08PM -0700, Justin Pettit wrote:
> On Jun 5, 2013, at 10:43 PM, Ben Pfaff <blp at nicira.com> wrote:
>
> > "git am" says:
> >
> > Applying: ofproto-dpif: Track relevant fields for wildcarding and add xout cache.
> > /home/blp/ovs/.git/rebase-apply/patch:1342: trailing whitespace.
> > create_xc(const struct flow_wildcards *initial_wc,
> > warning: 1 line adds whitespace errors.
>
> Fixed.
>
> > There's a number of repetitions of this pattern:
> >
> > union mf_value mask_value;
> >
> > memset(&mask_value, 0xff, sizeof mask_value);
> > mf_set_flow_value(move->src.field, &mask_value, &wc->masks);
> >
> > Perhaps one could invent a helper function that follows this pattern,
> > e.g. "void mf_set_wildcards_fixed(const struct mf_field *, struct
> > flow_wildcards *);" or some such. (Maybe there'd need to be one for a
> > subfield too?)
>
> As we discussed off-line, we'll leave this as-is.
>
> > bond_choose_output_slave() needs a comment update.
>
> Added the following comment:
>
> * If 'wc' is non-NULL, bitwise-OR's 'wc' with the set of bits that were
> * significant in the selection. At some point earlier, 'wc' should
> * have been initialized (e.g., by flow_wildcards_init_catchall()).
>
> > The new logic in choose_output_slave() looks weird to me. It appears
> > that passing 'wc' in or not actually affects the bond's behavior,
> > which I didn't expect (I would have thought it would just affect
> > whether 'wc' gets updated):
> >
> > case BM_TCP:
> > + if (bond->lacp_status == LACP_NEGOTIATED && wc) {
> > + flow_mask_hash_fields(wc, NX_HASH_FIELDS_SYMMETRIC_L4);
> > + } else {
> > /* Must have LACP negotiations for TCP balanced bonds. */
> > return NULL;
> > }
> > /* Fall Through. */
>
> Ah, crap. You're right. I changed the logic to as follows:
>
> if (bond->lacp_status != LACP_NEGOTIATED) {
> /* Must have LACP negotiations for TCP balanced bonds. */
> return NULL;
> }
> if (wc) {
> flow_mask_hash_fields(wc, NX_HASH_FIELDS_SYMMETRIC_L4);
> }
>
> > learn_mask() could use a comment.
>
> I added the following:
>
> /* Perform a bitwise-OR on 'wc''s fields that are relevant as sources in
> * the learn action 'learn'. */
>
> > ofproto-dpif.c
> > --------------
> >
> > I would make this a full-width comment and possibly expand it (maybe
> > give an example?):
> >
> > + struct flow_wildcards wc; /* Relevant wildcards in translation.
> > + * Any fields that were used to
> > + * calculate the action must be set for
> > + * caching and megaflows to work. */
>
> I added the following:
>
> /* Wildcards relevant in translation. Any fields that were used to
> * calculate the action must be set for caching and megaflows to
> * work. For example, if the flow lookup involved performing the
> * "normal" action on IPv4 and ARP packets, 'wc' would have the
> * 'in_port' (always set), 'dl_type' (flow match), 'vlan_tci'
> * (normal action), and 'dl_dst' (normal action) fields set. */
>
> > I think that struct xout_cache could use a top-level comment
> > explaining its purpose and how it generally fits in with the rest of
> > the system.
>
> /* A cache of xlate_out (xout) translations. Facets that depend on the
> * same flow fields have the same xout entries, so the cache saves on
> * needless action translations and redundant copies of xout structures. */
>
> > What's the relationship between 'cr->match.flow' and 'flow' in
> > xout_cache? After skimming code very quickly, I think that 'flow' is
> > some particular flow that caused the cache entry to be created. But
> > isn't cr->match.flow also such a flow? The meaning of 'flow' probably
> > warrants a comment.
>
> It's used to feed into xlate_in_init() in xout_cache_push_stats(). Since we also store 'initial_vals' for the same purpose, I didn't know if it was worth translating from 'cr->match.flow's miniflow to a regular flow. However, since Ethan is planning to remove "initial_vals" everywhere, it probably makes sense to drop the 'flow' member.
>
> > I usually try to make comments help a little more to figure out how
> > stuff links together. For example:
> >
> > /* Membership in the xout cache. */
> > struct list xc_list_node; /* In owning xout_cache's 'facets' list. */
> > struct xout_cache *xc; /* Owning xout_cache. */
> >
> > and in the xout_cache:
> >
> > struct list facets; /* Contains 'struct facet's by 'xc_list_node'. */
> >
> > and in struct ofproto_dpif:
> >
> > /* xlate_out cache. */
> > struct classifier xout_cache; /* Contains "struct xout_cache"s. */
>
> Done. Thanks.
>
> > One property that isn't obvious at first glance is, when does a facet
> > have a xout_cache entry? Essentially all the time (I can see that it
> > can be without one at least temporarily after flushing or invalidating
> > the xout cache and before revalidating), or are there other
> > exceptions? Might be worth some commentary.
>
> This comment now describes the xc definition in facet:
>
> /* Membership in the xout cache.
> *
> * The facet should only be without a xout_cache for the brief time
> * between invalidating old cache entries and a call to
> * facet_revalidate() to repopulate it. */
>
> > Have you tried doing "make check-valgrind" on at least some tests to
> > check for memory leaks (and bugs)? It's a little time consuming
> > (takes several minutes, maybe half an hour? with TESTSUITEFLAGS=-j8)
> > but it can be useful especially for large changes.
>
> As mentioned last night, I fixed the single problem I found when running on ofproto-dpif.
>
> Thanks!
>
> --Justin
>
>
More information about the dev
mailing list