Message ID | 20150527152337.GB558@WorkStation.home |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, 2015-05-27 at 11:23 -0400, Ido Yariv wrote: > Signed-off-by: Ido Yariv <idox.yariv@intel.com> > --- > include/net/tcp.h | 9 +++++++++ > net/ipv4/tcp_output.c | 2 +- > 2 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/include/net/tcp.h b/include/net/tcp.h > index 2bb2bad..86090b6 100644 > --- a/include/net/tcp.h > +++ b/include/net/tcp.h > @@ -1751,4 +1751,13 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) > skb->truesize = 2; > } > > +/* Convert msecs to jiffies, ensuring that the return value is always at least > + * 2. This can be used when setting tick-based timers to guarantee that they > + * won't expire right away. > + */ > +static inline unsigned long tcp_safe_msecs_to_jiffies(const unsigned int m) > +{ > + return max_t(u32, 2, msecs_to_jiffies(m)); > +} Note that you can do slightly better if m is a constant at compile time ;) if (__builtin_constant_p(m) && m * 1000 >= 2 * HZ) return msecs_to_jiffies(m); return max_t(u32, 2, msecs_to_jiffies(m)); Or something like that ? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Eric, On Wed, May 27, 2015 at 09:23:36AM -0700, Eric Dumazet wrote: > On Wed, 2015-05-27 at 11:23 -0400, Ido Yariv wrote: > > > Signed-off-by: Ido Yariv <idox.yariv@intel.com> > > --- > > include/net/tcp.h | 9 +++++++++ > > net/ipv4/tcp_output.c | 2 +- > > 2 files changed, 10 insertions(+), 1 deletion(-) > > > > diff --git a/include/net/tcp.h b/include/net/tcp.h > > index 2bb2bad..86090b6 100644 > > --- a/include/net/tcp.h > > +++ b/include/net/tcp.h > > @@ -1751,4 +1751,13 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) > > skb->truesize = 2; > > } > > > > +/* Convert msecs to jiffies, ensuring that the return value is always at least > > + * 2. This can be used when setting tick-based timers to guarantee that they > > + * won't expire right away. > > + */ > > +static inline unsigned long tcp_safe_msecs_to_jiffies(const unsigned int m) > > +{ > > + return max_t(u32, 2, msecs_to_jiffies(m)); > > +} > > Note that you can do slightly better if m is a constant at compile > time ;) > > if (__builtin_constant_p(m) && m * 1000 >= 2 * HZ) > return msecs_to_jiffies(m); > return max_t(u32, 2, msecs_to_jiffies(m)); > > Or something like that ? That's a nice optimization ;) However, I think that with Nicholas Mc Guire's recent changes to msecs_to_jiffies (http://marc.info/?l=linux-kernel&m=143195210010666), we should get this for free, no? Cheers, Ido. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, 2015-05-27 at 12:54 -0400, Ido Yariv wrote: > Hi Eric, > That's a nice optimization ;) > > However, I think that with Nicholas Mc Guire's recent changes to > msecs_to_jiffies (http://marc.info/?l=linux-kernel&m=143195210010666), > we should get this for free, no? Well, on net and net-next tree we currently have : $ grep msecs_to_jiffies include/linux/jiffies.h extern unsigned long msecs_to_jiffies(const unsigned int m); Given your patch is for stable, I would not mind having this done anyway. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/net/tcp.h b/include/net/tcp.h index 2bb2bad..86090b6 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1751,4 +1751,13 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) skb->truesize = 2; } +/* Convert msecs to jiffies, ensuring that the return value is always at least + * 2. This can be used when setting tick-based timers to guarantee that they + * won't expire right away. + */ +static inline unsigned long tcp_safe_msecs_to_jiffies(const unsigned int m) +{ + return max_t(u32, 2, msecs_to_jiffies(m)); +} + #endif /* _TCP_H */ diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 534e5fd..83021c5 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2207,7 +2207,7 @@ bool tcp_schedule_loss_probe(struct sock *sk) if (tp->packets_out == 1) timeout = max_t(u32, timeout, (rtt + (rtt >> 1) + TCP_DELACK_MAX)); - timeout = max_t(u32, timeout, msecs_to_jiffies(10)); + timeout = max_t(u32, timeout, tcp_safe_msecs_to_jiffies(10)); /* If RTO is shorter, just schedule TLP in its place. */ tlp_time_stamp = tcp_time_stamp + timeout;