Re: [PATCH 2/6] blk-mq: replace timeout synchronization with a RCU and generation based scheme
From: Peter Zijlstra <peterz@infradead.org>
Date: 2017-12-15 07:32:09
Also in:
lkml
From: Peter Zijlstra <peterz@infradead.org>
Date: 2017-12-15 07:32:09
Also in:
lkml
On Fri, Dec 15, 2017 at 10:12:50AM +0800, jianchao.wang wrote:
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;
}