diff mbox series

[ovs-dev,v8,1/4] token-bucket: Make token-bucket timestamp updated by caller.

Message ID SY4PR01MB8438122985D83A01CBCBBEFFCD09A@SY4PR01MB8438.ausprd01.prod.outlook.com
State Changes Requested
Headers show
Series netdev-dpdk: Add support for userspace port-based packet-per-second policing. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

miter Aug. 4, 2023, 4:14 p.m. UTC
From: Lin Huang <linhuang@ruijie.com.cn>

Now, token-bucket 'last_fill' is updated by token_bucket_withdraw() itself.
Add a new function parameter 'now' to update timestamp by caller.

Signed-off-by: Lin Huang <linhuang@ruijie.com.cn>
---
 include/openvswitch/token-bucket.h |  3 ++-
 lib/token-bucket.c                 |  4 ++--
 lib/vlog.c                         | 14 +++++++-------
 ofproto/pinsched.c                 |  2 +-
 4 files changed, 12 insertions(+), 11 deletions(-)
diff mbox series

Patch

diff --git a/include/openvswitch/token-bucket.h b/include/openvswitch/token-bucket.h
index 580747f61..d1191e956 100644
--- a/include/openvswitch/token-bucket.h
+++ b/include/openvswitch/token-bucket.h
@@ -40,7 +40,8 @@  void token_bucket_init(struct token_bucket *,
                        unsigned int rate, unsigned int burst);
 void token_bucket_set(struct token_bucket *,
                        unsigned int rate, unsigned int burst);
-bool token_bucket_withdraw(struct token_bucket *, unsigned int n);
+bool token_bucket_withdraw(struct token_bucket *tb, unsigned int n,
+                           long long int now);
 void token_bucket_wait_at(struct token_bucket *, unsigned int n,
                           const char *where);
 #define token_bucket_wait(bucket, n)                    \
diff --git a/lib/token-bucket.c b/lib/token-bucket.c
index 0badeb46b..60eb26e53 100644
--- a/lib/token-bucket.c
+++ b/lib/token-bucket.c
@@ -59,10 +59,10 @@  token_bucket_set(struct token_bucket *tb,
  * if 'tb' contained fewer than 'n' tokens (and thus 'n' tokens could not be
  * removed) . */
 bool
-token_bucket_withdraw(struct token_bucket *tb, unsigned int n)
+token_bucket_withdraw(struct token_bucket *tb, unsigned int n,
+                      long long int now)
 {
     if (tb->tokens < n) {
-        long long int now = time_msec();
         if (now > tb->last_fill) {
             unsigned long long int elapsed_ull
                 = (unsigned long long int) now - tb->last_fill;
diff --git a/lib/vlog.c b/lib/vlog.c
index b2653142f..a025f79e5 100644
--- a/lib/vlog.c
+++ b/lib/vlog.c
@@ -1321,12 +1321,13 @@  vlog_should_drop(const struct vlog_module *module, enum vlog_level level,
     }
 
     ovs_mutex_lock(&rl->mutex);
-    if (!token_bucket_withdraw(&rl->token_bucket, VLOG_MSG_TOKENS)) {
-        time_t now = time_now();
+    long long int now = time_msec();
+    time_t now_sec = now / 1000;
+    if (!token_bucket_withdraw(&rl->token_bucket, VLOG_MSG_TOKENS, now)) {
         if (!rl->n_dropped) {
-            rl->first_dropped = now;
+            rl->first_dropped = now_sec;
         }
-        rl->last_dropped = now;
+        rl->last_dropped = now_sec;
         rl->n_dropped++;
         ovs_mutex_unlock(&rl->mutex);
         return true;
@@ -1335,10 +1336,9 @@  vlog_should_drop(const struct vlog_module *module, enum vlog_level level,
     if (!rl->n_dropped) {
         ovs_mutex_unlock(&rl->mutex);
     } else {
-        time_t now = time_now();
         unsigned int n_dropped = rl->n_dropped;
-        unsigned int first_dropped_elapsed = now - rl->first_dropped;
-        unsigned int last_dropped_elapsed = now - rl->last_dropped;
+        unsigned int first_dropped_elapsed = now_sec - rl->first_dropped;
+        unsigned int last_dropped_elapsed = now_sec - rl->last_dropped;
         rl->n_dropped = 0;
         ovs_mutex_unlock(&rl->mutex);
 
diff --git a/ofproto/pinsched.c b/ofproto/pinsched.c
index 59561f076..a39e4d2ee 100644
--- a/ofproto/pinsched.c
+++ b/ofproto/pinsched.c
@@ -184,7 +184,7 @@  get_tx_packet(struct pinsched *ps)
 static bool
 get_token(struct pinsched *ps)
 {
-    return token_bucket_withdraw(&ps->token_bucket, 1000);
+    return token_bucket_withdraw(&ps->token_bucket, 1000, time_msec());
 }
 
 void