On 6/3/19 9:37 AM, Ming Lei wrote:
> On Mon, Jun 03, 2019 at 08:08:18AM +0200, Hannes Reinecke wrote:
>> On 6/1/19 1:06 AM, Ming Lei wrote:
>>> On Fri, May 31, 2019 at 12:26:56PM +0200, Hannes Reinecke wrote:
>>>> On 5/31/19 10:46 AM, Ming Lei wrote:
>> [ .. ]
>>>> First we check for the 'slot_index_alloc()' callback to handle weird v2
>>>> allocation rules, _then_ we look for a tag, and only if we do _not_ have
>>>> a tag we're using the bitmap.
>>>
>>> OK, looks I miss the above change.
>>>
>>>> And the bitmap is already correctly sized, as otherwise we'd have a
>>>> clash between internal and tagged I/O commands even now.
>>>
>>> But now the big problem is in the following two line code:
>>>
>>> +       else if (blk_tag != (u32)-1)
>>> +               rc = blk_mq_unique_tag_to_tag(blk_tag);
>>>
>>> Request from different blk-mq hw queue has same tag returned from
>>> blk_mq_unique_tag_to_tag().
>>>
>> Yes, but the sbitmap allocator will ensure that each command will get a
>> unique tag.
> 
> Each hw queue has independent sbitmap allocator, so commands with same
> tag can come from different hw queue.
> 
It does not for SCSI.
See below.

> So you meant this RFC patch depends on the host-wide tags patchset I
> posted?
> 
>>
>>> Now the biggest question is that if V3 hw supports per-queue tags,
>>> If yes, it should be real MQ hardware, otherwise I guess commands with
>>> same tag at the same time may not work for host-wide tags.
>>>
>>
>> Of course you can't have different commands with the same tag. But the
>> sbitmap allocator prevents this from happening, as for host-wide tags
>> the tagset is _shared_ between all devices, so the sbitmap allocator
>> will only ever run on _one_ tagset for all commands.
> 
> But blk-mq doesn't support host-wide tags yet, so how can this single
> patch work?
> 
Wrong. It does:

struct request_queue *scsi_mq_alloc_queue(struct scsi_device *sdev)
{
        sdev->request_queue = blk_mq_init_queue(&sdev->host->tag_set);
        if (IS_ERR(sdev->request_queue))
                return NULL;

        sdev->request_queue->queuedata = sdev;
        __scsi_init_queue(sdev->host, sdev->request_queue);
        blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, sdev->request_queue);
        return sdev->request_queue;
}


IE every scsi device is using the tagset from the host.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Teamlead Storage & Networking
h...@suse.de                                   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)

Reply via email to