On 12/15/2017 03:31 PM, Peter Zijlstra wrote:
> On Fri, Dec 15, 2017 at 10:12:50AM +0800, jianchao.wang wrote:
>>> That only makes it a little better:
>>>
>>>     Task-A                                  Worker
>>>
>>>     write_seqcount_begin()
>>>     blk_mq_rw_update_state(rq, IN_FLIGHT)
>>>     blk_add_timer(rq)
>>>     <timer>
>>>             schedule_work()
>>>     </timer>
>>>     <context-switch to worker>
>>>                                             read_seqcount_begin()
>>>                                                     while(seq & 1)
>>>                                                             cpu_relax();
>>>
>> Hi Peter
>>
>> The current seqcount read side is as below:
>>      do {
>>              start = read_seqcount_begin(&rq->gstate_seq);
> 
> 
> static inline unsigned read_seqcount_begin(const seqcount_t *s)
> {
>       seqcount_lockdep_reader_access(s);
>       return raw_read_seqcount_begin(s);
> }
> 
> static inline unsigned raw_read_seqcount_begin(const seqcount_t *s)
> {
>       unsigned ret = __read_seqcount_begin(s);
>       smp_rmb();
>       return ret;
> }
> 
> static inline unsigned __read_seqcount_begin(const seqcount_t *s)
> {
>       unsigned ret;
> 
> repeat:
>       ret = READ_ONCE(s->sequence);
>       if (unlikely(ret & 1)) {
>               cpu_relax();
>               goto repeat;
>       }
>       return ret;
> }
> 
Really thanks for kindly pointing out.
jianchao

Reply via email to