Netdev List
 help / color / mirror / Atom feed
From: Eric Dumazet <eric.dumazet@gmail.com>
To: David Miller <davem@davemloft.net>
Cc: netdev <netdev@vger.kernel.org>
Subject: [PATCH net-next-2.6] net: Introduce skb_orphan_try()
Date: Sat, 17 Apr 2010 00:18:22 +0200	[thread overview]
Message-ID: <1271456302.16881.4559.camel@edumazet-laptop> (raw)
In-Reply-To: <20100415.143321.200497785.davem@davemloft.net>

Le jeudi 15 avril 2010 à 14:33 -0700, David Miller a écrit :

> If it's not legal to skb_orphan() here then it would not be legal for
> the drivers to unconditionally skb_orphan(), which they do.
> 
> So either your test is unnecessary, or we have a big existing problem
> :-)

I cooked following patch, introducing skb_orphan_try() helper, to
document all known exceptions.

I have a possible followup for this patch :

Orphaning skbs earlier could also make dev_kfree_skb_irq() faster.
Instead of queing skb into completion_queue and triggering
NET_TX_SOFTIRQ, we would directly free an orphaned skb ?



[PATCH net-next-2.6] net: Introduce skb_orphan_try()

Transmitted skb might be attached to a socket and a destructor, for
memory accounting purposes.

Traditionally, this destructor is called at tx completion time, when skb
is freed.

When tx completion is performed by another cpu than the sender, this
forces some cache lines to change ownership. XPS was an attempt to give
tx completion to initial cpu.

David idea is to call destructor right before giving skb to device (call
to ndo_start_xmit()). Because device queues are usually small, orphaning
skb before tx completion is not a big deal. Some drivers already do
this, we could do it in upper level.

There is one known exception to this early orphaning, called tx
timestamping. It needs to keep a reference to socket until device can
give a hardware or software timestamp.

This patch adds a skb_orphan_try() helper, to centralize all exceptions
to early orphaning in one spot, and use it in dev_hard_start_xmit().

"tbench 16" results on a Nehalem machine (2 X5570  @ 2.93GHz)
before: Throughput 4428.9 MB/sec 16 procs
after: Throughput 4448.14 MB/sec 16 procs

UDP should get even better results, its destructor being more complex,
since SOCK_USE_WRITE_QUEUE is not set (four atomic ops instead of one)

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
---
diff --git a/net/core/dev.c b/net/core/dev.c
index e8041eb..acae5fe 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1880,6 +1880,17 @@ static int dev_gso_segment(struct sk_buff *skb)
 	return 0;
 }
 
+/*
+ * Try to orphan skb early, right before transmission by the device.
+ * We cannot orphan skb if tx timestamp is requested, since
+ * drivers need to call skb_tstamp_tx() to send the timestamp.
+ */
+static inline void skb_orphan_try(struct sk_buff *skb)
+{
+	if (!skb_tx(skb)->flags)
+		skb_orphan(skb);
+}
+
 int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
 			struct netdev_queue *txq)
 {
@@ -1904,23 +1915,10 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
 		if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
 			skb_dst_drop(skb);
 
+		skb_orphan_try(skb);
 		rc = ops->ndo_start_xmit(skb, dev);
 		if (rc == NETDEV_TX_OK)
 			txq_trans_update(txq);
-		/*
-		 * TODO: if skb_orphan() was called by
-		 * dev->hard_start_xmit() (for example, the unmodified
-		 * igb driver does that; bnx2 doesn't), then
-		 * skb_tx_software_timestamp() will be unable to send
-		 * back the time stamp.
-		 *
-		 * How can this be prevented? Always create another
-		 * reference to the socket before calling
-		 * dev->hard_start_xmit()? Prevent that skb_orphan()
-		 * does anything in dev->hard_start_xmit() by clearing
-		 * the skb destructor before the call and restoring it
-		 * afterwards, then doing the skb_orphan() ourselves?
-		 */
 		return rc;
 	}
 
@@ -1938,6 +1936,7 @@ gso:
 		if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
 			skb_dst_drop(nskb);
 
+		skb_orphan_try(nskb);
 		rc = ops->ndo_start_xmit(nskb, dev);
 		if (unlikely(rc != NETDEV_TX_OK)) {
 			if (rc & ~NETDEV_TX_MASK)



  reply	other threads:[~2010-04-16 22:18 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-11 20:38 NULL pointer dereference panic in stable (2.6.33.2), amd64 Denys Fedorysychenko
2010-04-11 22:35 ` Eric Dumazet
2010-04-11 23:04   ` Denys Fedorysychenko
2010-04-11 23:11     ` Eric Dumazet
2010-04-11 23:36       ` Denys Fedorysychenko
2010-04-12  3:38   ` Krishna Kumar2
2010-04-12  6:01     ` Eric Dumazet
2010-04-12  7:18       ` Eric Dumazet
2010-04-12  7:36         ` David Miller
2010-04-15  6:52         ` David Miller
2010-04-15  8:02           ` Eric Dumazet
2010-04-15  8:26             ` David Miller
2010-04-15  8:51               ` Eric Dumazet
2010-04-15  9:06                 ` David Miller
2010-04-15  9:11                   ` Denys Fedorysychenko
2010-04-15 10:37                     ` Eric Dumazet
2010-04-29 10:50                       ` Denys Fedorysychenko
2010-04-15 20:30                   ` Eric Dumazet
2010-04-15 20:46                     ` Eric Dumazet
2010-04-15 21:33                       ` David Miller
2010-04-16 22:18                         ` Eric Dumazet [this message]
2010-04-18  9:46                           ` [PATCH net-next-2.6] net: Introduce skb_orphan_try() David Miller
2010-04-21  6:08                             ` Eric Dumazet
2010-04-22  5:56                               ` David Miller
2010-04-22  7:10                                 ` Eric Dumazet
2010-04-22  7:16                                   ` David Miller
2010-04-22  7:24                                     ` Eric Dumazet
2010-04-22  7:26                                       ` David Miller
2010-04-22  7:33                                         ` Eric Dumazet
2010-04-22  7:41                                           ` David Miller
2010-04-22  7:47                                             ` Eric Dumazet
2010-04-22  7:54                                               ` David Miller
2010-04-22  7:59                                                 ` Eric Dumazet
2010-04-12  7:54       ` NULL pointer dereference panic in stable (2.6.33.2), amd64 Krishna Kumar2
2010-04-12  9:31         ` Eric Dumazet
2010-04-12 16:11           ` Denys Fedorysychenko
2010-04-12 20:09             ` Eric Dumazet

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=1271456302.16881.4559.camel@edumazet-laptop \
    --to=eric.dumazet@gmail.com \
    --cc=davem@davemloft.net \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox