On 8/26/18 9:52 PM, jianchao.wang wrote: > Hi Jens > > On 08/25/2018 11:41 PM, Jens Axboe wrote: >> do { >> - set_current_state(TASK_UNINTERRUPTIBLE); >> + if (test_bit(0, &data.flags)) >> + break; >> >> - if (!has_sleeper && rq_wait_inc_below(rqw, get_limit(rwb, rw))) >> + WARN_ON_ONCE(list_empty(&data.wq.entry)); >> + >> + if (!has_sleeper && >> + rq_wait_inc_below(rqw, get_limit(rwb, rw))) { >> + finish_wait(&rqw->wait, &data.wq); >> + >> + /* >> + * We raced with wbt_wake_function() getting a token, >> + * which means we now have two. Put ours and wake >> + * anyone else potentially waiting for one. >> + */ >> + if (test_bit(0, &data.flags)) >> + wbt_rqw_done(rwb, rqw, wb_acct); >> break; > > Just use 'bool' variable should be OK > After finish_wait, no one could race with us here. I was mostly concerned with the check post prep_to_wait(), but since the spin unlock should include a barrier, the bool should actually be enough. I'll change that back once I test. -- Jens Axboe