So I did some further investigation on the weird optimal i/o size I
got from my usb3/sata adapter/ssd, started by grep'ing the size in the
/sys/block/sdx/queue:

[tom@localhost ~]$ grep 33553920 /sys/block/sdb/queue/*
grep: /sys/block/sdb/queue/iosched: Is a directory
/sys/block/sdb/queue/optimal_io_size:33553920
/sys/block/sdb/queue/write_same_max_bytes:33553920

Because of this, for once I thought that "optimal_io_size" is somehow
set to match with "write_same_max_bytes", but later I proved that I
was wrong, and it is just sort of a coincidence.

However, I found out that the "33553920" of "write_same_max_bytes" is
actually originated from a "max_write_same_blocks":

[tom@localhost ~]$ grep 65535 `find /sys/devices -name max_write_same_blocks`
/sys/devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/max_write_same_blocks:65535

which is set by:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5db44863b6ebbb400c5e61d56ebe8f21ef48b1bd

but not my hardware:

[tom@localhost ~]$ sudo sg_inq -p 0xb0 /dev/sdb | grep same
  Maximum write same length: 0x0 blocks
[tom@localhost ~]$ sudo sg_write_same --10 --num=1 /dev/sdb
Write same(10): Illegal request, invalid opcode

While it is disabled through the variable "no_write_same" for
usb-storage (similarly for ATA and FireWire), for some reason, the uas
driver neither uses (everything of) "scsiglue" nor set the variable
itself.

After setting the variable in uas.c, I found that the "optimal i/o
size" is still "33553920". So I keep digging. It's actually supplied
by the hardware through something called "VPD":

http://people.redhat.com/msnitzer/docs/io-limits.txt

But when I use `sg_inq` to look into different drives, I see that one
of them supplied an (enormous) "OPTIMAL TRANSFER LENGTH" but it's not
used to derive the "optimal_io_size" for it:

[tom@localhost ~]$ sudo sg_inq -p 0xb0 /dev/sdc | grep "Optimal
transfer length:"
  Optimal transfer length: 8388607 blocks
[tom@localhost ~]$ cat /sys/block/sdc/queue/optimal_io_size
0

So I suspect something is "missing" in the uas driver again, and I am
right, which is:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=09b6b51b0b6c1b9bb61815baf205e4d74c89ff04

the "skip_vpd_pages" variable makes sd_try_extended_inquiry() in
drivers/scsi/sd.c return 0 for the test in sd_revalidate_disk(), which
prevent sd_read_block_limits() and hence blk_queue_io_opt() from
running.

So finally I solve all the mystery I got and I would like to share a
bit here. I hope it is alright.

Also, should "no_write_same" and "skip_vpd_pages" actually be set for
uas devices as well?
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to