Skip to content

Commit d3c04a6

Browse files
calebsanderkeithbusch
authored andcommitted
nvme: update nvme_id_ns OPTPERF constants
In NVMe verson 2.0 and below, OPTPERF comprises only bit 4 of NSFEAT in the Identify Namespace structure. Since version 2.1, OPTPERF includes both bits 4 and 5 of NSFEAT. Replace the NVME_NS_FEAT_IO_OPT constant with NVME_NS_FEAT_OPTPERF_SHIFT, NVME_NS_FEAT_OPTPERF_MASK, and NVME_NS_FEAT_OPTPERF_MASK_2_1, representing the first bit, pre-2.1 bit width, and post-2.1 bit width of OPTPERF. Update nvme_update_disk_info() to check both OPTPERF bits for controllers that report version 2.1 or newer, as NPWG and NOWS are supported even if only bit 5 is set. Signed-off-by: Caleb Sander Mateos <csander@purestorage.com> Signed-off-by: Keith Busch <kbusch@kernel.org>
1 parent 9110b85 commit d3c04a6

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

drivers/nvme/host/core.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2066,6 +2066,7 @@ static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id,
20662066
u32 bs = 1U << head->lba_shift;
20672067
u32 atomic_bs, phys_bs, io_opt = 0;
20682068
bool valid = true;
2069+
u8 optperf;
20692070

20702071
/*
20712072
* The block layer can't support LBA sizes larger than the page size
@@ -2080,7 +2081,12 @@ static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id,
20802081
phys_bs = bs;
20812082
atomic_bs = nvme_configure_atomic_write(ns, id, lim, bs);
20822083

2083-
if (id->nsfeat & NVME_NS_FEAT_IO_OPT) {
2084+
optperf = id->nsfeat >> NVME_NS_FEAT_OPTPERF_SHIFT;
2085+
if (ctrl->vs >= NVME_VS(2, 1, 0))
2086+
optperf &= NVME_NS_FEAT_OPTPERF_MASK_2_1;
2087+
else
2088+
optperf &= NVME_NS_FEAT_OPTPERF_MASK;
2089+
if (optperf) {
20842090
/* NPWG = Namespace Preferred Write Granularity */
20852091
phys_bs = bs * (1 + le16_to_cpu(id->npwg));
20862092
/* NOWS = Namespace Optimal Write Size */

include/linux/nvme.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,11 @@ enum {
597597
enum {
598598
NVME_NS_FEAT_THIN = 1 << 0,
599599
NVME_NS_FEAT_ATOMICS = 1 << 1,
600-
NVME_NS_FEAT_IO_OPT = 1 << 4,
600+
NVME_NS_FEAT_OPTPERF_SHIFT = 4,
601+
/* In NVMe version 2.0 and below, OPTPERF is only bit 4 of NSFEAT */
602+
NVME_NS_FEAT_OPTPERF_MASK = 0x1,
603+
/* Since version 2.1, OPTPERF is bits 4 and 5 of NSFEAT */
604+
NVME_NS_FEAT_OPTPERF_MASK_2_1 = 0x3,
601605
NVME_NS_ATTR_RO = 1 << 0,
602606
NVME_NS_FLBAS_LBA_MASK = 0xf,
603607
NVME_NS_FLBAS_LBA_UMASK = 0x60,

0 commit comments

Comments
 (0)