The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Stuffed Crust <pizza@shaftnet.org>
To: davem@davemloft.net
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] fix long-standing bug in 2.6/2.4 skb_copy/skb_copy_expand
Date: Sun, 8 May 2005 10:32:59 -0400	[thread overview]
Message-ID: <20050508143259.GA30676@shaftnet.org> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 1937 bytes --]

Signed-off-by: Solomon Peachy <pizza@shaftnet.org>

This patch tweaks the skb_copy_bits() call in skb_copy() and 
skb_copy_expand().  In the sace of skb_copy():

if (skb_copy_bits(skb, -headerlen, n->head, headerlen + skb->len))

Basically, this call assumes that n->head+headerlen == n->data.

This is, fortunately, generally true.  But if the alloc_skb function 
allocates extra head room (ie calls skb_reserve() on the skb before it 
passes it to the callee, this doesn't quite work.  Instead, it should be 
rewritten as:

if (skb_copy_bits(skb, -headerlen, n->data-headerlen, headerlen + skb->len))

Rewriting it this way works; n->data-headerlen is equal to n->data 
before the skb_reserve() call.  This seems MoreCorrect(tm), as it makes 
no assumptions about the state of the skb passed into it.  (n->data just 
so happens to equal n->head too)

skb_copy_expand() has the same problem as well, and has a similar fix.

This patch is against 2.6.12-rc4, though it should apply cleanly to any 
2.4/2.6 kernel.

...

The history behind this is a little sordid -- We were trying to
implement a "poor man's zerocopy" transmit path for a braindead USB
wireless controller.  It needed a descriptor packet prepended to the
frame contents, but couldn't handle it in a separate USB packet -- so
we'd have to do a realloc on the skb to give us the headroom we eneded. 
memcpy()s on the very underpowered target were expensive, so we tried
modifying skb_alloc to always ensure there would be enough headroom for
the descriptor (allocating extra, and then skb_reserve()ing it).  It was
a crude hack, but it gained us a few much-needed percentage points of
throughput.  That is once we fixed skb_copy()..

Anyway, please consider this patch for inclusion. 

 - Solomon
-- 
Solomon Peachy        				 ICQ: 1318344
Melbourne, FL 					 JID: pitha@myjabber.net
Quidquid latine dictum sit, altum viditur

[-- Attachment #1.2: skb_copy_fixes.diff --]
[-- Type: text/plain, Size: 704 bytes --]

--- /linux/net/core/skbuff.c	2005-05-08 09:57:37.000000000 -0400
+++ skbuff.c	2005-05-08 10:27:17.000000000 -0400
@@ -486,7 +486,7 @@
 	n->csum	     = skb->csum;
 	n->ip_summed = skb->ip_summed;
 
-	if (skb_copy_bits(skb, -headerlen, n->head, headerlen + skb->len))
+	if (skb_copy_bits(skb, -headerlen, n->data-headerlen, headerlen + skb->len))
 		BUG();
 
 	copy_skb_header(n, skb);
@@ -680,7 +680,7 @@
 		head_copy_off = newheadroom - head_copy_len;
 
 	/* Copy the linear header and data. */
-	if (skb_copy_bits(skb, -head_copy_len, n->head + head_copy_off,
+	if (skb_copy_bits(skb, -head_copy_len, n->data-newheadroom + head_copy_off,
 			  skb->len + head_copy_len))
 		BUG();
 

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

             reply	other threads:[~2005-05-08 14:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-05-08 14:32 Stuffed Crust [this message]
2005-05-09  3:04 ` [PATCH] fix long-standing bug in 2.6/2.4 skb_copy/skb_copy_expand Herbert Xu
2005-05-11 20:38   ` Stuffed Crust
2005-05-11 18:40 ` David S. 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=20050508143259.GA30676@shaftnet.org \
    --to=pizza@shaftnet.org \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox