Thread (5 messages) 5 messages, 2 authors, 2018-07-31

Re: [PATCH] ipvs: don't show negative times in ip_vs_conn

From: Eric Dumazet <hidden>
Date: 2018-07-31 06:48:37
Also in: lvs-devel, netfilter-devel


On 07/30/2018 10:49 AM, Matteo Croce wrote:
On Fri, Jul 20, 2018 at 4:19 PM Eric Dumazet [off-list ref] wrote:
quoted


On 07/20/2018 08:19 AM, Matteo Croce wrote:
quoted
Since commit 500462a9de65 ("timers: Switch to a non-cascading wheel"),
timers duration can last even 12.5% more than the scheduled interval.

Signed-off-by: Matteo Croce <redacted>
---
 net/netfilter/ipvs/ip_vs_conn.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
index 99e0aa350dc5..c78c48a6d53f 100644
--- a/net/netfilter/ipvs/ip_vs_conn.c
+++ b/net/netfilter/ipvs/ip_vs_conn.c
@@ -1066,6 +1066,12 @@ static void ip_vs_conn_seq_stop(struct seq_file *seq, void *v)
      rcu_read_unlock();
 }

+static unsigned int time_left(unsigned long time)
+{
+     return time_is_after_jiffies(time) ?
+             jiffies_to_msecs(time - jiffies) / 1000 : 0;
+}

I would suggest adding jiffies_delta_to_msecs(), because we will need elsewhere,
like in inet_sk_diag_fill()

diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index a27cf66523279c1a5d4aaa0d0087f1e9d48d170f..fa928242567db30769839ac8738be5dc58e372ab 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -447,6 +447,11 @@ static inline clock_t jiffies_delta_to_clock_t(long delta)
        return jiffies_to_clock_t(max(0L, delta));
 }

+static inline unsigned int jiffies_delta_to_msecs(long delta)
+{
+       return jiffies_to_msecs(max(0L, delta));
+}
+
 extern unsigned long clock_t_to_jiffies(unsigned long x);
 extern u64 jiffies_64_to_clock_t(u64 x);
 extern u64 nsec_to_clock_t(u64 x);
Hi Eric,
What about a function which returns directly the delta from a
timestamp, and 0 if elapsed?
So we can rely on time_is_after_jiffies() for overflows, it should be
less error prone.

static unsigned int jiffies_delta_to_msecs(unsigned long time)
{
     return time_is_after_jiffies(time) ?
             jiffies_to_msecs(time - jiffies) / 1000 : 0;
}
I dunno, I suggested jiffies_delta_to_msecs(long delta) because it is built
on the same model than jiffies_delta_to_clock_t(long delta)

And it really does what you want.

Remember that jiffies can change, so what you wrote is buggy/racy.

if (time_is_after_jiffies(time)) {

   ... jiffies is updated, and now (time - jiffies) might be negative,
      since compiler reads jiffies a second time (jiffies is a volatile)

     return jiffies_to_msecs(time - jiffies)/ 1000;
}
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help