I was a bit too fast, I had to add this incremental to make this patch compile:
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 184eb46..6549191 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -5143,7 +5143,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) COVERAGE_INC(xlate_actions); if (xin->recirc) { - const struct recirc_state *state = &xin->recirc->state; + const struct recirc_state *state = xin->recirc; xlate_report(&ctx, "Restoring state post-recirculation:"); Jarno > On Jan 20, 2016, at 4:39 PM, Jarno Rajahalme <ja...@ovn.org> 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