[ovs-dev] [PATCH 1/6] revalidator: Refactor ukey->xout translation.
Joe Stringer
joe at ovn.org
Wed Sep 21 01:47:30 UTC 2016
This patch shifts the code that directly calls xlate into a separate
function, xlate_ukey().
Signed-off-by: Joe Stringer <joe at ovn.org>
---
ofproto/ofproto-dpif-upcall.c | 110 ++++++++++++++++++++++++++++--------------
1 file changed, 73 insertions(+), 37 deletions(-)
diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index eecea5373c82..67b28d9ccb53 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -1820,6 +1820,66 @@ should_revalidate(const struct udpif *udpif, uint64_t packets,
return false;
}
+struct reval_context {
+ /* Optional output parameters */
+ struct flow_wildcards *wc;
+ struct ofpbuf *odp_actions;
+ struct netflow **netflow;
+
+ /* Required output parameters */
+ struct xlate_out xout;
+ struct flow flow;
+};
+
+/* Translates 'ukey->key' into a flow, populating 'ctx' as it goes along.
+ *
+ * Returns 0 on success, otherwise a positive errno value.
+ *
+ * The caller is responsible for uninitializing ctx->xout on success.
+ */
+static int
+xlate_ukey(struct udpif *udpif, struct udpif_key *ukey,
+ const struct dpif_flow_stats *push, struct reval_context *ctx,
+ bool need_revalidate)
+ OVS_REQUIRES(ukey->mutex)
+{
+ struct ofproto_dpif *ofproto;
+ ofp_port_t ofp_in_port;
+ struct xlate_in xin;
+ int error;
+
+ if (odp_flow_key_to_flow(ukey->key, ukey->key_len, &ctx->flow)
+ == ODP_FIT_ERROR) {
+ return EINVAL;
+ }
+
+ error = xlate_lookup(udpif->backer, &ctx->flow, &ofproto, NULL, NULL,
+ ctx->netflow, &ofp_in_port);
+ if (error) {
+ return error;
+ }
+
+ if (need_revalidate) {
+ xlate_cache_clear(ukey->xcache);
+ }
+ if (!ukey->xcache) {
+ ukey->xcache = xlate_cache_new();
+ }
+
+ xlate_in_init(&xin, ofproto, ofproto_dpif_get_tables_version(ofproto),
+ &ctx->flow, ofp_in_port, NULL, push->tcp_flags,
+ NULL, need_revalidate ? ctx->wc : NULL, ctx->odp_actions);
+ if (push->n_packets) {
+ xin.resubmit_stats = push;
+ xin.allow_side_effects = true;
+ }
+ xin.xcache = ukey->xcache;
+ xlate_actions(&xin, &ctx->xout);
+
+ return 0;
+}
+
+
/* Verifies that the datapath actions of 'ukey' are still correct, and pushes
* 'stats' for it.
*
@@ -1845,18 +1905,18 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey,
struct recirc_refs *recircs)
OVS_REQUIRES(ukey->mutex)
{
- struct xlate_out xout, *xoutp;
+ struct xlate_out *xoutp;
struct netflow *netflow;
- struct ofproto_dpif *ofproto;
struct dpif_flow_stats push;
- struct flow flow;
struct flow_wildcards dp_mask, wc;
enum reval_result result;
- ofp_port_t ofp_in_port;
- struct xlate_in xin;
long long int last_used;
- int error;
bool need_revalidate;
+ struct reval_context ctx = {
+ .odp_actions = odp_actions,
+ .netflow = &netflow,
+ .wc = &wc,
+ };
result = UKEY_DELETE;
xoutp = NULL;
@@ -1892,48 +1952,24 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey,
goto exit;
}
- if (odp_flow_key_to_flow(ukey->key, ukey->key_len, &flow)
- == ODP_FIT_ERROR) {
- goto exit;
- }
-
- error = xlate_lookup(udpif->backer, &flow, &ofproto, NULL, NULL, &netflow,
- &ofp_in_port);
- if (error) {
+ if (xlate_ukey(udpif, ukey, &push, &ctx, need_revalidate)) {
goto exit;
}
-
- if (need_revalidate) {
- xlate_cache_clear(ukey->xcache);
- }
- if (!ukey->xcache) {
- ukey->xcache = xlate_cache_new();
- }
-
- xlate_in_init(&xin, ofproto, ofproto_dpif_get_tables_version(ofproto),
- &flow, ofp_in_port, NULL, push.tcp_flags,
- NULL, need_revalidate ? &wc : NULL, odp_actions);
- if (push.n_packets) {
- xin.resubmit_stats = &push;
- xin.allow_side_effects = true;
- }
- xin.xcache = ukey->xcache;
- xlate_actions(&xin, &xout);
- xoutp = &xout;
+ xoutp = &ctx.xout;
if (!need_revalidate) {
result = UKEY_KEEP;
goto exit;
}
- if (xout.slow) {
+ if (xoutp->slow) {
ofpbuf_clear(odp_actions);
- compose_slow_path(udpif, &xout, &flow, flow.in_port.odp_port,
+ compose_slow_path(udpif, xoutp, &ctx.flow, ctx.flow.in_port.odp_port,
odp_actions);
}
if (odp_flow_key_to_mask(ukey->mask, ukey->mask_len, ukey->key,
- ukey->key_len, &dp_mask, &flow)
+ ukey->key_len, &dp_mask, &ctx.flow)
== ODP_FIT_ERROR) {
goto exit;
}
@@ -1943,7 +1979,7 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey,
* tells that the datapath flow is now too generic and must be narrowed
* down. Note that we do not know if the datapath has ignored any of the
* wildcarded bits, so we may be overtly conservative here. */
- if (flow_wildcards_has_extra(&dp_mask, &wc)) {
+ if (flow_wildcards_has_extra(&dp_mask, ctx.wc)) {
goto exit;
}
@@ -1964,7 +2000,7 @@ exit:
ukey->reval_seq = reval_seq;
}
if (netflow && result == UKEY_DELETE) {
- netflow_flow_clear(netflow, &flow);
+ netflow_flow_clear(netflow, &ctx.flow);
}
xlate_out_uninit(xoutp);
return result;
--
2.9.3
More information about the dev
mailing list