From 72310b041cfa7d8e2ee5fb585348223ac7c22497 Mon Sep 17 00:00:00 2001 From: Joe Stringer Date: Wed, 5 Mar 2014 16:56:05 -0800 Subject: [PATCH] upcall: Configure datapath max-idle through ovs-vsctl. This patch adds a new configuration option, "max-idle" to the Open_vSwitch "other-config" column. This sets how long datapath flows are cached in the datapath before revalidators expire them. Signed-off-by: Joe Stringer Signed-off-by: Justin Pettit --- ofproto/ofproto-dpif-upcall.c | 5 ++--- ofproto/ofproto-provider.h | 5 +++++ ofproto/ofproto.c | 9 +++++++++ ofproto/ofproto.h | 2 ++ vswitchd/bridge.c | 2 ++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 7dbd7f7e2..0d5b25189 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -41,7 +41,6 @@ #define MAX_QUEUE_LENGTH 512 #define FLOW_MISS_MAX_BATCH 50 #define REVALIDATE_MAX_BATCH 50 -#define MAX_IDLE 1500 VLOG_DEFINE_THIS_MODULE(ofproto_dpif_upcall); @@ -646,7 +645,7 @@ udpif_flow_dumper(void *arg) } skip: - poll_timer_wait_until(start_time + MIN(MAX_IDLE, 500)); + poll_timer_wait_until(start_time + MIN(ofproto_max_idle, 500)); seq_wait(udpif->reval_seq, udpif->last_reval_seq); latch_wait(&udpif->exit_latch); poll_block(); @@ -1510,7 +1509,7 @@ revalidate_udumps(struct revalidator *revalidator, struct list *udumps) n_flows = udpif_get_n_flows(udpif); must_del = false; - max_idle = MAX_IDLE; + max_idle = ofproto_max_idle; if (n_flows > flow_limit) { must_del = n_flows > 2 * flow_limit; max_idle = 100; diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 2c72fbcf6..d116451bd 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -464,6 +464,11 @@ void rule_collection_destroy(struct rule_collection *); * ofproto-dpif implementation. */ extern unsigned ofproto_flow_limit; +/* Maximum idle time (in ms) for flows to be cached in the datapath. + * Revalidators may expire flows more quickly than the configured value based + * on system load and other factors. This variable is subject to change. */ +extern unsigned ofproto_max_idle; + /* Number of upcall handler and revalidator threads. Only affects the * ofproto-dpif implementation. */ extern size_t n_handlers, n_revalidators; diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 19e709173..e691bb93d 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -307,6 +307,7 @@ static size_t allocated_ofproto_classes; struct ovs_mutex ofproto_mutex = OVS_MUTEX_INITIALIZER; unsigned ofproto_flow_limit = OFPROTO_FLOW_LIMIT_DEFAULT; +unsigned ofproto_max_idle = OFPROTO_MAX_IDLE_DEFAULT; size_t n_handlers, n_revalidators; @@ -697,6 +698,14 @@ ofproto_set_flow_limit(unsigned limit) ofproto_flow_limit = limit; } +/* Sets the maximum idle time for flows in the datapath before they are + * expired. */ +void +ofproto_set_max_idle(unsigned max_idle) +{ + ofproto_max_idle = max_idle; +} + /* If forward_bpdu is true, the NORMAL action will forward frames with * reserved (e.g. STP) destination Ethernet addresses. if forward_bpdu is false, * the NORMAL action will drop these frames. */ diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h index 1f9cb1589..546827fa6 100644 --- a/ofproto/ofproto.h +++ b/ofproto/ofproto.h @@ -214,6 +214,7 @@ int ofproto_port_dump_done(struct ofproto_port_dump *); ) #define OFPROTO_FLOW_LIMIT_DEFAULT 200000 +#define OFPROTO_MAX_IDLE_DEFAULT 1500 const char *ofproto_port_open_type(const char *datapath_type, const char *port_type); @@ -236,6 +237,7 @@ void ofproto_set_extra_in_band_remotes(struct ofproto *, const struct sockaddr_in *, size_t n); void ofproto_set_in_band_queue(struct ofproto *, int queue_id); void ofproto_set_flow_limit(unsigned limit); +void ofproto_set_max_idle(unsigned max_idle); void ofproto_set_forward_bpdu(struct ofproto *, bool forward_bpdu); void ofproto_set_mac_table_config(struct ofproto *, unsigned idle_time, size_t max_entries); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 0f7ca8425..f7bd6572f 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -493,6 +493,8 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg) ofproto_set_flow_limit(smap_get_int(&ovs_cfg->other_config, "flow-limit", OFPROTO_FLOW_LIMIT_DEFAULT)); + ofproto_set_max_idle(smap_get_int(&ovs_cfg->other_config, "max-idle", + OFPROTO_MAX_IDLE_DEFAULT)); ofproto_set_threads( smap_get_int(&ovs_cfg->other_config, "n-handler-threads", 0), -- 2.43.0