aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r--net/ipv4/tcp.c70
1 files changed, 36 insertions, 34 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index f115ea68a4ef..46febcacb729 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -282,7 +282,7 @@ int sysctl_tcp_fin_timeout __read_mostly = TCP_FIN_TIMEOUT;
282struct percpu_counter tcp_orphan_count; 282struct percpu_counter tcp_orphan_count;
283EXPORT_SYMBOL_GPL(tcp_orphan_count); 283EXPORT_SYMBOL_GPL(tcp_orphan_count);
284 284
285int sysctl_tcp_mem[3] __read_mostly; 285long sysctl_tcp_mem[3] __read_mostly;
286int sysctl_tcp_wmem[3] __read_mostly; 286int sysctl_tcp_wmem[3] __read_mostly;
287int sysctl_tcp_rmem[3] __read_mostly; 287int sysctl_tcp_rmem[3] __read_mostly;
288 288
@@ -290,7 +290,7 @@ EXPORT_SYMBOL(sysctl_tcp_mem);
290EXPORT_SYMBOL(sysctl_tcp_rmem); 290EXPORT_SYMBOL(sysctl_tcp_rmem);
291EXPORT_SYMBOL(sysctl_tcp_wmem); 291EXPORT_SYMBOL(sysctl_tcp_wmem);
292 292
293atomic_t tcp_memory_allocated; /* Current allocated memory. */ 293atomic_long_t tcp_memory_allocated; /* Current allocated memory. */
294EXPORT_SYMBOL(tcp_memory_allocated); 294EXPORT_SYMBOL(tcp_memory_allocated);
295 295
296/* 296/*
@@ -505,6 +505,15 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
505 else 505 else
506 answ = tp->write_seq - tp->snd_una; 506 answ = tp->write_seq - tp->snd_una;
507 break; 507 break;
508 case SIOCOUTQNSD:
509 if (sk->sk_state == TCP_LISTEN)
510 return -EINVAL;
511
512 if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV))
513 answ = 0;
514 else
515 answ = tp->write_seq - tp->snd_nxt;
516 break;
508 default: 517 default:
509 return -ENOIOCTLCMD; 518 return -ENOIOCTLCMD;
510 } 519 }
@@ -873,9 +882,7 @@ int tcp_sendpage(struct sock *sk, struct page *page, int offset,
873 flags); 882 flags);
874 883
875 lock_sock(sk); 884 lock_sock(sk);
876 TCP_CHECK_TIMER(sk);
877 res = do_tcp_sendpages(sk, &page, offset, size, flags); 885 res = do_tcp_sendpages(sk, &page, offset, size, flags);
878 TCP_CHECK_TIMER(sk);
879 release_sock(sk); 886 release_sock(sk);
880 return res; 887 return res;
881} 888}
@@ -916,7 +923,6 @@ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
916 long timeo; 923 long timeo;
917 924
918 lock_sock(sk); 925 lock_sock(sk);
919 TCP_CHECK_TIMER(sk);
920 926
921 flags = msg->msg_flags; 927 flags = msg->msg_flags;
922 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); 928 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
@@ -993,7 +999,8 @@ new_segment:
993 /* We have some space in skb head. Superb! */ 999 /* We have some space in skb head. Superb! */
994 if (copy > skb_tailroom(skb)) 1000 if (copy > skb_tailroom(skb))
995 copy = skb_tailroom(skb); 1001 copy = skb_tailroom(skb);
996 if ((err = skb_add_data(skb, from, copy)) != 0) 1002 err = skb_add_data_nocache(sk, skb, from, copy);
1003 if (err)
997 goto do_fault; 1004 goto do_fault;
998 } else { 1005 } else {
999 int merge = 0; 1006 int merge = 0;
@@ -1036,8 +1043,8 @@ new_segment:
1036 1043
1037 /* Time to copy data. We are close to 1044 /* Time to copy data. We are close to
1038 * the end! */ 1045 * the end! */
1039 err = skb_copy_to_page(sk, from, skb, page, 1046 err = skb_copy_to_page_nocache(sk, from, skb,
1040 off, copy); 1047 page, off, copy);
1041 if (err) { 1048 if (err) {
1042 /* If this page was new, give it to the 1049 /* If this page was new, give it to the
1043 * socket so it does not get leaked. 1050 * socket so it does not get leaked.
@@ -1104,7 +1111,6 @@ wait_for_memory:
1104out: 1111out:
1105 if (copied) 1112 if (copied)
1106 tcp_push(sk, flags, mss_now, tp->nonagle); 1113 tcp_push(sk, flags, mss_now, tp->nonagle);
1107 TCP_CHECK_TIMER(sk);
1108 release_sock(sk); 1114 release_sock(sk);
1109 return copied; 1115 return copied;
1110 1116
@@ -1123,7 +1129,6 @@ do_error:
1123 goto out; 1129 goto out;
1124out_err: 1130out_err:
1125 err = sk_stream_error(sk, flags, err); 1131 err = sk_stream_error(sk, flags, err);
1126 TCP_CHECK_TIMER(sk);
1127 release_sock(sk); 1132 release_sock(sk);
1128 return err; 1133 return err;
1129} 1134}
@@ -1193,7 +1198,7 @@ void tcp_cleanup_rbuf(struct sock *sk, int copied)
1193 struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); 1198 struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
1194 1199
1195 WARN(skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq), 1200 WARN(skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq),
1196 KERN_INFO "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n", 1201 "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n",
1197 tp->copied_seq, TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt); 1202 tp->copied_seq, TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt);
1198#endif 1203#endif
1199 1204
@@ -1415,8 +1420,6 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1415 1420
1416 lock_sock(sk); 1421 lock_sock(sk);
1417 1422
1418 TCP_CHECK_TIMER(sk);
1419
1420 err = -ENOTCONN; 1423 err = -ENOTCONN;
1421 if (sk->sk_state == TCP_LISTEN) 1424 if (sk->sk_state == TCP_LISTEN)
1422 goto out; 1425 goto out;
@@ -1477,10 +1480,9 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1477 * shouldn't happen. 1480 * shouldn't happen.
1478 */ 1481 */
1479 if (WARN(before(*seq, TCP_SKB_CB(skb)->seq), 1482 if (WARN(before(*seq, TCP_SKB_CB(skb)->seq),
1480 KERN_INFO "recvmsg bug: copied %X " 1483 "recvmsg bug: copied %X seq %X rcvnxt %X fl %X\n",
1481 "seq %X rcvnxt %X fl %X\n", *seq, 1484 *seq, TCP_SKB_CB(skb)->seq, tp->rcv_nxt,
1482 TCP_SKB_CB(skb)->seq, tp->rcv_nxt, 1485 flags))
1483 flags))
1484 break; 1486 break;
1485 1487
1486 offset = *seq - TCP_SKB_CB(skb)->seq; 1488 offset = *seq - TCP_SKB_CB(skb)->seq;
@@ -1490,10 +1492,9 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1490 goto found_ok_skb; 1492 goto found_ok_skb;
1491 if (tcp_hdr(skb)->fin) 1493 if (tcp_hdr(skb)->fin)
1492 goto found_fin_ok; 1494 goto found_fin_ok;
1493 WARN(!(flags & MSG_PEEK), KERN_INFO "recvmsg bug 2: " 1495 WARN(!(flags & MSG_PEEK),
1494 "copied %X seq %X rcvnxt %X fl %X\n", 1496 "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n",
1495 *seq, TCP_SKB_CB(skb)->seq, 1497 *seq, TCP_SKB_CB(skb)->seq, tp->rcv_nxt, flags);
1496 tp->rcv_nxt, flags);
1497 } 1498 }
1498 1499
1499 /* Well, if we have backlog, try to process it now yet. */ 1500 /* Well, if we have backlog, try to process it now yet. */
@@ -1769,12 +1770,10 @@ skip_copy:
1769 /* Clean up data we have read: This will do ACK frames. */ 1770 /* Clean up data we have read: This will do ACK frames. */
1770 tcp_cleanup_rbuf(sk, copied); 1771 tcp_cleanup_rbuf(sk, copied);
1771 1772
1772 TCP_CHECK_TIMER(sk);
1773 release_sock(sk); 1773 release_sock(sk);
1774 return copied; 1774 return copied;
1775 1775
1776out: 1776out:
1777 TCP_CHECK_TIMER(sk);
1778 release_sock(sk); 1777 release_sock(sk);
1779 return err; 1778 return err;
1780 1779
@@ -2246,7 +2245,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
2246 /* Values greater than interface MTU won't take effect. However 2245 /* Values greater than interface MTU won't take effect. However
2247 * at the point when this call is done we typically don't yet 2246 * at the point when this call is done we typically don't yet
2248 * know which interface is going to be used */ 2247 * know which interface is going to be used */
2249 if (val < 8 || val > MAX_TCP_WINDOW) { 2248 if (val < TCP_MIN_MSS || val > MAX_TCP_WINDOW) {
2250 err = -EINVAL; 2249 err = -EINVAL;
2251 break; 2250 break;
2252 } 2251 }
@@ -2392,7 +2391,12 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
2392 err = tp->af_specific->md5_parse(sk, optval, optlen); 2391 err = tp->af_specific->md5_parse(sk, optval, optlen);
2393 break; 2392 break;
2394#endif 2393#endif
2395 2394 case TCP_USER_TIMEOUT:
2395 /* Cap the max timeout in ms TCP will retry/retrans
2396 * before giving up and aborting (ETIMEDOUT) a connection.
2397 */
2398 icsk->icsk_user_timeout = msecs_to_jiffies(val);
2399 break;
2396 default: 2400 default:
2397 err = -ENOPROTOOPT; 2401 err = -ENOPROTOOPT;
2398 break; 2402 break;
@@ -2611,6 +2615,10 @@ static int do_tcp_getsockopt(struct sock *sk, int level,
2611 case TCP_THIN_DUPACK: 2615 case TCP_THIN_DUPACK:
2612 val = tp->thin_dupack; 2616 val = tp->thin_dupack;
2613 break; 2617 break;
2618
2619 case TCP_USER_TIMEOUT:
2620 val = jiffies_to_msecs(icsk->icsk_user_timeout);
2621 break;
2614 default: 2622 default:
2615 return -ENOPROTOOPT; 2623 return -ENOPROTOOPT;
2616 } 2624 }
@@ -2646,7 +2654,7 @@ int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
2646EXPORT_SYMBOL(compat_tcp_getsockopt); 2654EXPORT_SYMBOL(compat_tcp_getsockopt);
2647#endif 2655#endif
2648 2656
2649struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) 2657struct sk_buff *tcp_tso_segment(struct sk_buff *skb, u32 features)
2650{ 2658{
2651 struct sk_buff *segs = ERR_PTR(-EINVAL); 2659 struct sk_buff *segs = ERR_PTR(-EINVAL);
2652 struct tcphdr *th; 2660 struct tcphdr *th;
@@ -3212,7 +3220,7 @@ __setup("thash_entries=", set_thash_entries);
3212void __init tcp_init(void) 3220void __init tcp_init(void)
3213{ 3221{
3214 struct sk_buff *skb = NULL; 3222 struct sk_buff *skb = NULL;
3215 unsigned long nr_pages, limit; 3223 unsigned long limit;
3216 int i, max_share, cnt; 3224 int i, max_share, cnt;
3217 unsigned long jiffy = jiffies; 3225 unsigned long jiffy = jiffies;
3218 3226
@@ -3269,13 +3277,7 @@ void __init tcp_init(void)
3269 sysctl_tcp_max_orphans = cnt / 2; 3277 sysctl_tcp_max_orphans = cnt / 2;
3270 sysctl_max_syn_backlog = max(128, cnt / 256); 3278 sysctl_max_syn_backlog = max(128, cnt / 256);
3271 3279
3272 /* Set the pressure threshold to be a fraction of global memory that 3280 limit = nr_free_buffer_pages() / 8;
3273 * is up to 1/2 at 256 MB, decreasing toward zero with the amount of
3274 * memory, with a floor of 128 pages.
3275 */
3276 nr_pages = totalram_pages - totalhigh_pages;
3277 limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
3278 limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
3279 limit = max(limit, 128UL); 3281 limit = max(limit, 128UL);
3280 sysctl_tcp_mem[0] = limit / 4 * 3; 3282 sysctl_tcp_mem[0] = limit / 4 * 3;
3281 sysctl_tcp_mem[1] = limit; 3283 sysctl_tcp_mem[1] = limit;