Re: [PATCH 2/6] blk-mq: replace timeout synchronization with a RCU and generation based scheme
From: jianchao.wang <hidden>
Date: 2017-12-15 15:19:58
Also in:
lkml
From: jianchao.wang <hidden>
Date: 2017-12-15 15:19:58
Also in:
lkml
On 12/15/2017 03:31 PM, Peter Zijlstra wrote:
On Fri, Dec 15, 2017 at 10:12:50AM +0800, jianchao.wang wrote:quoted
quoted
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