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 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)