Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Caleb Sander Mateos and committed by
Keith Busch
d3c04a6e 9110b852

+12 -2
+7 -1
drivers/nvme/host/core.c
··· 2066 2066 u32 bs = 1U << head->lba_shift; 2067 2067 u32 atomic_bs, phys_bs, io_opt = 0; 2068 2068 bool valid = true; 2069 + u8 optperf; 2069 2070 2070 2071 /* 2071 2072 * The block layer can't support LBA sizes larger than the page size ··· 2081 2080 phys_bs = bs; 2082 2081 atomic_bs = nvme_configure_atomic_write(ns, id, lim, bs); 2083 2082 2084 - if (id->nsfeat & NVME_NS_FEAT_IO_OPT) { 2083 + optperf = id->nsfeat >> NVME_NS_FEAT_OPTPERF_SHIFT; 2084 + if (ctrl->vs >= NVME_VS(2, 1, 0)) 2085 + optperf &= NVME_NS_FEAT_OPTPERF_MASK_2_1; 2086 + else 2087 + optperf &= NVME_NS_FEAT_OPTPERF_MASK; 2088 + if (optperf) { 2085 2089 /* NPWG = Namespace Preferred Write Granularity */ 2086 2090 phys_bs = bs * (1 + le16_to_cpu(id->npwg)); 2087 2091 /* NOWS = Namespace Optimal Write Size */
+5 -1
include/linux/nvme.h
··· 597 597 enum { 598 598 NVME_NS_FEAT_THIN = 1 << 0, 599 599 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, 601 605 NVME_NS_ATTR_RO = 1 << 0, 602 606 NVME_NS_FLBAS_LBA_MASK = 0xf, 603 607 NVME_NS_FLBAS_LBA_UMASK = 0x60,