[rt2x00-users] [PATCH v2 3/3] rt2x00: Reduce window of a queue's tx lock.

Helmut Schaa helmut.schaa at googlemail.com
Fri Jun 3 21:48:22 EST 2011


Am Donnerstag, 2. Juni 2011 schrieb Gertjan van Wingerde:
> Currently a lot of actions that can be done without the queue's tx lock
> being held are done inside the locked area.
> Move them out to have a leaner and meaner code that operates while the
> tx lock is being held.
> 
> Signed-off-by: Gertjan van Wingerde <gwingerde at gmail.com>

Makes perfectly sense to me!

Acked-by: Helmut Schaa <helmut.schaa at googlemail.com>

> ---
> 
> v2:
> - Respun on top of modified patches 1 & 2 of the series.
> 
> ---
>  drivers/net/wireless/rt2x00/rt2x00queue.c |   51 +++++++++++++++--------------
>  1 files changed, 26 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
> index 6194d3b..9364620 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
> @@ -565,33 +565,11 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
>  	u8 rate_idx, rate_flags;
>  	int ret = 0;
>  
> -	spin_lock(&queue->tx_lock);
> -
> -	entry = rt2x00queue_get_entry(queue, Q_INDEX);
> -
> -	if (unlikely(rt2x00queue_full(queue))) {
> -		ERROR(queue->rt2x00dev,
> -		      "Dropping frame due to full tx queue %d.\n", queue->qid);
> -		ret = -ENOBUFS;
> -		goto out;
> -	}
> -
> -	if (unlikely(test_and_set_bit(ENTRY_OWNER_DEVICE_DATA,
> -				      &entry->flags))) {
> -		ERROR(queue->rt2x00dev,
> -		      "Arrived at non-free entry in the non-full queue %d.\n"
> -		      "Please file bug report to %s.\n",
> -		      queue->qid, DRV_PROJECT);
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
>  	/*
>  	 * Copy all TX descriptor information into txdesc,
>  	 * after that we are free to use the skb->cb array
>  	 * for our information.
>  	 */
> -	entry->skb = skb;
>  	rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc);
>  
>  	/*
> @@ -604,7 +582,6 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
>  	rate_flags = tx_info->control.rates[0].flags;
>  	skbdesc = get_skb_frame_desc(skb);
>  	memset(skbdesc, 0, sizeof(*skbdesc));
> -	skbdesc->entry = entry;
>  	skbdesc->tx_rate_idx = rate_idx;
>  	skbdesc->tx_rate_flags = rate_flags;
>  
> @@ -633,9 +610,33 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
>  	 * for PCI devices.
>  	 */
>  	if (test_bit(REQUIRE_L2PAD, &queue->rt2x00dev->cap_flags))
> -		rt2x00queue_insert_l2pad(entry->skb, txdesc.header_length);
> +		rt2x00queue_insert_l2pad(skb, txdesc.header_length);
>  	else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags))
> -		rt2x00queue_align_frame(entry->skb);
> +		rt2x00queue_align_frame(skb);
> +
> +	spin_lock(&queue->tx_lock);
> +
> +	if (unlikely(rt2x00queue_full(queue))) {
> +		ERROR(queue->rt2x00dev,
> +		      "Dropping frame due to full tx queue %d.\n", queue->qid);
> +		ret = -ENOBUFS;
> +		goto out;
> +	}
> +
> +	entry = rt2x00queue_get_entry(queue, Q_INDEX);
> +
> +	if (unlikely(test_and_set_bit(ENTRY_OWNER_DEVICE_DATA,
> +				      &entry->flags))) {
> +		ERROR(queue->rt2x00dev,
> +		      "Arrived at non-free entry in the non-full queue %d.\n"
> +		      "Please file bug report to %s.\n",
> +		      queue->qid, DRV_PROJECT);
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	skbdesc->entry = entry;
> +	entry->skb = skb;
>  
>  	/*
>  	 * It could be possible that the queue was corrupted and this
> 




More information about the users mailing list