On Tue, 2018-05-22 at 14:33 -0600, Keith Busch wrote:
> On Tue, May 22, 2018 at 09:25:15AM -0700, Bart Van Assche wrote:
> > @@ -848,13 +843,22 @@ static void blk_mq_rq_timed_out(struct request *req, 
> > bool reserved)
> >     case BLK_EH_RESET_TIMER:
> > +           blk_mq_add_timer(req);
> >             /*
> > +            * The loop is for the unlikely case of a race with the
> > +            * completion code. There is no need to reset the deadline
> > +            * if the transition to the in-flight state fails because
> > +            * the deadline only matters in the in-flight state.
> >              */
> > -           blk_mq_rq_update_aborted_gstate(req, 0);
> > -           blk_add_timer(req);
> > +           while (true) {
> > +                   if (blk_mq_change_rq_state(req, MQ_RQ_TIMED_OUT,
> > +                                              MQ_RQ_IN_FLIGHT))
> > +                           break;
> > +                   if (blk_mq_rq_state(req) == MQ_RQ_COMPLETE) {
> > +                           __blk_mq_complete_request(req);
> > +                           break;
> > +                   }
> > +           }
> 
> I'm having some trouble triggering this case where the state is already
> MQ_RQ_COMPLETE, so I'm just trying to figure this out through inspection.
> 
> It looks like the new blk_mq_complete_request() already called
> __blk_mq_complete_request() when it gets the state to MQ_RQ_COMPLETE,
> so doing that again completes it a second time.

Hello Keith,

Have you noticed that if blk_mq_complete_request() encounters a request with
state MQ_RQ_TIMED_OUT that it doesn't call __blk_mq_complete_request()? I think
the code in blk_mq_complete_request() together with the above code guarantees
that __blk_mq_complete_request() is only called once per request generation.

Bart.



Reply via email to