We're going to need to introduce another member in struct udpif_key very similar to 'struct recirc_refs', so this will make next commit easier.
No functional change. Signed-off-by: Daniele Di Proietto <[email protected]> --- ofproto/ofproto-dpif-upcall.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 660383fae..35b5b7533 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -249,6 +249,13 @@ enum ukey_state { }; #define N_UKEY_STATES (UKEY_DELETED + 1) +/* Each udpif_key can hold reference to global objects in an ofproto. These + * references are stored here. */ +struct ukey_refs { + struct recirc_refs recircs; /* Action recirc IDs with references held. */ +}; +#define UKEY_REFS_INIT {RECIRC_REFS_EMPTY_INITIALIZER} + /* 'udpif_key's are responsible for tracking the little bit of state udpif * needs to do flow expiration which can't be pulled directly from the * datapath. They may be created by any handler or revalidator thread at any @@ -294,7 +301,7 @@ struct udpif_key { } keybuf, maskbuf; uint32_t key_recirc_id; /* Non-zero if reference is held by the ukey. */ - struct recirc_refs recircs; /* Action recirc IDs with references held. */ + struct ukey_refs global_refs; }; /* Datapath operation with optional ukey attached. */ @@ -1487,10 +1494,10 @@ ukey_create__(const struct nlattr *key, size_t key_len, ukey->xcache = NULL; ukey->key_recirc_id = key_recirc_id; - recirc_refs_init(&ukey->recircs); + recirc_refs_init(&ukey->global_refs.recircs); if (xout) { /* Take ownership of the action recirc id references. */ - recirc_refs_swap(&ukey->recircs, &xout->recircs); + recirc_refs_swap(&ukey->global_refs.recircs, &xout->recircs); } return ukey; @@ -1781,7 +1788,7 @@ ukey_delete__(struct udpif_key *ukey) if (ukey->key_recirc_id) { recirc_free_id(ukey->key_recirc_id); } - recirc_refs_unref(&ukey->recircs); + recirc_refs_unref(&ukey->global_refs.recircs); xlate_cache_delete(ukey->xcache); ofpbuf_delete(ovsrcu_get(struct ofpbuf *, &ukey->actions)); ovs_mutex_destroy(&ukey->mutex); @@ -1926,7 +1933,7 @@ populate_xcache(struct udpif *udpif, struct udpif_key *ukey, static enum reval_result revalidate_ukey__(struct udpif *udpif, const struct udpif_key *ukey, uint16_t tcp_flags, struct ofpbuf *odp_actions, - struct recirc_refs *recircs, struct xlate_cache *xcache) + struct ukey_refs *global_refs, struct xlate_cache *xcache) { struct xlate_out *xoutp; struct netflow *netflow; @@ -1974,7 +1981,7 @@ revalidate_ukey__(struct udpif *udpif, const struct udpif_key *ukey, * Let's modify it in place. */ result = UKEY_MODIFY; /* Transfer recirc action ID references to the caller. */ - recirc_refs_swap(recircs, &xoutp->recircs); + recirc_refs_swap(&global_refs->recircs, &xoutp->recircs); goto exit; } @@ -2010,7 +2017,7 @@ static enum reval_result revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey, const struct dpif_flow_stats *stats, struct ofpbuf *odp_actions, uint64_t reval_seq, - struct recirc_refs *recircs) + struct ukey_refs *global_refs) OVS_REQUIRES(ukey->mutex) { bool need_revalidate = ukey->reval_seq != reval_seq; @@ -2036,7 +2043,7 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey, xlate_cache_clear(ukey->xcache); } result = revalidate_ukey__(udpif, ukey, push.tcp_flags, - odp_actions, recircs, ukey->xcache); + odp_actions, global_refs, ukey->xcache); } /* else delete; too expensive to revalidate */ } else if (!push.n_packets || ukey->xcache || !populate_xcache(udpif, ukey, push.tcp_flags)) { @@ -2212,7 +2219,7 @@ log_unexpected_flow(const struct dpif_flow *flow, int error) static void reval_op_init(struct ukey_op *op, enum reval_result result, struct udpif *udpif, struct udpif_key *ukey, - struct recirc_refs *recircs, struct ofpbuf *odp_actions) + struct ukey_refs *global_refs, struct ofpbuf *odp_actions) OVS_REQUIRES(ukey->mutex) { if (result == UKEY_DELETE) { @@ -2220,9 +2227,9 @@ reval_op_init(struct ukey_op *op, enum reval_result result, transition_ukey(ukey, UKEY_EVICTING); } else if (result == UKEY_MODIFY) { /* Store the new recircs. */ - recirc_refs_swap(&ukey->recircs, recircs); + recirc_refs_swap(&ukey->global_refs.recircs, &global_refs->recircs); /* Release old recircs. */ - recirc_refs_unref(recircs); + recirc_refs_unref(&global_refs->recircs); /* ukey->key_recirc_id remains, as the key is the same as before. */ ukey_set_actions(ukey, odp_actions); @@ -2283,7 +2290,7 @@ revalidate(struct revalidator *revalidator) for (f = flows; f < &flows[n_dumped]; f++) { long long int used = f->stats.used; - struct recirc_refs recircs = RECIRC_REFS_EMPTY_INITIALIZER; + struct ukey_refs global_refs = UKEY_REFS_INIT; enum reval_result result; struct udpif_key *ukey; bool already_dumped; @@ -2326,13 +2333,13 @@ revalidate(struct revalidator *revalidator) result = UKEY_DELETE; } else { result = revalidate_ukey(udpif, ukey, &f->stats, &odp_actions, - reval_seq, &recircs); + reval_seq, &global_refs); } ukey->dump_seq = dump_seq; if (result != UKEY_KEEP) { /* Takes ownership of 'recircs'. */ - reval_op_init(&ops[n_ops++], result, udpif, ukey, &recircs, + reval_op_init(&ops[n_ops++], result, udpif, ukey, &global_refs, &odp_actions); } ovs_mutex_unlock(&ukey->mutex); @@ -2392,7 +2399,7 @@ revalidator_sweep__(struct revalidator *revalidator, bool purge) ukey_state = ukey->state; if (ukey_state == UKEY_OPERATIONAL || (ukey_state == UKEY_VISIBLE && purge)) { - struct recirc_refs recircs = RECIRC_REFS_EMPTY_INITIALIZER; + struct ukey_refs global_refs = UKEY_REFS_INIT; bool seq_mismatch = (ukey->dump_seq != dump_seq && ukey->reval_seq != reval_seq); enum reval_result result; @@ -2406,12 +2413,12 @@ revalidator_sweep__(struct revalidator *revalidator, bool purge) COVERAGE_INC(revalidate_missed_dp_flow); memset(&stats, 0, sizeof stats); result = revalidate_ukey(udpif, ukey, &stats, &odp_actions, - reval_seq, &recircs); + reval_seq, &global_refs); } if (result != UKEY_KEEP) { /* Clears 'recircs' if filled by revalidate_ukey(). */ - reval_op_init(&ops[n_ops++], result, udpif, ukey, &recircs, - &odp_actions); + reval_op_init(&ops[n_ops++], result, udpif, ukey, + &global_refs, &odp_actions); } } ovs_mutex_unlock(&ukey->mutex); -- 2.11.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
