From: Octavian Purdila <opurdila@ixiacom.com>
To: Jarek Poplawski <jarkao2@gmail.com>
Cc: netdev@vger.kernel.org
Subject: Re: [RESEND] [PATCH] tcp: fix for splice receive when used with software LRO
Date: Fri, 20 Jun 2008 13:09:35 +0300 [thread overview]
Message-ID: <200806201309.35272.opurdila@ixiacom.com> (raw)
In-Reply-To: <20080620063706.GA4009@ff.dom.local>
[-- Attachment #1: Type: text/plain, Size: 524 bytes --]
On Friday 20 June 2008, Jarek Poplawski wrote:
> This patch looks fine to me, but I wonder if, btw., this place can't
> be optimized a bit, so why can't we simply:
>
> if (spd_fill_page(spd, f->page, plen, poff, skb))
> goto err;
>
> in both cases, since nothing more can't be filled after this?
Yes, you are right. Here is the patch with your suggestions in place, tested.
BTW, I have another trivial fix and a RFC related to tcp splice read that I've
sent a while ago. Should I resend them as well?
Thanks,
tavi
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 2249 bytes --]
commit b4671a70a6d70cdf11537a5231193271b06a3efa
Author: Octavian Purdila <opurdila@ixiacom.com>
Date: Fri Jun 20 12:49:24 2008 +0300
tcp: fix for splice receive when used with software LRO
If an skb has nr_frags set to zero but its frag_list is not empty (as
it can happen if software LRO is enabled), and a previous
tcp_read_sock has consumed the linear part of the skb, then
__skb_splice_bits:
(a) incorrectly reports an error and
(b) forgets to update the offset to account for the linear part
Any of the two problems will cause the subsequent __skb_splice_bits
call (the one that handles the frag_list skbs) to either skip data,
or, if the unadjusted offset is greater then the size of the next skb
in the frag_list, make tcp_splice_read loop forever.
Signed-off-by: Octavian Purdila <opurdila@ixiacom.com>
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 25fa74d..4262006 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1198,12 +1198,14 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset,
{
unsigned int nr_pages = spd->nr_pages;
unsigned int poff, plen, len, toff, tlen;
- int headlen, seg;
+ int headlen, seg, error = 0;
toff = *offset;
tlen = *total_len;
- if (!tlen)
+ if (!tlen) {
+ error = 1;
goto err;
+ }
/*
* if the offset is greater than the linear part, go directly to
@@ -1245,8 +1247,9 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset,
* just jump directly to update and return, no point
* in going over fragments when the output is full.
*/
- if (spd_fill_page(spd, virt_to_page(p), plen, poff, skb))
- goto done;
+ error = spd_fill_page(spd, virt_to_page(p), plen, poff, skb);
+ if (error)
+ goto err;
tlen -= plen;
}
@@ -1275,8 +1278,9 @@ map_frag:
if (!plen)
break;
- if (spd_fill_page(spd, f->page, plen, poff, skb))
- break;
+ error = spd_fill_page(spd, f->page, plen, poff, skb);
+ if (error)
+ goto err;
tlen -= plen;
}
@@ -1288,7 +1292,10 @@ done:
return 0;
}
err:
- return 1;
+ /* update the offset to reflect the linear part skip, if any */
+ if (!error)
+ *offset = toff;
+ return error;
}
/*
next prev parent reply other threads:[~2008-06-20 10:11 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <485B4ADE.8070102@domat.com.pl>
2008-06-18 16:07 ` [RESEND] [PATCH] tcp: fix for splice receive when used with software LRO Octavian Purdila
2008-06-20 6:37 ` Jarek Poplawski
2008-06-20 10:09 ` Octavian Purdila [this message]
2008-06-20 11:01 ` Jarek Poplawski
2008-06-20 12:39 ` Octavian Purdila
2008-06-20 13:01 ` Jarek Poplawski
2008-06-20 20:44 ` Octavian Purdila
2008-06-22 21:07 ` Jarek Poplawski
2008-06-23 9:50 ` Octavian Purdila
2008-06-23 20:48 ` Jarek Poplawski
2008-06-20 21:57 ` Jarek Poplawski
2008-06-21 0:40 ` Octavian Purdila
2008-06-21 8:39 ` Jarek Poplawski
2008-06-21 10:32 ` Octavian Purdila
2008-06-28 0:27 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200806201309.35272.opurdila@ixiacom.com \
--to=opurdila@ixiacom.com \
--cc=jarkao2@gmail.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.