Re: [PATCHSET v4] blk-mq-scheduling framework

From: Jens Axboe
Date: Wed Jan 25 2017 - 11:13:53 EST

On 01/25/2017 01:46 AM, Paolo Valente wrote:
>> Il giorno 23 gen 2017, alle ore 18:42, Jens Axboe <axboe@xxxxxx> ha scritto:
>> On 01/23/2017 10:04 AM, Paolo Valente wrote:
>>>> Il giorno 18 gen 2017, alle ore 17:21, Jens Axboe <axboe@xxxxxx> ha scritto:
>>>> On 01/18/2017 08:14 AM, Paolo Valente wrote:
>>>>> according to the function blk_mq_sched_put_request, the
>>>>> mq.completed_request hook seems to always be invoked (if set) for a
>>>>> request for which the mq.put_rq_priv is invoked (if set).
>>>> Correct, any request that came out of blk_mq_sched_get_request()
>>>> will always have completed called on it, regardless of whether it
>>>> had IO started on it or not.
>>> It seems that some request, after being dispatched, happens to have no
>>> mq.put_rq_priv invoked on it now or then. Is it expected? If it is,
>>> could you point me to the path through which the end of the life of
>>> such a request is handled?
>> I'm guessing that's a flush request. I added RQF_QUEUED to check for
>> that, if RQF_QUEUED is set, you know it has come from your get_request
>> handler.
> Exactly, the completion-without-put_rq_priv pattern seems to occur
> only for requests coming from the flusher, precisely because they have
> the flag RQF_ELVPRIV unset. Just to understand: why is this flag
> unset for these requests, if they do have private elevator (bfq)
> data attached? What am I misunderstanding?
> Just to be certain: this should be the only case where the
> completed_request hook is invoked while the put_rq_priv is not, right?

They must NOT have scheduler data attached. In your get_request
function, you must bypass if blk_mq_sched_bypass_insert() returns true.
See how mq-deadline does that. This is important, or you will get hangs
with flushes as well, since the IO scheduler private data and the flush
data is unionized in the request.

Jens Axboe