All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] virtio_net: Recycle some more rx buffer pages
@ 2008-10-08 19:34 Mark McLoughlin
  2008-10-08 19:34 ` [PATCH 2/2] virtio_net: Improve the recv buffer allocation scheme Mark McLoughlin
  2008-10-16  5:08 ` [PATCH 1/2] virtio_net: Recycle some more rx buffer pages Rusty Russell
  0 siblings, 2 replies; 12+ messages in thread
From: Mark McLoughlin @ 2008-10-08 19:34 UTC (permalink / raw)
  To: Rusty Russell; +Cc: linux-kernel, virtualization, Mark McLoughlin

Each time we re-fill the recv queue with buffers, we allocate
one too many skbs and free it again when adding fails. We should
recycle the pages allocated in this case.

A previous version of this patch made trim_pages() trim trailing
unused pages from skbs with some paged data, but this actually
caused a barely measurable slowdown.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
 drivers/net/virtio_net.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 0196a0d..985271a 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -82,6 +82,16 @@ static void give_a_page(struct virtnet_info *vi, struct page *page)
 	vi->pages = page;
 }
 
+static void trim_pages(struct virtnet_info *vi, struct sk_buff *skb)
+{
+	unsigned int i;
+
+	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
+		give_a_page(vi, skb_shinfo(skb)->frags[i].page);
+	skb_shinfo(skb)->nr_frags = 0;
+	skb->data_len = 0;
+}
+
 static struct page *get_a_page(struct virtnet_info *vi, gfp_t gfp_mask)
 {
 	struct page *p = vi->pages;
@@ -121,14 +131,8 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb,
 	}
 	len -= sizeof(struct virtio_net_hdr);
 
-	if (len <= MAX_PACKET_LEN) {
-		unsigned int i;
-
-		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-			give_a_page(dev->priv, skb_shinfo(skb)->frags[i].page);
-		skb->data_len = 0;
-		skb_shinfo(skb)->nr_frags = 0;
-	}
+	if (len <= MAX_PACKET_LEN)
+		trim_pages(dev->priv, skb);
 
 	err = pskb_trim(skb, len);
 	if (err) {
@@ -232,6 +236,7 @@ static void try_fill_recv(struct virtnet_info *vi)
 		err = vi->rvq->vq_ops->add_buf(vi->rvq, sg, 0, num, skb);
 		if (err) {
 			skb_unlink(skb, &vi->recv);
+			trim_pages(vi, skb);
 			kfree_skb(skb);
 			break;
 		}
-- 
1.5.4.3

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2008-10-16  9:15 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-08 19:34 [PATCH 1/2] virtio_net: Recycle some more rx buffer pages Mark McLoughlin
2008-10-08 19:34 ` [PATCH 2/2] virtio_net: Improve the recv buffer allocation scheme Mark McLoughlin
2008-10-09  0:55   ` Rusty Russell
2008-10-09 15:30     ` Herbert Xu
2008-10-09 17:40       ` Mark McLoughlin
2008-10-09 19:26         ` Anthony Liguori
2008-10-10  8:30           ` Mark McLoughlin
2008-10-16  9:15           ` Rusty Russell
2008-10-10 12:56       ` Mark McLoughlin
2008-10-16  4:43       ` Rusty Russell
2008-10-09 15:35     ` Chris Wright
2008-10-16  5:08 ` [PATCH 1/2] virtio_net: Recycle some more rx buffer pages Rusty Russell

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.