Thanks Ryan, it is pretty close.  Please see my comments below:

One high level comment is that, we assume new_xcfg is non-null.  Could we
add assertion to the
external functions? e.g. xlate_ofport_remove()




>
@@ -324,10 +332,76 @@ static bool dscp_from_skb_priority(const struct xport
> *, uint32_t skb_priority,
>
>  static struct xc_entry *xlate_cache_add_entry(struct xlate_cache *xc,
>                                                enum xc_type type);
> +static void xlate_xbridge_init(struct xbridge *);
> +static void xlate_xbundle_init(struct xbundle *);
> +static void xlate_xport_init(struct xport *);
>



Could we add the xlate_cfg as input argument here?  Even though we always
insert to the new_xcfg,
I think adding it makes it clear.




> @@ -339,17 +413,6 @@ xlate_ofproto_set(struct ofproto_dpif *ofproto, const
> char *name,
>                    bool variable_length_userdata,
>                    size_t max_mpls_depth)
>  {
> -    struct xbridge *xbridge = xbridge_lookup(ofproto);
> -
> -    if (!xbridge) {
> -        xbridge = xzalloc(sizeof *xbridge);
> -        xbridge->ofproto = ofproto;
> -
> -        hmap_insert(&xbridges, &xbridge->hmap_node, hash_pointer(ofproto,
> 0));
> -        hmap_init(&xbridge->xports);
> -        list_init(&xbridge->xbundles);
> -    }
> -
>      if (xbridge->ml != ml) {
>          mac_learning_unref(xbridge->ml);
>          xbridge->ml = mac_learning_ref(ml);
> @@ -380,7 +443,6 @@ xlate_ofproto_set(struct ofproto_dpif *ofproto, const
> char *name,
>          xbridge->netflow = netflow_ref(netflow);
>      }
>
> -    free(xbridge->name);
>      xbridge->name = xstrdup(name);
>
>


I think it is better to keep the name copy and free together.  Either
inside or outside the xlate_x*_set().





>    static void
>  +xlate_xbridge_copy(struct xbridge *xbridge)
> +{
> +    struct xbundle *xbundle;
> +    struct xport *xport;
> +    struct xbridge *new_xbridge = xzalloc(sizeof *xbridge);
> +    new_xbridge->ofproto = xbridge->ofproto;
> +    xlate_xbridge_init(new_xbridge);
> +
> +    xlate_xbridge_set(new_xbridge, xbridge->name,
> +                      xbridge->dpif, xbridge->miss_rule,
> +                      xbridge->no_packet_in_rule, xbridge->ml,
> xbridge->stp,
> +                      xbridge->mbridge, xbridge->sflow, xbridge->ipfix,
> +                      xbridge->netflow, xbridge->frag,
> xbridge->forward_bpdu,
> +                      xbridge->has_in_band, xbridge->enable_recirc,
> +                      xbridge->variable_length_userdata,
> +                      xbridge->max_mpls_depth);
> +    LIST_FOR_EACH (xbundle, list_node, &xbridge->xbundles) {
> +        xlate_xbundle_copy(new_xbridge, xbundle);
> +    }
> +
> +    HMAP_FOR_EACH (xport, ofp_node, &xbridge->xports) {
> +        if (!xport->xbundle) {
> +            xlate_xport_copy(new_xbridge, NULL, xport);
> +        }
> +    }
> +}
> +
>



maybe a comment here explaining why we need to check "!xport->xbundle"?





> +
> +/* Sets the current xlate configuration to new_xcfg and frees the old
> xlate
> + * configuration in xcfgp.
> + *
> + * This needs to be called after editing the xlate configuration.
> + *
> + * Functions that edit the new xlate configuration are
> + * xlate_<ofport/bundle/ofport>_set and
> xlate_<ofport/bundle/ofport>_remove.
> + *
> + * A sample workflow:
> + *
> + * xlate_init_new_xcfg();
> + * ...
> + * edit_xlate_configuration();
> + * ...
> + * xlate_set_new_xcfg(); */
> +void
> +xlate_set_new_xcfg()
> +{
> +    struct xlate_cfg *xcfg = ovsrcu_get(struct xlate_cfg *, &xcfgp);
> +
> +    ovsrcu_set(&xcfgp, new_xcfg);
> +    ovsrcu_postpone(xlate_xcfg_free, xcfg);
> +}
>



Maybe nitpicking, could we move xlate_set_new_xcfg() after
xlate_init_new_xcfg()?
 And avoid the
comment duplication?



 --
> 1.7.9.5
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



Again, it is really glad to see the xlate_rwlock gone.!


Acked-by: Alex Wang <al...@nicira.com>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to