lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Mon, 30 Jul 2018 22:10:10 -0700
From:   Eric Dumazet <eric.dumazet@...il.com>
To:     Matteo Croce <mcroce@...hat.com>
Cc:     Wensong Zhang <wensong@...ux-vs.org>,
        Simon Horman <horms@...ge.net.au>,
        Julian Anastasov <ja@....bg>, lvs-devel@...r.kernel.org,
        netdev <netdev@...r.kernel.org>,
        Jozsef Kadlecsik <kadlec@...ckhole.kfki.hu>,
        Pablo Neira Ayuso <pablo@...filter.org>,
        Florian Westphal <fw@...len.de>,
        netfilter-devel@...r.kernel.org
Subject: Re: [PATCH] ipvs: don't show negative times in ip_vs_conn



On 07/30/2018 10:49 AM, Matteo Croce wrote:
> On Fri, Jul 20, 2018 at 4:19 PM Eric Dumazet <eric.dumazet@...il.com> wrote:
>>
>>
>>
>> On 07/20/2018 08:19 AM, Matteo Croce wrote:
>>> 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 <mcroce@...hat.com>
>>> ---
>>>  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;
}


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ