NVMe: Set queue max segments
Subsystems (2)
PATCH 1/1 NVMe: Set queue max segments
This sets the queue's max segment size to match the device's capabilities. The default of 128 is usable until a device's transfer capability exceeds 512k, assuming a device page size of 4k. Many nvme devices exceed that transfer limit, so this lets the block layer know what kind of commands it to allow to form rather than unnecessarily split them.
One additional segment is added to account for a transfer that may start in the middle of a page.
--- drivers/block/nvme-core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/block/nvme-core.c +4 -1
@@ -2098,8 +2098,11 @@ static void nvme_alloc_ns(struct nvme_dev *dev, unsigned nsid)list_add_tail (&ns->list, &dev->namespaces);blk_queue_logical_block_size (ns->queue,1 << ns->lba_shift); -if (dev->max_hw_sectors) +if (dev->max_hw_sectors) {blk_queue_max_hw_sectors (ns->queue, dev->max_hw_sectors); +blk_queue_max_segments (ns->queue, + ((dev->max_hw_sectors <<9 ) / dev->page_size) +1 ); + }if (dev->stripe_size)blk_queue_chunk_sectors (ns->queue, dev->stripe_size >>9 );if (dev->vwc &NVME_CTRL_VWC_PRESENT )
Signature · 1 line
1.7.10.4
PATCH 1/1 NVMe: Set queue max segments
Quoted 8 lines · Keith Busch
This sets the queue's max segment size to match the device's capabilities. The default of 128 is usable until a device's transfer capability exceeds 512k, assuming a device page size of 4k. Many nvme devices exceed that transfer limit, so this lets the block layer know what kind of commands it to allow to form rather than unnecessarily split them.
One additional segment is added to account for a transfer that may start in the middle of a page.
But it might not start in the middle of the page, too - in which case you're overcounting here, aren't you?
PATCH 1/1 NVMe: Set queue max segments
Quoted 7 lines · Christoph Hellwig
Quoted 6 lines · Keith Busch
This sets the queue's max segment size to match the device's capabilities. The default of 128 is usable until a device's transfer capability exceeds 512k, assuming a device page size of 4k. Many nvme devices exceed that transfer limit, so this lets the block layer know what kind of commands it to allow to form rather than unnecessarily split them.
Quoted 5 lines
Quoted 2 lines
One additional segment is added to account for a transfer that may start in the middle of a page.
But it might not start in the middle of the page, too - in which case you're overcounting here, aren't you?
queue_max_sectors() would exceed before the next segment is considered, similar to what happens with very large segments.
PATCH 1/1 NVMe: Set queue max segments
Ok, looks fine:
PATCH 1/1 NVMe: Set queue max segments
In reply to Keith BuschQuoted 8 lines · Keith Busch
This sets the queue's max segment size to match the device's capabilities. The default of 128 is usable until a device's transfer capability exceeds 512k, assuming a device page size of 4k. Many nvme devices exceed that transfer limit, so this lets the block layer know what kind of commands it to allow to form rather than unnecessarily split them.
One additional segment is added to account for a transfer that may start in the middle of a page.
Applied for 4.3.
Signature · 1 line
Jens Axboe