mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-18 15:44:02 +08:00
[SCSI] fcoe: Cleanup locking on fcoe_percpu_receive_thread
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 <nhorman@tuxdriver.com> Acked-by: Vasu Dev <vasu.dev@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
902a45af5c
commit
95fdd5e980
@ -1851,23 +1851,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);
|
||||
|
||||
if (!skb_queue_len(&tmp)) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
spin_unlock_bh(&p->fcoe_rx_list.lock);
|
||||
schedule();
|
||||
set_current_state(TASK_RUNNING);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
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);
|
||||
} else
|
||||
spin_unlock_bh(&p->fcoe_rx_list.lock);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user