summaryrefslogtreecommitdiffstats
path: root/kernel/net/ipv4/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/net/ipv4/tcp.c')
-rw-r--r--kernel/net/ipv4/tcp.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/net/ipv4/tcp.c b/kernel/net/ipv4/tcp.c
index 036a76ba2..600dcda84 100644
--- a/kernel/net/ipv4/tcp.c
+++ b/kernel/net/ipv4/tcp.c
@@ -783,6 +783,12 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
ret = -EAGAIN;
break;
}
+ /* if __tcp_splice_read() got nothing while we have
+ * an skb in receive queue, we do not want to loop.
+ * This might happen with URG data.
+ */
+ if (!skb_queue_empty(&sk->sk_receive_queue))
+ break;
sk_wait_data(sk, &timeo, NULL);
if (signal_pending(current)) {
ret = sock_intr_errno(timeo);
@@ -1212,7 +1218,7 @@ new_segment:
if (!skb_can_coalesce(skb, i, pfrag->page,
pfrag->offset)) {
- if (i == sysctl_max_skb_frags || !sg) {
+ if (i >= sysctl_max_skb_frags || !sg) {
tcp_mark_push(tp, skb);
goto new_segment;
}