diff options
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r-- | net/ipv4/tcp.c | 70 |
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; | |||
282 | struct percpu_counter tcp_orphan_count; | 282 | struct percpu_counter tcp_orphan_count; |
283 | EXPORT_SYMBOL_GPL(tcp_orphan_count); | 283 | EXPORT_SYMBOL_GPL(tcp_orphan_count); |
284 | 284 | ||
285 | int sysctl_tcp_mem[3] __read_mostly; | 285 | long sysctl_tcp_mem[3] __read_mostly; |
286 | int sysctl_tcp_wmem[3] __read_mostly; | 286 | int sysctl_tcp_wmem[3] __read_mostly; |
287 | int sysctl_tcp_rmem[3] __read_mostly; | 287 | int sysctl_tcp_rmem[3] __read_mostly; |
288 | 288 | ||
@@ -290,7 +290,7 @@ EXPORT_SYMBOL(sysctl_tcp_mem); | |||
290 | EXPORT_SYMBOL(sysctl_tcp_rmem); | 290 | EXPORT_SYMBOL(sysctl_tcp_rmem); |
291 | EXPORT_SYMBOL(sysctl_tcp_wmem); | 291 | EXPORT_SYMBOL(sysctl_tcp_wmem); |
292 | 292 | ||
293 | atomic_t tcp_memory_allocated; /* Current allocated memory. */ | 293 | atomic_long_t tcp_memory_allocated; /* Current allocated memory. */ |
294 | EXPORT_SYMBOL(tcp_memory_allocated); | 294 | EXPORT_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: | |||
1104 | out: | 1111 | out: |
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; |
1124 | out_err: | 1130 | out_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 | ||
1776 | out: | 1776 | out: |
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, | |||
2646 | EXPORT_SYMBOL(compat_tcp_getsockopt); | 2654 | EXPORT_SYMBOL(compat_tcp_getsockopt); |
2647 | #endif | 2655 | #endif |
2648 | 2656 | ||
2649 | struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) | 2657 | struct 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); | |||
3212 | void __init tcp_init(void) | 3220 | void __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; |