[ovs-dev] [PATCHv6] upcall: Configure datapath max-idle through ovs-vsctl.

Justin Pettit jpettit at nicira.com
Sat Mar 8 00:13:34 UTC 2014


Applied.  Thanks.

--Justin


On Mar 5, 2014, at 4:56 PM, Joe Stringer <joestringer at nicira.com> wrote:

> 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 <joestringer at nicira.com>
> 
> ---
> v6: Shift documentation to ofproto-provider.h.
> v5: Rebase.
> v4: Remove extra "max_idle" from Flow_Table table.
> v3: Use 'unsigned' instead of 'long long int' for ofproto_max_idle.
> v2: Don't cache the max_idle in 'struct udpif'.
>    Extend range of valid values to 100-30000.
> ---
> 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 7dbd7f7..0d5b251 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 2c72fbc..d116451 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 19e7091..e691bb9 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 1f9cb15..546827f 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 0f7ca84..f7bd657 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),
> -- 
> 1.7.9.5
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev




More information about the dev mailing list