On Thu, 2012-06-21 at 15:19 -0400, Neil Horman wrote:
> On Thu, Jun 21, 2012 at 10:13:17AM -0700, Vasu Dev wrote:
> > On Wed, 2012-06-20 at 08:48 -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.
> > > 
> > > Signed-off-by: Neil Horman <nhor...@tuxdriver.com>
> > > CC: Robert Love <robert.w.l...@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..082951f 100644
> > > --- a/drivers/scsi/fcoe/fcoe.c
> > > +++ b/drivers/scsi/fcoe/fcoe.c
> > > @@ -1820,19 +1820,21 @@ static int fcoe_percpu_receive_thread(void *arg)
> > >  
> > >           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)) {
> > > +         while (!skb_queue_len(&tmp) && !kthread_should_stop()) {
> > 
> > If skb_queue_len check is done on locked fcoe_rx_list then
> > skb_queue_splice_init() can be moved outside loop below with its only
> > one instance calling instead having twice. Just very minor pick along
> > this cleanup and anyway it should get called once on each thread wakeup
> > with you patch.
> > 
> Good call, you're right.  Although it gets a little tricky because you need to
> hold the list lock to prevent a race with the softirq waking you up right 
> before
> you go to sleep.

Yes, check and thread state change is needed under the lock for that
reason.

>   I can replace the additional lock/splice_init with a goto
> however, just to make it a bit mroe consice.  That also lets me eliminate the
> second kthread_should_stop check. 

Even more better with one less check, thanks Neil.

  Vasu

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

Reply via email to