On 6/3/19 11:31 AM, Ming Lei wrote: > On Mon, Jun 03, 2019 at 10:47:24AM +0200, Hannes Reinecke wrote: >> On 6/3/19 10:16 AM, Ming Lei wrote: >>> On Mon, Jun 03, 2019 at 09:46:39AM +0200, Hannes Reinecke wrote: >>>> 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. >>> >>> Looks we are not in the same page, and you misunderstood two concepts: >>> scsi's host-wide tagset, and the new host-tags of BLK_MQ_F_HOST_TAGS. >>> >>> I admit that the new flag of BLK_MQ_F_HOST_TAGS is misleading. >>> >>> Now let me clarify it a bit: >>> >>> 1) the current SCSI hostwide tags means all LUNs share the host tagset, >>> but the tagset may include multiple hw queues, and each hw queue still >>> has independent tags, that is why blk-mq provides blk_mq_unique_tag(). >>> In short, each LUN's hw queue has independent tags. >>> >> Which is where I fundamentally disagree. >> Each hw queue does _not_ have independent tags. >> Each hw queue will use tags from the same (host-wide) tagset; the tags >> themselves will be allocated for each queue on an ad-hoc base, ie there >> is no fixed mapping between tag values and hardware queues. > > Tagset is set of tags, and one tags is for serving one hw queue. > > Each hw queue has its own tags, please see __blk_mq_alloc_rq_map() > in which standalone sbitmap allocator and rq pool is allocated to > each hw queue represented by 'hctx_idx'. > Yes, but ... > And for each hw queue, the allocated tag value for request is in > the range of 0 ~ queue_depth - 1, that is why I say requests from > different hw queue may have same tag. > But this is not what I have been observing working with lpfc and qla2xxx. Both drivers have been converted to using scsi-mq with nr_hw_queues > 1 some years ago, and do work just fine. And none of those drivers allow for re-using an in-flight tag on different hardware queues. If your reasoning is correct none of these drivers would work. > Your RFC patch changes to allow requests with same tag submitted to driver > & hardware at the same time, so we should double-check if hisi_v3 hardware > is happy with this change. > > John, is hisi_sas v3 fine with this way? > As mentioned above, I don't think this can happen. Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@xxxxxxx +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)