[ovs-dev] Can we trivially enable group chaining?
Ben Pfaff
blp at nicira.com
Sat Jun 6 05:45:57 UTC 2015
On Wed, Jun 03, 2015 at 04:02:43PM +0900, Takashi Yamamoto wrote:
> hi,
>
> On Wed, Jun 3, 2015 at 3:36 PM, Ben Pfaff <blp at nicira.com> wrote:
> > We have the following comment in ofproto-dpif-xlate.c:
> >
> > /* Prevent nested translation of OpenFlow groups.
> > *
> > * OpenFlow allows this restriction. We enforce this restriction only
> > * because, with the current architecture, we would otherwise have to
> > * take a possibly recursive read lock on the ofgroup rwlock, which is
> > * unsafe given that POSIX allows taking a read lock to block if there
> > * is a thread blocked on taking the write lock. Other solutions
> > * without this restriction are also possible, but seem unwarranted
> > * given the current limited use of groups. */
> >
> > But I think that the reasoning no longer holds. At the time the comment
> > was written, each ofgroup had its own internal rwlock, which was held
> > for reading whenever the ofgroup was being translated. Since then,
> > ofgroups have transitioned to using RCU for protection, and no rwlock is
> > held during translation.
> >
> > I think that, therefore, we can trivially enable group chaining with a
> > commit like this (untested):
> >
> > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> > index 71b8bef..ce90b2a 100644
> > --- a/ofproto/ofproto-dpif-xlate.c
> > +++ b/ofproto/ofproto-dpif-xlate.c
> > @@ -3302,33 +3302,9 @@ xlate_group_action__(struct xlate_ctx *ctx, struct group_dpif *group)
> > }
> >
> > static bool
> > -xlate_group_resource_check(struct xlate_ctx *ctx)
> > -{
> > - if (!xlate_resubmit_resource_check(ctx)) {
> > - return false;
> > - } else if (ctx->in_group) {
> > - /* Prevent nested translation of OpenFlow groups.
> > - *
> > - * OpenFlow allows this restriction. We enforce this restriction only
> > - * because, with the current architecture, we would otherwise have to
> > - * take a possibly recursive read lock on the ofgroup rwlock, which is
> > - * unsafe given that POSIX allows taking a read lock to block if there
> > - * is a thread blocked on taking the write lock. Other solutions
> > - * without this restriction are also possible, but seem unwarranted
> > - * given the current limited use of groups. */
> > - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
> > -
> > - VLOG_ERR_RL(&rl, "cannot recursively translate OpenFlow group");
> > - return false;
> > - } else {
> > - return true;
> > - }
> > -}
> > -
> > -static bool
> > xlate_group_action(struct xlate_ctx *ctx, uint32_t group_id)
> > {
> > - if (xlate_group_resource_check(ctx)) {
> > + if (xlate_resubmit_resource_check(ctx)) {
> > struct group_dpif *group;
> > bool got_group;
> >
> > Anyone know a reason this might be a bad idea?
>
> i think it's a good idea.
> in_group needs to be a counter if we allow recursion.
Thanks.
I posted a patch:
http://openvswitch.org/pipermail/dev/2015-June/056048.html
More information about the dev
mailing list