On Thu, 2012-06-21 at 15:24 -0400, Neil Horman wrote:
> Noticed that we can shuffle the code around in fcoe_percpu_receive_thread a 
> bit
> and avoid taking the fcoe_rx_list lock twice per iteration.  This should 
> improve
> throughput somewhat.  With this change we take the lock, and check for new
> frames in a single critical section.  Only if the list is empty do we drop the
> lock and re-acquire it after being signaled to wake up.
> 
> Change Notes:
> v2) did some further cleanup on the patch by replacing the 2nd call of
> spin_lock/splice_init with a goto to the top of the outer loop.  This allows 
> me
> to change the inner while loop to an if conditional and remove the sencond 
> check
> of kthread_should_stop.  Based on suggestion from Vasu Dev.
> 
> Signed-off-by: Neil Horman <nhor...@tuxdriver.com>
> CC: Robert Love <robert.w.l...@intel.com>
> CC: Vasu Dev <vasu....@linux.intel.com>
> ---
>  drivers/scsi/fcoe/fcoe.c |   18 ++++++++++--------
>  1 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index 0b48c7d..0d80837 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -1816,23 +1816,25 @@ static int fcoe_percpu_receive_thread(void *arg)
>  
>       set_user_nice(current, -20);
>  
> +retry:
>       while (!kthread_should_stop()) {
>  
>               spin_lock_bh(&p->fcoe_rx_list.lock);
>               skb_queue_splice_init(&p->fcoe_rx_list, &tmp);
> -             spin_unlock_bh(&p->fcoe_rx_list.lock);
> -
> -             while ((skb = __skb_dequeue(&tmp)) != NULL)
> -                     fcoe_recv_frame(skb);
>  
> -             spin_lock_bh(&p->fcoe_rx_list.lock);
> -             if (!skb_queue_len(&p->fcoe_rx_list)) {
> +             if (!skb_queue_len(&tmp)) {
>                       set_current_state(TASK_INTERRUPTIBLE);
>                       spin_unlock_bh(&p->fcoe_rx_list.lock);
>                       schedule();
>                       set_current_state(TASK_RUNNING);
> -             } else
> -                     spin_unlock_bh(&p->fcoe_rx_list.lock);
> +                     goto retry;
> +             }
> +
> +             spin_unlock_bh(&p->fcoe_rx_list.lock);
> +
> +             while ((skb = __skb_dequeue(&tmp)) != NULL)
> +                     fcoe_recv_frame(skb);
> +
>       }
>       return 0;
>  }

Look good, Acked-by: Vasu Dev <vasu....@intel.com>

Thanks
Vasu


_______________________________________________
devel mailing list
devel@open-fcoe.org
https://lists.open-fcoe.org/mailman/listinfo/devel

Reply via email to