Thanks.  I applied this to master.

On Thu, Jan 21, 2016 at 01:09:29PM -0800, Jarno Rajahalme wrote:
> Sounds like a plan,
> 
>   Jarno
> 
> > On Jan 21, 2016, at 8:42 AM, Ben Pfaff <b...@ovn.org> wrote:
> > 
> > I think I'd be more comfortable letting you figure that out, if that's
> > OK, and just stick to the compromise we have here for the moment.
> > 
> > On Wed, Jan 20, 2016 at 05:46:31PM -0800, Jarno Rajahalme wrote:
> >> I did not look at the details yet, but basically the reference would be 
> >> released if gotten initially and not taken for the flow install.
> >> 
> >>  Jarno
> >> 
> >>> On Jan 20, 2016, at 4:59 PM, Ben Pfaff <b...@ovn.org> wrote:
> >>> 
> >>> I think I like the idea of only needing a recirc_state in that code, but
> >>> I don't think I fully understand yet.  I guess it's pretty easy to make
> >>> xlate_in_init() take the reference and pass back the recirc_state
> >>> instead of the recirc_id_node, but where would the eventual release of
> >>> the reference happen?
> >>> 
> >>> On Wed, Jan 20, 2016 at 04:39:12PM -0800, Jarno Rajahalme wrote:
> >>>> Maybe ofproto-dpif-upcall.c could be refactored to not need the
> >>>> recirc_id_node pointer. It is only used for getting the recirc ID and
> >>>> managing recirc_id_node reference counting. If the reference counting
> >>>> could be moved upstream, the pointer could be removed. But the idea
> >>>> was to take a reference only if needed (e.g., when installing a
> >>>> recirculated flow), as taking a reference is extra cost if we are only
> >>>> executing the packet, or deciding not to install a flow for any other
> >>>> reason. However, the typical case is that we install a flow for a miss
> >>>> upcall, so maybe it is not worth optimizing for the exceptional cases?
> >>>> 
> >>>> Acked-by: Jarno Rajahalme <ja...@ovn.org>
> >>>> 
> >>>>> On Jan 18, 2016, at 11:27 PM, Ben Pfaff <b...@ovn.org> wrote:
> >>>>> 
> >>>>> This will make it possible, in an upcoming commit, to construct a
> >>>>> recirc_state locally on the stack to pass to xlate_actions().  It would
> >>>>> also be possible to construct and pass a recirc_id_node on the stack, 
> >>>>> but
> >>>>> the translation process only uses the recirc_state anyway.  The 
> >>>>> alternative
> >>>>> here of having upcall_xlate() know that it can recover the 
> >>>>> recirc_id_node
> >>>>> from the recirc_state isn't great either; it's debatable which is the
> >>>>> better approach.
> >>>>> 
> >>>>> Signed-off-by: Ben Pfaff <b...@ovn.org>
> >>>>> ---
> >>>>> ofproto/ofproto-dpif-rid.h    |  6 ++++++
> >>>>> ofproto/ofproto-dpif-upcall.c |  4 ++--
> >>>>> ofproto/ofproto-dpif-xlate.c  | 11 ++++++++---
> >>>>> ofproto/ofproto-dpif-xlate.h  |  2 +-
> >>>>> 4 files changed, 17 insertions(+), 6 deletions(-)
> >>>>> 
> >>>>> diff --git a/ofproto/ofproto-dpif-rid.h b/ofproto/ofproto-dpif-rid.h
> >>>>> index 04ec037..85ec24a 100644
> >>>>> --- a/ofproto/ofproto-dpif-rid.h
> >>>>> +++ b/ofproto/ofproto-dpif-rid.h
> >>>>> @@ -184,6 +184,12 @@ void recirc_free_ofproto(struct ofproto_dpif *, 
> >>>>> const char *ofproto_name);
> >>>>> 
> >>>>> const struct recirc_id_node *recirc_id_node_find(uint32_t recirc_id);
> >>>>> 
> >>>>> +static inline struct recirc_id_node *
> >>>>> +recirc_id_node_from_state(const struct recirc_state *state)
> >>>>> +{
> >>>>> +    return CONTAINER_OF(state, struct recirc_id_node, state);
> >>>>> +}
> >>>>> +
> >>>>> static inline bool recirc_id_node_try_ref_rcu(const struct 
> >>>>> recirc_id_node *n_)
> >>>>> {
> >>>>>   struct recirc_id_node *node = CONST_CAST(struct recirc_id_node *, n_);
> >>>>> diff --git a/ofproto/ofproto-dpif-upcall.c 
> >>>>> b/ofproto/ofproto-dpif-upcall.c
> >>>>> index b505206..240bd92 100644
> >>>>> --- a/ofproto/ofproto-dpif-upcall.c
> >>>>> +++ b/ofproto/ofproto-dpif-upcall.c
> >>>>> @@ -1074,8 +1074,8 @@ upcall_xlate(struct udpif *udpif, struct upcall 
> >>>>> *upcall,
> >>>>>            * upcalls using recirculation ID for which no context can be
> >>>>>            * found).  We may still execute the flow's actions even if we
> >>>>>            * don't install the flow. */
> >>>>> -            upcall->recirc = xin.recirc;
> >>>>> -            upcall->have_recirc_ref = 
> >>>>> recirc_id_node_try_ref_rcu(xin.recirc);
> >>>>> +            upcall->recirc = recirc_id_node_from_state(xin.recirc);
> >>>>> +            upcall->have_recirc_ref = 
> >>>>> recirc_id_node_try_ref_rcu(upcall->recirc);
> >>>>>       }
> >>>>>   } else {
> >>>>>       /* For non-miss upcalls, we are either executing actions (one of 
> >>>>> which
> >>>>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> >>>>> index 8ab4b2a..184eb46 100644
> >>>>> --- a/ofproto/ofproto-dpif-xlate.c
> >>>>> +++ b/ofproto/ofproto-dpif-xlate.c
> >>>>> @@ -4828,9 +4828,14 @@ xlate_in_init(struct xlate_in *xin, struct 
> >>>>> ofproto_dpif *ofproto,
> >>>>>   xin->odp_actions = odp_actions;
> >>>>> 
> >>>>>   /* Do recirc lookup. */
> >>>>> -    xin->recirc = flow->recirc_id
> >>>>> -        ? recirc_id_node_find(flow->recirc_id)
> >>>>> -        : NULL;
> >>>>> +    xin->recirc = NULL;
> >>>>> +    if (flow->recirc_id) {
> >>>>> +        const struct recirc_id_node *node
> >>>>> +            = recirc_id_node_find(flow->recirc_id);
> >>>>> +        if (node) {
> >>>>> +            xin->recirc = &node->state;
> >>>>> +        }
> >>>>> +    }
> >>>>> }
> >>>>> 
> >>>>> void
> >>>>> diff --git a/ofproto/ofproto-dpif-xlate.h b/ofproto/ofproto-dpif-xlate.h
> >>>>> index a135d8f..3b06285 100644
> >>>>> --- a/ofproto/ofproto-dpif-xlate.h
> >>>>> +++ b/ofproto/ofproto-dpif-xlate.h
> >>>>> @@ -142,7 +142,7 @@ struct xlate_in {
> >>>>> 
> >>>>>   /* The recirculation context related to this translation, as returned 
> >>>>> by
> >>>>>    * xlate_lookup. */
> >>>>> -    const struct recirc_id_node *recirc;
> >>>>> +    const struct recirc_state *recirc;
> >>>>> };
> >>>>> 
> >>>>> void xlate_ofproto_set(struct ofproto_dpif *, const char *name, struct 
> >>>>> dpif *,
> >>>>> -- 
> >>>>> 2.1.3
> >>>>> 
> >>>>> _______________________________________________
> >>>>> 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