[PATCH 04/47] block: provide a new BLK_EH_QUIESCED timeout return value
Jeff Moyer
jmoyer at redhat.com
Tue Nov 24 08:34:22 PST 2015
Christoph Hellwig <hch at lst.de> writes:
> We always set REQ_ATOM_COMPLETE before calling into ->timeout and thus
> even having a chance to REQ_ATOM_QUIESCED. Maybe we're talking past
> each other, so if it feels like I'm off track try to explain the
> race in a bit more detail.
Sure.
CPU 0 executes the following:
blk_rq_check_expired():
if (!blk_mark_rq_complete(rq)) // this succeeds, so we call blk_rq_timed_out
blk_rq_timed_out(rq);
blk_rq_timed_out():
if (q->rq_timed_out_fn)
ret = q->rq_timed_out_fn(req);
switch (ret) { // QUIESCED is returned
...
case BLK_EH_QUIESCED:
set_bit(REQ_ATOM_QUIESCED, &req->atomic_flags);
break;
CPU 1 takes an interrupt for the completion of the same request:
blk_complete_request():
if (!blk_mark_rq_complete(req) || // this fails, as it's already marked complete
test_and_clear_bit(REQ_ATOM_QUIESCED, &req->atomic_flags)) // this succeeds
__blk_complete_request(req); // so we complete the request
Later, after the adapter reset is finished, you mentioned that all
requests will be completed. My question is: will this result in a
double completion for this particular request?
I hope that's more clear.
-Jeff
More information about the Linux-nvme
mailing list