rt2x00: Use GFP_KERNEL for rx buffer allocation on USB devices
authorHelmut Schaa <helmut.schaa@googlemail.com>
Thu, 19 Apr 2012 11:24:10 +0000 (13:24 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 23 Apr 2012 19:35:29 +0000 (15:35 -0400)
Since the RX path on USB devices is handled in process context we can
use GFP_KERNEL for RX buffer allocation. This should reduce the
likelihood of allocation failures.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
Tested-By: Marc Dietrich <marvin24@gmx.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00lib.h
drivers/net/wireless/rt2x00/rt2x00pci.c
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00usb.c

index 5583214721e06ed21ab2458e519c0da8e7794754..ca36cccaba31d87b1920f4238aad0be364fce060 100644 (file)
@@ -1282,7 +1282,7 @@ void rt2x00lib_dmadone(struct queue_entry *entry);
 void rt2x00lib_txdone(struct queue_entry *entry,
                      struct txdone_entry_desc *txdesc);
 void rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status);
-void rt2x00lib_rxdone(struct queue_entry *entry);
+void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp);
 
 /*
  * mac80211 handlers.
index dd87d41ac936bcf9093fcc21f0b545e40a4a5715..e5404e576251342f24a1410ba9c6104dae8919be 100644 (file)
@@ -588,7 +588,7 @@ static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev,
        return 0;
 }
 
-void rt2x00lib_rxdone(struct queue_entry *entry)
+void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp)
 {
        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
        struct rxdone_entry_desc rxdesc;
@@ -608,7 +608,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry)
         * Allocate a new sk_buffer. If no new buffer available, drop the
         * received frame and reuse the existing buffer.
         */
-       skb = rt2x00queue_alloc_rxskb(entry);
+       skb = rt2x00queue_alloc_rxskb(entry, gfp);
        if (!skb)
                goto submit_entry;
 
index 78bd43b8961f74f1df8c89178faa5457482f6714..a0935987fa3a3ca22dfa0298d7bef054408830e6 100644 (file)
@@ -103,7 +103,7 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
  * rt2x00queue_alloc_rxskb - allocate a skb for RX purposes.
  * @entry: The entry for which the skb will be applicable.
  */
-struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry);
+struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp);
 
 /**
  * rt2x00queue_free_skb - free a skb
index 17148bb24426727971a91c130931887f7540496e..0a4653a92cab059f1dcfc18d6304c754df168fb6 100644 (file)
@@ -92,7 +92,7 @@ bool rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
                /*
                 * Send the frame to rt2x00lib for further processing.
                 */
-               rt2x00lib_rxdone(entry);
+               rt2x00lib_rxdone(entry, GFP_ATOMIC);
        }
 
        return !max_rx;
index 8ecf409476cd8126fda39721aeab0928b8d8c08e..4c662eccf53c60e32e352ac96259268103b539f7 100644 (file)
@@ -33,7 +33,7 @@
 #include "rt2x00.h"
 #include "rt2x00lib.h"
 
-struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry)
+struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
 {
        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
        struct sk_buff *skb;
@@ -68,7 +68,7 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry)
        /*
         * Allocate skbuffer.
         */
-       skb = dev_alloc_skb(frame_size + head_size + tail_size);
+       skb = __dev_alloc_skb(frame_size + head_size + tail_size, gfp);
        if (!skb)
                return NULL;
 
@@ -1163,7 +1163,7 @@ static int rt2x00queue_alloc_rxskbs(struct data_queue *queue)
        struct sk_buff *skb;
 
        for (i = 0; i < queue->limit; i++) {
-               skb = rt2x00queue_alloc_rxskb(&queue->entries[i]);
+               skb = rt2x00queue_alloc_rxskb(&queue->entries[i], GFP_KERNEL);
                if (!skb)
                        return -ENOMEM;
                queue->entries[i].skb = skb;
index 66094eb21b611275906572d76195e49751959779..d357d1ed92f6ddc363f0babca95652d8f446b3c2 100644 (file)
@@ -358,7 +358,7 @@ static void rt2x00usb_work_rxdone(struct work_struct *work)
                /*
                 * Send the frame to rt2x00lib for further processing.
                 */
-               rt2x00lib_rxdone(entry);
+               rt2x00lib_rxdone(entry, GFP_KERNEL);
        }
 }