| Submitter | Alexey Dobriyan |
|---|---|
| Date | Nov. 14, 2010, 3:18 p.m. |
| Message ID | <20101114151825.GA25137@core2.telecom.by> |
| Download | mbox | patch |
| Permalink | /patch/71118/ |
| State | Changes Requested |
| Delegated to: | David Miller |
| Headers | show |
Comments
Le dimanche 14 novembre 2010 à 17:18 +0200, Alexey Dobriyan a écrit : > tcp_win_from_space() does the following: > > if (sysctl_tcp_adv_win_scale <= 0) > return space >> (-sysctl_tcp_adv_win_scale); > else > return space - (space >> sysctl_tcp_adv_win_scale); > > "space" is int. > > As per C99 6.5.7 (3) shifting int for 32 or more bits is > undefined behaviour. > > Indeed, if sysctl_tcp_adv_win_scale is exactly 32, space >> 32 equals > space and function returns 0; > > Which means we busyloop in tcp_fixup_rcvbuf(). > > Restrict net.ipv4.tcp_adv_win_scale to [-31, 31]. > > Fix https://bugzilla.kernel.org/show_bug.cgi?id=20312 > > Steps to reproduce: > > echo 32 >/proc/sys/net/ipv4/tcp_adv_win_scale > wget www.kernel.org > [softlockup] > > Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> > --- > Please fix your patch title, you speak of adv_min_scale ... > --- a/net/ipv4/sysctl_net_ipv4.c > +++ b/net/ipv4/sysctl_net_ipv4.c > @@ -26,6 +26,8 @@ static int zero; > static int tcp_retr1_max = 255; > static int ip_local_port_range_min[] = { 1, 1 }; > static int ip_local_port_range_max[] = { 65535, 65535 }; > +static int _minus_31 = -31; > +static int _31 = 31; Please use normal symbols, not starting by underscore. > > /* Update system visible IP port range */ > static void set_local_port_range(int range[2]) > @@ -426,7 +428,9 @@ static struct ctl_table ipv4_table[] = { > .data = &sysctl_tcp_adv_win_scale, > .maxlen = sizeof(int), > .mode = 0644, > - .proc_handler = proc_dointvec > + .proc_handler = proc_dointvec_minmax, > + .extra1 = &_minus_31, > + .extra2 = &_31, > }, > { > .procname = "tcp_tw_reuse", Please change Documentation/networking/ip-sysctl.txt to reflect possible values of adv_win_scale Thanks -- 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 Sun, Nov 14, 2010 at 08:49:43PM +0100, Eric Dumazet wrote: > > +static int _minus_31 = -31; > > +static int _31 = 31; > > Please use normal symbols, not starting by underscore. static int thirty_one = 31? :-) -- 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 Sun, 2010-11-14 at 22:14 +0200, Alexey Dobriyan wrote: > On Sun, Nov 14, 2010 at 08:49:43PM +0100, Eric Dumazet wrote: > > > +static int _minus_31 = -31; > > > +static int _31 = 31; > > > > Please use normal symbols, not starting by underscore. > > static int thirty_one = 31? :-) How about, oh, I don't know, adv_win_scale_{min,max}? Ben.
Patch
--- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -26,6 +26,8 @@ static int zero; static int tcp_retr1_max = 255; static int ip_local_port_range_min[] = { 1, 1 }; static int ip_local_port_range_max[] = { 65535, 65535 }; +static int _minus_31 = -31; +static int _31 = 31; /* Update system visible IP port range */ static void set_local_port_range(int range[2]) @@ -426,7 +428,9 @@ static struct ctl_table ipv4_table[] = { .data = &sysctl_tcp_adv_win_scale, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec + .proc_handler = proc_dointvec_minmax, + .extra1 = &_minus_31, + .extra2 = &_31, }, { .procname = "tcp_tw_reuse",
tcp_win_from_space() does the following: if (sysctl_tcp_adv_win_scale <= 0) return space >> (-sysctl_tcp_adv_win_scale); else return space - (space >> sysctl_tcp_adv_win_scale); "space" is int. As per C99 6.5.7 (3) shifting int for 32 or more bits is undefined behaviour. Indeed, if sysctl_tcp_adv_win_scale is exactly 32, space >> 32 equals space and function returns 0; Which means we busyloop in tcp_fixup_rcvbuf(). Restrict net.ipv4.tcp_adv_win_scale to [-31, 31]. Fix https://bugzilla.kernel.org/show_bug.cgi?id=20312 Steps to reproduce: echo 32 >/proc/sys/net/ipv4/tcp_adv_win_scale wget www.kernel.org [softlockup] Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> --- -- 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