[ovs-dev] [PATCH v7 1/3] ofproto-dpif: Implement group callbacks
Simon Horman
horms at verge.net.au
Mon Oct 28 02:27:41 UTC 2013
On Mon, Oct 21, 2013 at 01:59:12PM -0700, Ben Pfaff wrote:
> On Tue, Oct 15, 2013 at 05:17:48PM +0900, Simon Horman wrote:
> > This is a first step towards implementing the dpif side of groups.
> >
> > In order to be useful the action translation code needs
> > to be taught about groups.
> >
> > Signed-off-by: Simon Horman <horms at verge.net.au>
>
> The code in group_get_stats() worries me. First, what's this? I
> don't see why one would expect to have "struct bucket_counter"s
> following the 'ogs' argument:
> struct bucket_counter *bc = (struct bucket_counter *)(ogs + 1);
Thanks, that is rather bogus. I have fixed
the code to just use ogs->bucket_stats directly.
> Second, if the following comment in group_get_stats() is correct, then
> I don't see how push_all_stats__() helps. If the group that
> group_get_stats() operates on can disappear then the right solution is
> to take some lock or increment some refcount in the caller:
> /* push_all_stats() can handle flow misses which, when using the learn
> * action, can cause groups to be added and deleted. This can corrupt our
> * caller's datastructures which assume that group_get_stats() doesn't have
> * an impact on the flow table. To be safe, we disable miss handling. */
> push_all_stats__(false);
I believe that is a copy-paste error as I based the groups code, in part,
on the rules code. I have removed it.
With regards to locking to prevent the group disappearing,
I believe that is handled by up.group->rwlock being held
by the caller.
>
> Here are some tiny style fixes you can fold in:
>
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index b0c358a..470e455 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -4827,7 +4827,7 @@ group_dealloc(struct ofgroup *group_)
>
> static void
> group_construct_stats(struct group_dpif *group)
> - OVS_REQUIRES(&group->stats_mutex)
> + OVS_REQUIRES(group->stats_mutex)
> {
> group->packet_count = 0;
> group->byte_count = 0;
> @@ -4853,7 +4853,7 @@ group_construct(struct ofgroup *group_)
>
> static void
> group_destruct__(struct group_dpif *group)
> - OVS_REQUIRES(&group->stats_mutex)
> + OVS_REQUIRES(group->stats_mutex)
> {
> free(group->bucket_stats);
> group->bucket_stats = NULL;
> @@ -4885,7 +4885,6 @@ group_modify(struct ofgroup *group_, struct ofgroup *victim_)
> return 0;
> }
>
> -
> static enum ofperr
> group_get_stats(const struct ofgroup *group_, struct ofputil_group_stats *ogs)
> {
>
Thanks, I will include those changes in the next post.
More information about the dev
mailing list