I've already reviewed this one, last time I looked at it I thought it was fine.

Ethan

On Fri, Aug 19, 2011 at 15:28, Ben Pfaff <b...@nicira.com> wrote:
> Currently this only gets checked for incoming OpenFlow OFPT_FLOW_MOD
> messages, so it's hard to imagine it being any kind of bottleneck, but the
> NXAST_LEARN action that is soon to be added will be able to create flows
> more quickly than we normally expect from a controller.  (On the other
> hand, ofproto-dpif, outside of a special testing mode, always completes
> operations immediately, so 'pending' will always have length 0.  But this
> change still feels right to me for some reason.)
> ---
>  ofproto/ofproto-provider.h |    1 +
>  ofproto/ofproto.c          |    8 +++++++-
>  2 files changed, 8 insertions(+), 1 deletions(-)
>
> diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
> index 037dbae..9c53657 100644
> --- a/ofproto/ofproto-provider.h
> +++ b/ofproto/ofproto-provider.h
> @@ -63,6 +63,7 @@ struct ofproto {
>     /* Flow table operation tracking. */
>     int state;                  /* Internal state. */
>     struct list pending;        /* List of "struct ofopgroup"s. */
> +    unsigned int n_pending;     /* list_size(&pending). */
>     struct hmap deletions;      /* All OFOPERATION_DELETE "ofoperation"s. */
>  };
>
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index 849a376..a34db45 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -338,6 +338,7 @@ ofproto_create(const char *datapath_name, const char 
> *datapath_type,
>     ofproto->connmgr = connmgr_create(ofproto, datapath_name, datapath_name);
>     ofproto->state = S_OPENFLOW;
>     list_init(&ofproto->pending);
> +    ofproto->n_pending = 0;
>     hmap_init(&ofproto->deletions);
>
>     error = ofproto->ofproto_class->construct(ofproto, &n_tables);
> @@ -713,6 +714,7 @@ ofproto_destroy__(struct ofproto *ofproto)
>     struct classifier *table;
>
>     assert(list_is_empty(&ofproto->pending));
> +    assert(!ofproto->n_pending);
>
>     connmgr_destroy(ofproto->connmgr);
>
> @@ -2456,7 +2458,8 @@ handle_flow_mod(struct ofconn *ofconn, const struct 
> ofp_header *oh)
>         return error;
>     }
>
> -    if (list_size(&ofproto->pending) >= 50) {
> +    if (ofproto->n_pending >= 50) {
> +        assert(!list_is_empty(&ofproto->pending));
>         return OFPROTO_POSTPONE;
>     }
>
> @@ -2759,6 +2762,7 @@ ofopgroup_submit(struct ofopgroup *group)
>         ofopgroup_destroy(group);
>     } else {
>         list_push_back(&group->ofproto->pending, &group->ofproto_node);
> +        group->ofproto->n_pending++;
>     }
>  }
>
> @@ -2767,6 +2771,8 @@ ofopgroup_destroy(struct ofopgroup *group)
>  {
>     assert(list_is_empty(&group->ops));
>     if (!list_is_empty(&group->ofproto_node)) {
> +        assert(group->ofproto->n_pending > 0);
> +        group->ofproto->n_pending--;
>         list_remove(&group->ofproto_node);
>     }
>     if (!list_is_empty(&group->ofconn_node)) {
> --
> 1.7.4.4
>
> _______________________________________________
> 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