On Mon, 2012-02-27 at 14:22 -0500, Neil Horman wrote:
> There is potentially lots of contention for the rx_list_lock. On a cpu that
> is
> receiving lots of fcoe traffic, the softirq context has to add and release the
> lock for every frame it receives, as does the receiving per-cpu thread. We
> can
> reduce this contention somewhat by altering the per-cpu threads loop such that
> when traffic is detected on the fcoe_rx_list, we splice it to a temporary
> list.
> In this way, we can process multiple skbs while only having to acquire and
> release the fcoe_rx_list lock once.
>
> Signed-off-by: Neil Horman <[email protected]>
> CC: Robert Love <[email protected]>
> CC: Vasu Dev <[email protected]>
> CC: "James E.J. Bottomley" <[email protected]>
> ---
> drivers/scsi/fcoe/fcoe.c | 24 ++++++++++++++++--------
> 1 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index dc5597b..45e43d8 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -1463,7 +1463,7 @@ static int fcoe_rcv(struct sk_buff *skb, struct
> net_device *netdev,
> * in softirq context.
> */
> __skb_queue_tail(&fps->fcoe_rx_list, skb);
> - if (fps->fcoe_rx_list.qlen == 1)
> + if (fps->thread->state == TASK_INTERRUPTIBLE)
> wake_up_process(fps->thread);
> spin_unlock(&fps->fcoe_rx_list.lock);
>
> @@ -1782,23 +1782,31 @@ static int fcoe_percpu_receive_thread(void *arg)
> {
> struct fcoe_percpu_s *p = arg;
> struct sk_buff *skb;
> + struct sk_buff_head tmp;
> +
> + skb_queue_head_init(&tmp);
>
> set_user_nice(current, -20);
>
> +get_more_skbs:
This label is not used and would throw compiler warning, rest all looks
good.
Vasu
> while (!kthread_should_stop()) {
>
> spin_lock_bh(&p->fcoe_rx_list.lock);
> - while ((skb = __skb_dequeue(&p->fcoe_rx_list)) == NULL) {
> + 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)) {
> set_current_state(TASK_INTERRUPTIBLE);
> spin_unlock_bh(&p->fcoe_rx_list.lock);
> schedule();
> set_current_state(TASK_RUNNING);
> - if (kthread_should_stop())
> - return 0;
> - spin_lock_bh(&p->fcoe_rx_list.lock);
> - }
> - spin_unlock_bh(&p->fcoe_rx_list.lock);
> - fcoe_recv_frame(skb);
> + } else
> + spin_unlock_bh(&p->fcoe_rx_list.lock);
> }
> return 0;
> }
_______________________________________________
devel mailing list
[email protected]
https://lists.open-fcoe.org/mailman/listinfo/devel