[ovs-dev] [PATCH 3/5] conntrack: r/w clean-up interval.

antonio.fischetti at intel.com antonio.fischetti at intel.com
Mon Sep 18 10:21:29 UTC 2017


Read/Write conntrack clean-up interval used by
the clean_thread_main() thread.

Example:
   ovs-appctl dpctl/ct-set cleanup=4000  # Set a new value
   ovs-appctl dpctl/ct-get cleanup       # Read

Signed-off-by: Antonio Fischetti <antonio.fischetti at intel.com>
---
 lib/conntrack.c | 27 ++++++++++++++++++++++++---
 lib/conntrack.h |  2 ++
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/lib/conntrack.c b/lib/conntrack.c
index 6d86625..60eb376 100644
--- a/lib/conntrack.c
+++ b/lib/conntrack.c
@@ -225,6 +225,9 @@ conn_key_cmp(const struct conn_key *key1, const struct conn_key *key2)
     return 1;
 }
 
+#define CT_CLEAN_INTERVAL 5000 /* 5 seconds */
+#define CT_CLEAN_MIN_INTERVAL 200  /* 0.2 seconds */
+
 /* Initializes the connection tracker 'ct'.  The caller is responsible for
  * calling 'conntrack_destroy()', when the instance is not needed anymore */
 void
@@ -258,6 +261,7 @@ conntrack_init(struct conntrack *ct)
     ct->hash_basis = random_uint32();
     atomic_count_init(&ct->n_conn, 0);
     atomic_init(&ct->n_conn_limit, DEFAULT_N_CONN_LIMIT);
+    ct->clean_interval = CT_CLEAN_INTERVAL;
     latch_init(&ct->clean_thread_exit);
     ct->clean_thread = ovs_thread_create("ct_clean", clean_thread_main, ct);
 }
@@ -1327,8 +1331,6 @@ next_bucket:
  *   behind, there is at least some 200ms blocks of time when buckets will be
  *   left alone, so the datapath can operate unhindered.
  */
-#define CT_CLEAN_INTERVAL 5000 /* 5 seconds */
-#define CT_CLEAN_MIN_INTERVAL 200  /* 0.2 seconds */
 
 static void *
 clean_thread_main(void *f_)
@@ -1344,7 +1346,7 @@ clean_thread_main(void *f_)
         if (next_wake < now) {
             poll_timer_wait_until(now + CT_CLEAN_MIN_INTERVAL);
         } else {
-            poll_timer_wait_until(MAX(next_wake, now + CT_CLEAN_INTERVAL));
+            poll_timer_wait_until(MAX(next_wake, now + ct->clean_interval));
         }
         latch_wait(&ct->clean_thread_exit);
         poll_block();
@@ -2398,6 +2400,21 @@ conntrack_flush(struct conntrack *ct, const uint16_t *zone)
     return 0;
 }
 
+/* Set an interval value to be used by clean_thread_main. */
+static int
+wr_clean_int(struct conntrack *ct, uint32_t new_val) {
+    ct->clean_interval = new_val;
+    VLOG_DBG("Set clean interval to %d", new_val);
+    return 0;
+}
+
+/* Read current clean-up interval used by clean_thread_main. */
+static int
+rd_clean_int(struct conntrack *ct, uint32_t *cur_val) {
+    *cur_val = ct->clean_interval;
+    return 0;
+}
+
 /* Set a new value for the upper limit of connections. */
 static int
 wr_max_conn(struct conntrack *ct, uint32_t new_val) {
@@ -2414,11 +2431,15 @@ rd_max_conn(struct conntrack *ct, uint32_t *cur_val) {
 }
 
 /* List of managed parameters. */
+/* Max nr of connections managed by CT module. */
 #define CT_RW_MAX_CONN "maxconn"
+/* Clean-up interval used by clean_thread_main() thread. */
+#define CT_RW_CLEAN_INTERVAL "cleanup"
 
 /* List of parameters that can be read/written at run-time. */
 struct ct_wk_params wk_params[] = {
     {CT_RW_MAX_CONN, wr_max_conn, rd_max_conn},
+    {CT_RW_CLEAN_INTERVAL, wr_clean_int, rd_clean_int},
 };
 
 int
diff --git a/lib/conntrack.h b/lib/conntrack.h
index 4eb9a9a..ba9d3f1 100644
--- a/lib/conntrack.h
+++ b/lib/conntrack.h
@@ -261,6 +261,8 @@ struct conntrack {
     pthread_t clean_thread;
     /* Latch to destroy the 'clean_thread' */
     struct latch clean_thread_exit;
+    /* Clean interval. */
+    uint32_t clean_interval;
 
     /* Number of connections currently in the connection tracker. */
     atomic_count n_conn;
-- 
2.4.11



More information about the dev mailing list