aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/tcp_ipv6.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2012-08-08 17:13:53 -0400
committerDavid S. Miller <davem@davemloft.net>2012-08-09 19:17:03 -0400
commita399a8053164ec8bcb06fed52be9941a26ecde11 (patch)
treec60402a77d08c82630d63e972d32b038919b827f /net/ipv6/tcp_ipv6.c
parent79cda75a107da0d49732b5cb642b456264dd7e0e (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.c9
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