rpms/kernel/F-13 linux-2.6-tun-orphan_an_skb_on_tx.patch, NONE, 1.1 kernel.spec, 1.2004, 1.2005

Justin M. Forbes jforbes at fedoraproject.org
Tue Apr 27 15:53:25 UTC 2010


Author: jforbes

Update of /cvs/pkgs/rpms/kernel/F-13
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv18398

Modified Files:
	kernel.spec 
Added Files:
	linux-2.6-tun-orphan_an_skb_on_tx.patch 
Log Message:
Orphan skb on tx for tun/tap devices where receiver does not consume packets

linux-2.6-tun-orphan_an_skb_on_tx.patch:
 tun.c |    4 ++++
 1 file changed, 4 insertions(+)

--- NEW FILE linux-2.6-tun-orphan_an_skb_on_tx.patch ---
commit 0110d6f22f392f976e84ab49da1b42f85b64a3c5
Author: Michael S. Tsirkin <mst at redhat.com>
Date:   Tue Apr 13 04:59:44 2010 +0000

    tun: orphan an skb on tx
    
    The following situation was observed in the field:
    tap1 sends packets, tap2 does not consume them, as a result
    tap1 can not be closed. This happens because
    tun/tap devices can hang on to skbs undefinitely.
    
    As noted by Herbert, possible solutions include a timeout followed by a
    copy/change of ownership of the skb, or always copying/changing
    ownership if we're going into a hostile device.
    
    This patch implements the second approach.
    
    Note: one issue still remaining is that since skbs
    keep reference to tun socket and tun socket has a
    reference to tun device, we won't flush backlog,
    instead simply waiting for all skbs to get transmitted.
    At least this is not user-triggerable, and
    this was not reported in practice, my assumption is
    other devices besides tap complete an skb
    within finite time after it has been queued.
    
    A possible solution for the second issue
    would not to have socket reference the device,
    instead, implement dev->destructor for tun, and
    wait for all skbs to complete there, but this
    needs some thought, probably too risky for 2.6.34.
    
    Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
    Tested-by: Yan Vugenfirer <yvugenfi at redhat.com>
    Acked-by: Herbert Xu <herbert at gondor.apana.org.au>
    Signed-off-by: David S. Miller <davem at davemloft.net>

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 96c39bd..4326520 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -387,6 +387,10 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 		}
 	}

+	/* Orphan the skb - required as we might hang on to it
+	 * for indefinite time. */
+	skb_orphan(skb);
+
 	/* Enqueue packet */
 	skb_queue_tail(&tun->socket.sk->sk_receive_queue, skb);
 	dev->trans_start = jiffies;


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-13/kernel.spec,v
retrieving revision 1.2004
retrieving revision 1.2005
diff -u -p -r1.2004 -r1.2005
--- kernel.spec	27 Apr 2010 04:31:50 -0000	1.2004
+++ kernel.spec	27 Apr 2010 15:53:24 -0000	1.2005
@@ -715,6 +715,7 @@ Patch1555: virt_console-fix-race.patch
 Patch1556: virt_console-fix-fix-race.patch
 Patch1557: virt_console-rollup2.patch
 Patch1558: vhost_net-rollup2.patch
+Patch1559: linux-2.6-tun-orphan_an_skb_on_tx.patch
 
 # fbdev x86-64 primary fix
 Patch1700: linux-2.6-x86-64-fbdev-primary.patch
@@ -1428,6 +1429,7 @@ ApplyPatch virt_console-fix-race.patch
 ApplyPatch virt_console-fix-fix-race.patch
 ApplyPatch virt_console-rollup2.patch
 ApplyPatch vhost_net-rollup2.patch
+ApplyPatch linux-2.6-tun-orphan_an_skb_on_tx.patch
 
 # Fix block I/O errors in KVM
 #ApplyPatch linux-2.6-block-silently-error-unsupported-empty-barriers-too.patch
@@ -2176,6 +2178,9 @@ fi
 # and build.
 
 %changelog
+* Tue Apr 27 2010 Justin M. Forbes <jforbes at redhat.com>
+- Orphan an skb on tx for tun/tap devices.
+
 * Tue Apr 27 2010 Chuck Ebbert <cebbert at redhat.com>  2.6.33.2-68
 - Fix possible data corruption with ext4 mounted with -o discard
 



More information about the scm-commits mailing list