diff options
author | Eric Dumazet <edumazet@google.com> | 2012-08-08 17:13:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-09 19:17:03 -0400 |
commit | a399a8053164ec8bcb06fed52be9941a26ecde11 (patch) | |
tree | c60402a77d08c82630d63e972d32b038919b827f /net/ipv6/tcp_ipv6.c | |
parent | 79cda75a107da0d49732b5cb642b456264dd7e0e (diff) |
time: jiffies_delta_to_clock_t() helper to the rescue
Various /proc/net files sometimes report crazy timer values, expressed
in clock_t units.
This happens when an expired timer delta (expires - jiffies) is passed
to jiffies_to_clock_t().
This function has an overflow in :
return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
commit cbbc719fccdb8cb (time: Change jiffies_to_clock_t() argument type
to unsigned long) only got around the problem.
As we cant output negative values in /proc/net/tcp without breaking
various tools, I suggest adding a jiffies_delta_to_clock_t() wrapper
that caps the negative delta to a 0 value.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Maciej Żenczykowski <maze@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: hank <pyu@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index c66b90f71c9b..aa41b0e6b163 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1875,7 +1875,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
1875 | tp->write_seq-tp->snd_una, | 1875 | tp->write_seq-tp->snd_una, |
1876 | (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), | 1876 | (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), |
1877 | timer_active, | 1877 | timer_active, |
1878 | jiffies_to_clock_t(timer_expires - jiffies), | 1878 | jiffies_delta_to_clock_t(timer_expires - jiffies), |
1879 | icsk->icsk_retransmits, | 1879 | icsk->icsk_retransmits, |
1880 | sock_i_uid(sp), | 1880 | sock_i_uid(sp), |
1881 | icsk->icsk_probes_out, | 1881 | icsk->icsk_probes_out, |
@@ -1895,10 +1895,7 @@ static void get_timewait6_sock(struct seq_file *seq, | |||
1895 | const struct in6_addr *dest, *src; | 1895 | const struct in6_addr *dest, *src; |
1896 | __u16 destp, srcp; | 1896 | __u16 destp, srcp; |
1897 | const struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw); | 1897 | const struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw); |
1898 | int ttd = tw->tw_ttd - jiffies; | 1898 | long delta = tw->tw_ttd - jiffies; |
1899 | |||
1900 | if (ttd < 0) | ||
1901 | ttd = 0; | ||
1902 | 1899 | ||
1903 | dest = &tw6->tw_v6_daddr; | 1900 | dest = &tw6->tw_v6_daddr; |
1904 | src = &tw6->tw_v6_rcv_saddr; | 1901 | src = &tw6->tw_v6_rcv_saddr; |
@@ -1914,7 +1911,7 @@ static void get_timewait6_sock(struct seq_file *seq, | |||
1914 | dest->s6_addr32[0], dest->s6_addr32[1], | 1911 | dest->s6_addr32[0], dest->s6_addr32[1], |
1915 | dest->s6_addr32[2], dest->s6_addr32[3], destp, | 1912 | dest->s6_addr32[2], dest->s6_addr32[3], destp, |
1916 | tw->tw_substate, 0, 0, | 1913 | tw->tw_substate, 0, 0, |
1917 | 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0, | 1914 | 3, jiffies_delta_to_clock_t(delta), 0, 0, 0, 0, |
1918 | atomic_read(&tw->tw_refcnt), tw); | 1915 | atomic_read(&tw->tw_refcnt), tw); |
1919 | } | 1916 | } |
1920 | 1917 | ||