]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
NVMe: Set queue max segments
authorKeith Busch <keith.busch@intel.com>
Wed, 12 Aug 2015 22:17:54 +0000 (16:17 -0600)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 6 Jul 2016 23:31:52 +0000 (16:31 -0700)
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@intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
(cherry picked from commit e824410ffcf4b245296b56c6fdf7b9797fce8c3e)

Orabug: 22620486
Signed-off-by: Jason Luo <zhangqing.luo@oracle.com>
drivers/block/nvme-core.c

index 2e3595ef22a85079289acc80dd1f8c3dfad59189..64c6784f84ab950dbc324d6c950f03428b63d26e 100644 (file)
@@ -2135,8 +2135,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)