Hi ming

On 09/12/2017 06:23 PM, Ming Lei wrote:
>> @@ -1029,14 +1029,20 @@ bool blk_mq_dispatch_rq_list(struct request_queue 
>> *q, struct list_head *list)
>>              if (list_empty(list))
>>                      bd.last = true;
>>              else {
>> -                    struct request *nxt;
>> -
>>                      nxt = list_first_entry(list, struct request, queuelist);
>>                      bd.last = !blk_mq_get_driver_tag(nxt, NULL, false);
>>              }
>>  
>>              ret = q->mq_ops->queue_rq(hctx, &bd);
>>              if (ret == BLK_STS_RESOURCE) {
>> +                    /*
>> +                     * If an I/O scheduler has been configured and we got a
>> +                     * driver tag for the next request already, free it 
>> again.
>> +                     */
>> +                    if (!list_empty(list)) {
>> +                            nxt = list_first_entry(list, struct request, 
>> queuelist);
>> +                            blk_mq_put_driver_tag(nxt);
>> +                    }
> The following way might be more simple and clean:
> 
>                       if (nxt)
>                               blk_mq_put_driver_tag(nxt);
> 
> meantime 'nxt' need to be cleared inside the 'if (list_empty(list))'
> before .queue_rq().

I had ever thought about that, but to avoid add extra command in the 
fast path, I made the patch above.

Thanks
Jianchao

Reply via email to