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.

nvmet: report NPDGL and NPDAL

A block device with a very large discard_granularity queue limit may not
be able to report it in the 16-bit NPDG and NPDA fields in the Identify
Namespace data structure. For this reason, version 2.1 of the NVMe specs
added 32-bit fields NPDGL and NPDAL to the NVM Command Set Specific
Identify Namespace structure. So report the discard_granularity there
too and set OPTPERF to 11b to indicate those fields are supported.

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>

authored by

Caleb Sander Mateos and committed by
Keith Busch
c4cfe8c3 e0d56e70

+19 -4
+2
drivers/nvme/target/admin-cmd.c
··· 1057 1057 status = NVME_SC_INTERNAL; 1058 1058 goto out; 1059 1059 } 1060 + if (req->ns->bdev) 1061 + nvmet_bdev_set_nvm_limits(req->ns->bdev, id); 1060 1062 status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id)); 1061 1063 kfree(id); 1062 1064 out:
+15 -4
drivers/nvme/target/io-cmd-bdev.c
··· 30 30 id->nacwu = lpp0b; 31 31 32 32 /* 33 - * OPTPERF = 01b indicates that the fields NPWG, NPWA, NPDG, NPDA, and 34 - * NOWS are defined for this namespace and should be used by 35 - * the host for I/O optimization. 33 + * OPTPERF = 11b indicates that the fields NPWG, NPWA, NPDG, NPDA, 34 + * NPDGL, NPDAL, and NOWS are defined for this namespace and should be 35 + * used by the host for I/O optimization. 36 36 */ 37 - id->nsfeat |= 0x1 << NVME_NS_FEAT_OPTPERF_SHIFT; 37 + id->nsfeat |= 0x3 << NVME_NS_FEAT_OPTPERF_SHIFT; 38 38 /* NPWG = Namespace Preferred Write Granularity. 0's based */ 39 39 id->npwg = to0based(bdev_io_min(bdev) / bdev_logical_block_size(bdev)); 40 40 /* NPWA = Namespace Preferred Write Alignment. 0's based */ ··· 50 50 /* Set WZDS and DRB if device supports unmapped write zeroes */ 51 51 if (bdev_write_zeroes_unmap_sectors(bdev)) 52 52 id->dlfeat = (1 << 3) | 0x1; 53 + } 54 + 55 + void nvmet_bdev_set_nvm_limits(struct block_device *bdev, 56 + struct nvme_id_ns_nvm *id) 57 + { 58 + /* 59 + * NPDGL = Namespace Preferred Deallocate Granularity Large 60 + * NPDAL = Namespace Preferred Deallocate Alignment Large 61 + */ 62 + id->npdgl = id->npdal = cpu_to_le32(bdev_discard_granularity(bdev) / 63 + bdev_logical_block_size(bdev)); 53 64 } 54 65 55 66 void nvmet_bdev_ns_disable(struct nvmet_ns *ns)
+2
drivers/nvme/target/nvmet.h
··· 549 549 u16 nvmet_parse_connect_cmd(struct nvmet_req *req); 550 550 u32 nvmet_connect_cmd_data_len(struct nvmet_req *req); 551 551 void nvmet_bdev_set_limits(struct block_device *bdev, struct nvme_id_ns *id); 552 + void nvmet_bdev_set_nvm_limits(struct block_device *bdev, 553 + struct nvme_id_ns_nvm *id); 552 554 u16 nvmet_bdev_parse_io_cmd(struct nvmet_req *req); 553 555 u16 nvmet_file_parse_io_cmd(struct nvmet_req *req); 554 556 u16 nvmet_bdev_zns_parse_io_cmd(struct nvmet_req *req);