diff options
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r-- | net/ipv4/tcp.c | 105 |
1 files changed, 0 insertions, 105 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 71ce33decd97..62018ea6f45f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -400,7 +400,6 @@ void tcp_init_sock(struct sock *sk) | |||
400 | 400 | ||
401 | tp->out_of_order_queue = RB_ROOT; | 401 | tp->out_of_order_queue = RB_ROOT; |
402 | tcp_init_xmit_timers(sk); | 402 | tcp_init_xmit_timers(sk); |
403 | tcp_prequeue_init(tp); | ||
404 | INIT_LIST_HEAD(&tp->tsq_node); | 403 | INIT_LIST_HEAD(&tp->tsq_node); |
405 | 404 | ||
406 | icsk->icsk_rto = TCP_TIMEOUT_INIT; | 405 | icsk->icsk_rto = TCP_TIMEOUT_INIT; |
@@ -1525,20 +1524,6 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied) | |||
1525 | tcp_send_ack(sk); | 1524 | tcp_send_ack(sk); |
1526 | } | 1525 | } |
1527 | 1526 | ||
1528 | static void tcp_prequeue_process(struct sock *sk) | ||
1529 | { | ||
1530 | struct sk_buff *skb; | ||
1531 | struct tcp_sock *tp = tcp_sk(sk); | ||
1532 | |||
1533 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPPREQUEUED); | ||
1534 | |||
1535 | while ((skb = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) | ||
1536 | sk_backlog_rcv(sk, skb); | ||
1537 | |||
1538 | /* Clear memory counter. */ | ||
1539 | tp->ucopy.memory = 0; | ||
1540 | } | ||
1541 | |||
1542 | static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) | 1527 | static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) |
1543 | { | 1528 | { |
1544 | struct sk_buff *skb; | 1529 | struct sk_buff *skb; |
@@ -1671,7 +1656,6 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, | |||
1671 | int err; | 1656 | int err; |
1672 | int target; /* Read at least this many bytes */ | 1657 | int target; /* Read at least this many bytes */ |
1673 | long timeo; | 1658 | long timeo; |
1674 | struct task_struct *user_recv = NULL; | ||
1675 | struct sk_buff *skb, *last; | 1659 | struct sk_buff *skb, *last; |
1676 | u32 urg_hole = 0; | 1660 | u32 urg_hole = 0; |
1677 | 1661 | ||
@@ -1806,51 +1790,6 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, | |||
1806 | 1790 | ||
1807 | tcp_cleanup_rbuf(sk, copied); | 1791 | tcp_cleanup_rbuf(sk, copied); |
1808 | 1792 | ||
1809 | if (!sysctl_tcp_low_latency && tp->ucopy.task == user_recv) { | ||
1810 | /* Install new reader */ | ||
1811 | if (!user_recv && !(flags & (MSG_TRUNC | MSG_PEEK))) { | ||
1812 | user_recv = current; | ||
1813 | tp->ucopy.task = user_recv; | ||
1814 | tp->ucopy.msg = msg; | ||
1815 | } | ||
1816 | |||
1817 | tp->ucopy.len = len; | ||
1818 | |||
1819 | WARN_ON(tp->copied_seq != tp->rcv_nxt && | ||
1820 | !(flags & (MSG_PEEK | MSG_TRUNC))); | ||
1821 | |||
1822 | /* Ugly... If prequeue is not empty, we have to | ||
1823 | * process it before releasing socket, otherwise | ||
1824 | * order will be broken at second iteration. | ||
1825 | * More elegant solution is required!!! | ||
1826 | * | ||
1827 | * Look: we have the following (pseudo)queues: | ||
1828 | * | ||
1829 | * 1. packets in flight | ||
1830 | * 2. backlog | ||
1831 | * 3. prequeue | ||
1832 | * 4. receive_queue | ||
1833 | * | ||
1834 | * Each queue can be processed only if the next ones | ||
1835 | * are empty. At this point we have empty receive_queue. | ||
1836 | * But prequeue _can_ be not empty after 2nd iteration, | ||
1837 | * when we jumped to start of loop because backlog | ||
1838 | * processing added something to receive_queue. | ||
1839 | * We cannot release_sock(), because backlog contains | ||
1840 | * packets arrived _after_ prequeued ones. | ||
1841 | * | ||
1842 | * Shortly, algorithm is clear --- to process all | ||
1843 | * the queues in order. We could make it more directly, | ||
1844 | * requeueing packets from backlog to prequeue, if | ||
1845 | * is not empty. It is more elegant, but eats cycles, | ||
1846 | * unfortunately. | ||
1847 | */ | ||
1848 | if (!skb_queue_empty(&tp->ucopy.prequeue)) | ||
1849 | goto do_prequeue; | ||
1850 | |||
1851 | /* __ Set realtime policy in scheduler __ */ | ||
1852 | } | ||
1853 | |||
1854 | if (copied >= target) { | 1793 | if (copied >= target) { |
1855 | /* Do not sleep, just process backlog. */ | 1794 | /* Do not sleep, just process backlog. */ |
1856 | release_sock(sk); | 1795 | release_sock(sk); |
@@ -1859,31 +1798,6 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, | |||
1859 | sk_wait_data(sk, &timeo, last); | 1798 | sk_wait_data(sk, &timeo, last); |
1860 | } | 1799 | } |
1861 | 1800 | ||
1862 | if (user_recv) { | ||
1863 | int chunk; | ||
1864 | |||
1865 | /* __ Restore normal policy in scheduler __ */ | ||
1866 | |||
1867 | chunk = len - tp->ucopy.len; | ||
1868 | if (chunk != 0) { | ||
1869 | NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMBACKLOG, chunk); | ||
1870 | len -= chunk; | ||
1871 | copied += chunk; | ||
1872 | } | ||
1873 | |||
1874 | if (tp->rcv_nxt == tp->copied_seq && | ||
1875 | !skb_queue_empty(&tp->ucopy.prequeue)) { | ||
1876 | do_prequeue: | ||
1877 | tcp_prequeue_process(sk); | ||
1878 | |||
1879 | chunk = len - tp->ucopy.len; | ||
1880 | if (chunk != 0) { | ||
1881 | NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE, chunk); | ||
1882 | len -= chunk; | ||
1883 | copied += chunk; | ||
1884 | } | ||
1885 | } | ||
1886 | } | ||
1887 | if ((flags & MSG_PEEK) && | 1801 | if ((flags & MSG_PEEK) && |
1888 | (peek_seq - copied - urg_hole != tp->copied_seq)) { | 1802 | (peek_seq - copied - urg_hole != tp->copied_seq)) { |
1889 | net_dbg_ratelimited("TCP(%s:%d): Application bug, race in MSG_PEEK\n", | 1803 | net_dbg_ratelimited("TCP(%s:%d): Application bug, race in MSG_PEEK\n", |
@@ -1955,25 +1869,6 @@ skip_copy: | |||
1955 | break; | 1869 | break; |
1956 | } while (len > 0); | 1870 | } while (len > 0); |
1957 | 1871 | ||
1958 | if (user_recv) { | ||
1959 | if (!skb_queue_empty(&tp->ucopy.prequeue)) { | ||
1960 | int chunk; | ||
1961 | |||
1962 | tp->ucopy.len = copied > 0 ? len : 0; | ||
1963 | |||
1964 | tcp_prequeue_process(sk); | ||
1965 | |||
1966 | if (copied > 0 && (chunk = len - tp->ucopy.len) != 0) { | ||
1967 | NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE, chunk); | ||
1968 | len -= chunk; | ||
1969 | copied += chunk; | ||
1970 | } | ||
1971 | } | ||
1972 | |||
1973 | tp->ucopy.task = NULL; | ||
1974 | tp->ucopy.len = 0; | ||
1975 | } | ||
1976 | |||
1977 | /* According to UNIX98, msg_name/msg_namelen are ignored | 1872 | /* According to UNIX98, msg_name/msg_namelen are ignored |
1978 | * on connected socket. I was just happy when found this 8) --ANK | 1873 | * on connected socket. I was just happy when found this 8) --ANK |
1979 | */ | 1874 | */ |