NVMe: Set block queue max sectors
Subsystems (2)
PATCH 1/1 NVMe: Set block queue max sectors
Set the max hw sectors in a namespace's request queue if the nvme device has a max data transfer size.
--- drivers/block/nvme.c | 6 ++++++ include/linux/nvme.h | 1 + 2 files changed, 7 insertions(+), 0 deletions(-)
drivers/block/nvme.c +6 -0
@@ -78,6 +78,7 @@ struct nvme_dev {char serial[20 ];char model[40 ];char firmware_rev[8 ]; +u32 max_hw_sectors; };/*
@@ -1345,6 +1346,8 @@ static struct nvme_ns *nvme_alloc_ns(struct nvme_dev *dev, int nsid, lbaf = id->flbas &0xf ; ns->lba_shift = id->lbaf[lbaf].ds;blk_queue_logical_block_size (ns->queue,1 << ns->lba_shift); +if (dev->max_hw_sectors) +blk_queue_max_hw_sectors (ns->queue, dev->max_hw_sectors); disk->major = nvme_major; disk->minors =NVME_MINORS ;
@@ -1486,6 +1489,9 @@ static int __devinit nvme_dev_add(struct nvme_dev *dev)memcpy (dev->serial, ctrl->sn,sizeof (ctrl->sn));memcpy (dev->model, ctrl->mn,sizeof (ctrl->mn));memcpy (dev->firmware_rev, ctrl->fr,sizeof (ctrl->fr)); +if (ctrl->mdts) + dev->max_hw_sectors = ((1 << ctrl->mdts) * (1 << (12 + +NVME_CAP_MPSMIN (readq (&dev->bar->cap))))) >>9 ; id_ns = mem;for (i =1 ; i <= nn; i++) {
include/linux/nvme.h +1 -0
@@ -37,6 +37,7 @@ struct nvme_bar {#define NVME_CAP_TIMEOUT (cap) (((cap) >> 24) & 0xff)#define NVME_CAP_STRIDE (cap) (((cap) >> 32) & 0xf) +#define NVME_CAP_MPSMIN (cap) (((cap) >> 48) & 0xf)enum {NVME_CC_ENABLE =1 <<0 ,
Signature · 1 line
1.7.0.4
PATCH 1/1 NVMe: Set block queue max sectors
Quoted 2 lines · Keith Busch
Set the max hw sectors in a namespace's request queue if the nvme device has a max data transfer size.
Could I trouble you to reflow your comments in the future? When one types 'git log', it inserts four spaces before the message, so this would look like:
Set the max hw sectors in a namespace's request queue if the nvme device has a max data transfer size.
I find that typing !{fmt in vi does the right thing (it defaults to 75 columns), but I don't know which editor you use.
drivers/block/nvme.c static int __devinit nvme_dev_add(struct nvme_dev *dev) · line 1494
Quoted 5 lines
drivers/block/nvme.c +3
-0memcpy (dev->firmware_rev, ctrl->fr,sizeof (ctrl->fr)); +if (ctrl->mdts) + dev->max_hw_sectors = ((1 << ctrl->mdts) * (1 << (12 + +NVME_CAP_MPSMIN (readq (&dev->bar->cap))))) >>9 ;
There's something about seeing five close-parens in a row that makes me uncomfortable. Maybe I was molested by a lisp compiler as a child or something, but it tends to indicate an overly complex expression.
Let's see, what might look better ...
if (ctrl->mdts) {
int mpsmin = 1 << (NVME_CAP_MPSMIN(readq(&dev->bar->cap)) + 12);
dev->max_hw_sectors = ((1 << ctrl->mdts) * mpsmin) >> 9;
}Alternatively, we could redistribute some of the arithmetic ...
if (ctrl->mdts) dev->max_hw_sectors = 1 << (12 - 9 + ctrl->mdts + NVME_CAP_MPSMIN(readq(&dev->bar->cap)));
but that's a little obscure. Perhaps a little less obscure:
if (ctrl->mdts) {
int shift = NVME_CAP_MPSMIN(readq(&dev->bar->cap)) + 12;
dev->max_hw_sectors = 1 << (ctrl->mdts + shift - 9);
}