[rt2x00-users] [RFT] rt2x00: Use GFP_KERNEL for rx buffer allocation on USB devices

Marc Dietrich marvin24 at gmx.de
Thu Apr 19 03:05:43 EST 2012


On Wednesday 18 April 2012 10:16:57 Helmut Schaa wrote:
> 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 at googlemail.com>
> ---
> 
> I don't have any USB devices here, so this is untested.
> Mind to give it a try?

this seems to have fixed it here, so 

Tested-By: Marc Dietrich <marvin24 at gmx.de>

Thanks!

Marc

> 
> Thanks,
> Helmut
> 
>  drivers/net/wireless/rt2x00/rt2x00.h      |    2 +-
>  drivers/net/wireless/rt2x00/rt2x00dev.c   |    4 ++--
>  drivers/net/wireless/rt2x00/rt2x00lib.h   |    2 +-
>  drivers/net/wireless/rt2x00/rt2x00pci.c   |    2 +-
>  drivers/net/wireless/rt2x00/rt2x00queue.c |    6 +++---
>  drivers/net/wireless/rt2x00/rt2x00usb.c   |    2 +-
>  6 files changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h
> b/drivers/net/wireless/rt2x00/rt2x00.h index 527a261..6ad9b6a 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -1294,7 +1294,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);
>  void rt2x00lib_wake_sta_tid(struct rt2x00_dev *rt2x00dev,
>  			    struct rt2x00_sta *sta_priv,
>  			    int tid);
> diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c
> b/drivers/net/wireless/rt2x00/rt2x00dev.c index 3da098b..20e6348 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
> @@ -647,7 +647,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;
> @@ -667,7 +667,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;
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h
> b/drivers/net/wireless/rt2x00/rt2x00lib.h index 8317ae4..f0aca2a 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
> @@ -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
> diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c
> b/drivers/net/wireless/rt2x00/rt2x00pci.c index 17148bb..0a4653a 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
> @@ -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;
> diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c
> b/drivers/net/wireless/rt2x00/rt2x00queue.c index 7b4f6b1..7bee686 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
> @@ -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;
> 
> @@ -1193,7 +1193,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;
> diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c
> b/drivers/net/wireless/rt2x00/rt2x00usb.c index 2eea386..790620a 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
> @@ -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);
>  	}
>  }



More information about the users mailing list