All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jarek Poplawski <jarkao2@gmail.com>
To: David Miller <davem@davemloft.net>
Cc: herbert@gondor.apana.org.au, zbr@ioremap.net, w@1wt.eu,
	dada1@cosmosbay.com, ben@zeus.com, mingo@elte.hu,
	linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	jens.axboe@oracle.com
Subject: Re: [PATCH v2] tcp: splice as many packets as possible at once
Date: Wed, 4 Feb 2009 07:56:37 +0000	[thread overview]
Message-ID: <20090204075637.GA4279@ff.dom.local> (raw)
In-Reply-To: <20090203094108.GA4639@ff.dom.local>

On Tue, Feb 03, 2009 at 09:41:08AM +0000, Jarek Poplawski wrote:
> On Mon, Feb 02, 2009 at 11:50:17PM -0800, David Miller wrote:
> > From: Jarek Poplawski <jarkao2@gmail.com>
> > Date: Mon, 2 Feb 2009 08:43:58 +0000
> > 
> > > On Mon, Feb 02, 2009 at 12:18:54AM -0800, David Miller wrote:
> > > > Allocating 4096 or 8192 bytes for a 1500 byte frame is wasteful.
> > > 
> > > I mean allocating chunks of cached pages similarly to sk_sndmsg_page
> > > way. I guess the similar problem is to be worked out in any case. But
> > > it seems doing it on the linear area requires less changes in other
> > > places.
> > 
> > This is a very interesting idea, but it has some drawbacks:
> > 
> > 1) Just like any other allocator we'll need to find a way to
> >    handle > PAGE_SIZE allocations, and thus add handling for
> >    compound pages etc.
> >  
> >    And exactly the drivers that want such huge SKB data areas
> >    on receive should be converted to use scatter gather page
> >    vectors in order to avoid multi-order pages and thus strains
> >    on the page allocator.
> 
> I guess compound pages are handled by put_page() enough, but I don't
> think they should be main argument here, and I agree: scatter gather
> should be used where possible.
> 
> > 
> > 2) Space wastage and poor packing can be an issue.
> > 
> >    Even with SLAB/SLUB we get poor packing, look at Evegeniy's
> >    graphs that he made when writing his NTA patches.
> 
> I'm a bit lost here: could you "remind" the way page space would be
> used/saved in your paged variant e.g. for ~1500B skbs?

Here is some proof of concept to make sure I wasn't misunderstood.
alloc_paged() is used only for "normal" size skbs (2x ~1500B per page;
I think Herbert mentioned something like this at the beginning; it
also avoids allocs other than GFP_ATOMIC and GFP_KERNEL for
simplicity.)

I guess it could be replaced with any other mechanizm allocting to a
fragment or Evgeniy's allocator when it's ready.
 
Alas it's not tested, but if it works, I think it should show how
much gain is expected here for most common traffic.

Jarek P.
---

diff -Nurp a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h	2009-02-02 20:23:46.000000000 +0100
+++ b/include/linux/netdevice.h	2009-02-02 21:52:46.000000000 +0100
@@ -1154,6 +1154,9 @@ struct softnet_data
 	struct sk_buff		*completion_queue;
 
 	struct napi_struct	backlog;
+
+	struct page		*alloc_skb_page[2];
+	unsigned int		alloc_skb_off[2];
 };
 
 DECLARE_PER_CPU(struct softnet_data,softnet_data);
diff -Nurp a/include/linux/skbuff.h b/include/linux/skbuff.h
--- a/include/linux/skbuff.h	2009-02-02 20:23:46.000000000 +0100
+++ b/include/linux/skbuff.h	2009-02-02 22:12:04.000000000 +0100
@@ -144,7 +144,8 @@ struct skb_shared_info {
 	unsigned short	gso_size;
 	/* Warning: this field is not always filled in (UFO)! */
 	unsigned short	gso_segs;
-	unsigned short  gso_type;
+	__u8		gso_type;
+	__u8		alloc_paged;
 	__be32          ip6_frag_id;
 #ifdef CONFIG_HAS_DMA
 	unsigned int	num_dma_maps;
diff -Nurp a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c	2009-02-02 19:37:33.000000000 +0100
+++ b/net/core/dev.c	2009-02-02 23:15:55.000000000 +0100
@@ -5243,6 +5243,9 @@ static int __init net_dev_init(void)
 		queue->backlog.poll = process_backlog;
 		queue->backlog.weight = weight_p;
 		queue->backlog.gro_list = NULL;
+
+		queue->alloc_skb_page[0] = NULL;
+		queue->alloc_skb_page[1] = NULL;
 	}
 
 	dev_boot_phase = 0;
diff -Nurp a/net/core/skbuff.c b/net/core/skbuff.c
--- a/net/core/skbuff.c	2009-02-02 20:23:46.000000000 +0100
+++ b/net/core/skbuff.c	2009-02-02 23:57:10.000000000 +0100
@@ -151,6 +151,55 @@ void skb_truesize_bug(struct sk_buff *sk
 }
 EXPORT_SYMBOL(skb_truesize_bug);
 
+static inline void *alloc_paged(unsigned int size, gfp_t gfp_mask)
+{
+	struct softnet_data *sd;
+	unsigned long flags;
+	unsigned int off;
+	struct page *p;
+	void *ret;
+	int i;
+
+	if (size < 1400 || size > 2000)
+		return NULL;
+
+	if (gfp_mask == GFP_ATOMIC)
+		i = 0;
+	else if (gfp_mask == GFP_KERNEL)
+		i = 1;
+	else
+		return NULL;
+
+	local_irq_save(flags);
+	sd = &__get_cpu_var(softnet_data);
+	p = sd->alloc_skb_page[i];
+
+	if (p) {
+		off = sd->alloc_skb_off[i];
+		if (off + size > PAGE_SIZE) {
+			put_page(p);
+			goto new_page;
+		}
+	} else {
+new_page:
+		p = sd->alloc_skb_page[i] = alloc_pages(gfp_mask, 0);
+		if (!p) {
+			ret = NULL;
+			goto out;
+		}
+
+		off = 0;
+		/* hold one ref to this page until it's full */
+	}
+
+	get_page(p);
+	ret = page_address(p) + off;
+	sd->alloc_skb_off[i] = off + size;
+out:
+	local_irq_restore(flags);
+	return ret;
+}
+
 /* 	Allocate a new skbuff. We do this ourselves so we can fill in a few
  *	'private' fields and also do memory statistics to find all the
  *	[BEEP] leaks.
@@ -178,7 +227,7 @@ struct sk_buff *__alloc_skb(unsigned int
 	struct kmem_cache *cache;
 	struct skb_shared_info *shinfo;
 	struct sk_buff *skb;
-	u8 *data;
+	u8 *data, paged = 0;
 
 	cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
 
@@ -188,8 +237,13 @@ struct sk_buff *__alloc_skb(unsigned int
 		goto out;
 
 	size = SKB_DATA_ALIGN(size);
-	data = kmalloc_node_track_caller(size + sizeof(struct skb_shared_info),
-			gfp_mask, node);
+	data = alloc_paged(size + sizeof(struct skb_shared_info), gfp_mask);
+	if (data)
+		paged = 1;
+	else
+		data = kmalloc_node_track_caller(size +
+						 sizeof(struct skb_shared_info),
+						 gfp_mask, node);
 	if (!data)
 		goto nodata;
 
@@ -214,6 +268,7 @@ struct sk_buff *__alloc_skb(unsigned int
 	shinfo->gso_type = 0;
 	shinfo->ip6_frag_id = 0;
 	shinfo->frag_list = NULL;
+	shinfo->alloc_paged = paged;
 
 	if (fclone) {
 		struct sk_buff *child = skb + 1;
@@ -341,7 +396,10 @@ static void skb_release_data(struct sk_b
 		if (skb_shinfo(skb)->frag_list)
 			skb_drop_fraglist(skb);
 
-		kfree(skb->head);
+		if (skb_shinfo(skb)->alloc_paged)
+			put_page(virt_to_page(skb->head));
+		else
+			kfree(skb->head);
 	}
 }
 
@@ -1380,7 +1438,7 @@ static inline int spd_fill_page(struct s
 	if (unlikely(spd->nr_pages == PIPE_BUFFERS))
 		return 1;
 
-	if (linear) {
+	if (linear && !skb_shinfo(skb)->alloc_paged) {
 		page = linear_to_page(page, len, &offset, skb);
 		if (!page)
 			return 1;

  parent reply	other threads:[~2009-02-04  7:56 UTC|newest]

Thread overview: 190+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-08 17:30 [PATCH] tcp: splice as many packets as possible at once Willy Tarreau
2009-01-08 19:44 ` Jens Axboe
2009-01-08 22:03   ` Willy Tarreau
2009-01-08 21:50 ` Ben Mansell
2009-01-08 21:55   ` David Miller
2009-01-08 22:20     ` Willy Tarreau
2009-01-13 23:08       ` David Miller
2009-01-09  6:47     ` Eric Dumazet
2009-01-09  7:04       ` Willy Tarreau
2009-01-09  7:28         ` Eric Dumazet
2009-01-09  7:42           ` Willy Tarreau
2009-01-13 23:27           ` David Miller
2009-01-13 23:35             ` Eric Dumazet
2009-01-09 15:42       ` Eric Dumazet
2009-01-09 17:57         ` Eric Dumazet
2009-01-09 18:54         ` Willy Tarreau
2009-01-09 20:51           ` Eric Dumazet
2009-01-09 21:24             ` Willy Tarreau
2009-01-09 22:02               ` Eric Dumazet
2009-01-09 22:09                 ` Willy Tarreau
2009-01-09 22:07               ` Willy Tarreau
2009-01-09 22:12                 ` Eric Dumazet
2009-01-09 22:17                   ` Willy Tarreau
2009-01-09 22:42                     ` Evgeniy Polyakov
2009-01-09 22:50                       ` Willy Tarreau
2009-01-09 23:01                         ` Evgeniy Polyakov
2009-01-09 23:06                           ` Willy Tarreau
2009-01-10  7:40                       ` Eric Dumazet
2009-01-11 12:58                         ` Evgeniy Polyakov
2009-01-11 13:14                           ` Eric Dumazet
2009-01-11 13:35                             ` Evgeniy Polyakov
2009-01-11 16:00                               ` Eric Dumazet
2009-01-11 16:05                                 ` Evgeniy Polyakov
2009-01-14  0:07                                   ` David Miller
2009-01-14  0:13                                     ` Evgeniy Polyakov
2009-01-14  0:16                                       ` David Miller
2009-01-14  0:22                                         ` Evgeniy Polyakov
2009-01-14  0:37                                           ` David Miller
2009-01-14  3:51                                             ` Herbert Xu
2009-01-14  4:25                                               ` David Miller
2009-01-14  7:27                                               ` David Miller
2009-01-14  8:26                                                 ` Herbert Xu
2009-01-14  8:53                                                   ` Jarek Poplawski
2009-01-14  9:29                                                     ` David Miller
2009-01-14  9:42                                                       ` Jarek Poplawski
2009-01-14 10:06                                                         ` David Miller
2009-01-14 10:47                                                           ` Jarek Poplawski
2009-01-14 11:29                                                             ` Herbert Xu
2009-01-14 11:40                                                               ` Jarek Poplawski
2009-01-14 11:45                                                                 ` Jarek Poplawski
2009-01-14  9:54                                                       ` Jarek Poplawski
2009-01-14 10:01                                                         ` Willy Tarreau
2009-01-14 12:06                                                         ` Jarek Poplawski
2009-01-14 12:15                                                         ` Jarek Poplawski
2009-01-14 11:28                                                       ` Herbert Xu
2009-01-15 23:03                                                       ` Willy Tarreau
2009-01-15 23:19                                                         ` David Miller
2009-01-15 23:19                                                         ` Herbert Xu
2009-01-15 23:26                                                           ` David Miller
2009-01-15 23:32                                                             ` Herbert Xu
2009-01-15 23:34                                                               ` David Miller
2009-01-15 23:42                                                                 ` Willy Tarreau
2009-01-15 23:44                                                                   ` Willy Tarreau
2009-01-15 23:54                                                                     ` David Miller
2009-01-19  0:42                                                                       ` Willy Tarreau
2009-01-19  3:08                                                                         ` Herbert Xu
2009-01-19  3:27                                                                           ` David Miller
2009-01-19  6:14                                                                             ` Willy Tarreau
2009-01-19  6:19                                                                               ` David Miller
2009-01-19  6:45                                                                                 ` Willy Tarreau
2009-01-19 10:19                                                                                 ` Herbert Xu
2009-01-19 20:59                                                                                   ` David Miller
2009-01-19 21:24                                                                                     ` Herbert Xu
2009-01-25 21:03                                                                                     ` Willy Tarreau
2009-01-26  7:59                                                                                       ` Jarek Poplawski
2009-01-26  8:12                                                                                         ` Willy Tarreau
2009-01-19  8:40                                                                               ` Jarek Poplawski
2009-01-19  3:28                                                                         ` David Miller
2009-01-19  6:11                                                                           ` Willy Tarreau
2009-01-24 21:23                                                                           ` Willy Tarreau
2009-01-20 12:01                                                                         ` Ben Mansell
2009-01-20 12:11                                                                           ` Evgeniy Polyakov
2009-01-20 13:43                                                                             ` Ben Mansell
2009-01-20 14:06                                                                               ` Jarek Poplawski
2009-01-16  6:51                                                                     ` Jarek Poplawski
2009-01-19  6:08                                                                       ` David Miller
2009-01-19  6:16                                                                 ` David Miller
2009-01-19 10:20                                                                   ` Herbert Xu
2009-01-20  8:37                                                             ` Jarek Poplawski
2009-01-20  9:33                                                               ` [PATCH v2] " Jarek Poplawski
2009-01-20 10:00                                                                 ` Evgeniy Polyakov
2009-01-20 10:20                                                                   ` Jarek Poplawski
2009-01-20 10:31                                                                     ` Evgeniy Polyakov
2009-01-20 11:01                                                                       ` Jarek Poplawski
2009-01-20 17:16                                                                         ` David Miller
2009-01-21  9:54                                                                           ` Jarek Poplawski
2009-01-22  9:04                                                                           ` [PATCH v3] " Jarek Poplawski
2009-01-26  5:22                                                                             ` David Miller
2009-01-27  7:11                                                                               ` Herbert Xu
2009-01-27  7:54                                                                                 ` Jarek Poplawski
2009-01-27 10:09                                                                                   ` Herbert Xu
2009-01-27 10:35                                                                                     ` Jarek Poplawski
2009-01-27 10:57                                                                                       ` Jarek Poplawski
2009-01-27 11:48                                                                                       ` Herbert Xu
2009-01-27 12:16                                                                                         ` Jarek Poplawski
2009-01-27 12:31                                                                                           ` Jarek Poplawski
2009-01-27 17:06                                                                                             ` David Miller
2009-01-28  8:10                                                                                               ` Jarek Poplawski
2009-02-01  8:41                                                                                 ` David Miller
2009-01-26  8:20                                                                       ` [PATCH v2] " Jarek Poplawski
2009-01-26 21:21                                                                         ` Evgeniy Polyakov
2009-01-27  6:10                                                                           ` David Miller
2009-01-27  7:40                                                                             ` Jarek Poplawski
2009-01-30 21:42                                                                               ` David Miller
2009-01-30 21:59                                                                                 ` Willy Tarreau
2009-01-30 22:03                                                                                   ` David Miller
2009-01-30 22:13                                                                                     ` Willy Tarreau
2009-01-30 22:15                                                                                       ` David Miller
2009-01-30 22:16                                                                                 ` Herbert Xu
2009-02-02  8:08                                                                                   ` Jarek Poplawski
2009-02-02  8:18                                                                                     ` David Miller
2009-02-02  8:43                                                                                       ` Jarek Poplawski
2009-02-03  7:50                                                                                         ` David Miller
2009-02-03  9:41                                                                                           ` Jarek Poplawski
2009-02-03 11:10                                                                                             ` Evgeniy Polyakov
2009-02-03 11:24                                                                                               ` Herbert Xu
2009-02-03 11:49                                                                                                 ` Evgeniy Polyakov
2009-02-03 11:53                                                                                                   ` Herbert Xu
2009-02-03 12:07                                                                                                     ` Evgeniy Polyakov
2009-02-03 12:12                                                                                                       ` Herbert Xu
2009-02-03 12:18                                                                                                         ` Evgeniy Polyakov
2009-02-03 12:25                                                                                                           ` Willy Tarreau
2009-02-03 12:28                                                                                                             ` Herbert Xu
2009-02-04  0:47                                                                                                             ` David Miller
2009-02-04  6:19                                                                                                               ` Willy Tarreau
2009-02-04  8:12                                                                                                                 ` Evgeniy Polyakov
2009-02-04  8:54                                                                                                                   ` Willy Tarreau
2009-02-04  8:59                                                                                                                     ` Herbert Xu
2009-02-04  9:01                                                                                                                       ` David Miller
2009-02-04  9:12                                                                                                                         ` Willy Tarreau
2009-02-04  9:15                                                                                                                           ` David Miller
2009-02-04 19:19                                                                                                                           ` Roland Dreier
2009-02-04 19:28                                                                                                                             ` Willy Tarreau
2009-02-04 19:48                                                                                                                               ` Jarek Poplawski
2009-02-05  8:32                                                                                                                           ` Bill Fink
2009-02-04  9:12                                                                                                                 ` David Miller
2009-02-03 12:27                                                                                                           ` Herbert Xu
2009-02-03 13:05                                                                                                   ` david
2009-02-03 12:12                                                                                                     ` Evgeniy Polyakov
2009-02-03 12:18                                                                                                       ` Herbert Xu
2009-02-03 12:30                                                                                                         ` Evgeniy Polyakov
2009-02-03 12:33                                                                                                           ` Herbert Xu
2009-02-03 12:33                                                                                                         ` Nick Piggin
2009-02-04  0:46                                                                                                 ` David Miller
2009-02-04  9:41                                                                                                   ` Benny Amorsen
2009-02-04 12:01                                                                                                     ` Herbert Xu
2009-02-03 12:36                                                                                               ` Jarek Poplawski
2009-02-03 13:06                                                                                                 ` Evgeniy Polyakov
2009-02-03 13:25                                                                                                   ` Jarek Poplawski
2009-02-03 14:20                                                                                                     ` Evgeniy Polyakov
2009-02-04  0:46                                                                                               ` David Miller
2009-02-04  8:08                                                                                                 ` Evgeniy Polyakov
2009-02-04  9:23                                                                                                   ` Nick Piggin
2009-02-04  7:56                                                                                             ` Jarek Poplawski [this message]
2009-02-06  7:52                                                                                             ` David Miller
2009-02-06  8:09                                                                                               ` Herbert Xu
2009-02-06  9:10                                                                                               ` Jarek Poplawski
2009-02-06  9:17                                                                                                 ` David Miller
2009-02-06  9:42                                                                                                   ` Jarek Poplawski
2009-02-06  9:49                                                                                                     ` David Miller
2009-02-06  9:23                                                                                                 ` Herbert Xu
2009-02-06  9:51                                                                                                   ` Jarek Poplawski
2009-02-06 10:28                                                                                                     ` Herbert Xu
2009-02-06 10:58                                                                                                       ` Jarek Poplawski
2009-02-06 11:10                                                                                                         ` Willy Tarreau
2009-02-06 11:47                                                                                                           ` Jarek Poplawski
2009-02-06 18:59                                                                                               ` Jarek Poplawski
2009-02-03 11:38                                                                                 ` Nick Piggin
2009-01-27 18:42                                                                             ` David Miller
2009-01-15 23:32                                                           ` [PATCH] " Willy Tarreau
2009-01-15 23:35                                                             ` David Miller
2009-01-14  0:51                                         ` Herbert Xu
2009-01-14  1:24                                           ` David Miller
2009-01-09 22:45                     ` Eric Dumazet
2009-01-09 22:53                       ` Willy Tarreau
2009-01-09 23:34                         ` Eric Dumazet
2009-01-13  5:45                           ` David Miller
2009-01-14  0:05                           ` David Miller
2009-01-13 23:31         ` David Miller
2009-01-13 23:26       ` 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=20090204075637.GA4279@ff.dom.local \
    --to=jarkao2@gmail.com \
    --cc=ben@zeus.com \
    --cc=dada1@cosmosbay.com \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=netdev@vger.kernel.org \
    --cc=w@1wt.eu \
    --cc=zbr@ioremap.net \
    /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.