Skip to contentSkip to conversation

NVMe: Set queue max segments

PATCH New Keith Busch 3 participants 5 messages Aug 12, 2015 – Aug 17, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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.

Signed-off-by Keith Busch <keith.busch at intel.com>
---
 drivers/block/nvme-core.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/block/nvme-core.c +4 -1
index 613c1bc..abe93a5 100644
@@ -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
#1 lore raw

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?

#2 lore raw

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.

#3 lore raw

PATCH 1/1 NVMe: Set queue max segments

Ok, looks fine:

Reviewed-by Christoph Hellwig <hch at lst.de>
#4 lore raw

PATCH 1/1 NVMe: Set queue max segments

In reply to Keith Busch
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.

Applied for 4.3.

Signature · 1 line
Jens Axboe