virtio_net: Pass gfp flags when allocating rx buffers.
authorMike Waychison <mikew@google.com>
Wed, 4 Jan 2012 12:52:32 +0000 (12:52 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Jan 2012 18:20:40 +0000 (13:20 -0500)
Currently, the refill path for RX buffers will always allocate the
buffers as GFP_ATOMIC, even if we are in process context.  This will
fail to apply memory pressure as the worker thread will not contribute
to the freeing of memory.

Fix this by changing add_recvbuf_small to use the gfp variant allocator,
__netdev_alloc_skb_ip_align().

Signed-off-by: Mike Waychison <mikew@google.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/virtio_net.c

index 2055386eda58d4bd21a73eaaebc6b839f3012d7f..76fe14efb2b52910c3e113dd0f8917f22c9661b6 100644 (file)
@@ -156,6 +156,7 @@ static void set_skb_frag(struct sk_buff *skb, struct page *page,
        *len -= size;
 }
 
+/* Called from bottom half context */
 static struct sk_buff *page_to_skb(struct virtnet_info *vi,
                                   struct page *page, unsigned int len)
 {
@@ -358,7 +359,7 @@ static int add_recvbuf_small(struct virtnet_info *vi, gfp_t gfp)
        struct skb_vnet_hdr *hdr;
        int err;
 
-       skb = netdev_alloc_skb_ip_align(vi->dev, MAX_PACKET_LEN);
+       skb = __netdev_alloc_skb_ip_align(vi->dev, MAX_PACKET_LEN, gfp);
        if (unlikely(!skb))
                return -ENOMEM;