|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
From c021d44d0d4915a2b152d29abde5f1d4cb7b8ddd Mon Sep 17 00:00:00 2001
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
From: Alexander Graf <graf@amazon.com>
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
Date: Wed, 30 Sep 2020 23:10:53 +0200
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
Subject: [PATCH] nvme: Record maximum allowed request size
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
NVMe has a limit on how many sectors it can handle at most within a single
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
request. Remember that number, so that in a follow-up patch, we can verify
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
that we don't exceed it.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
Signed-off-by: Alexander Graf <graf@amazon.com>
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
(cherry picked from commit b68f313c9139e480a9f5a0d1b5aa6f294b86d982)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
---
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
src/hw/nvme-int.h | 8 +++++++-
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
src/hw/nvme.c | 13 +++++++++++--
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
2 files changed, 18 insertions(+), 3 deletions(-)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
diff --git a/src/hw/nvme-int.h b/src/hw/nvme-int.h
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
index 9f95dd8..674008a 100644
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
--- a/src/hw/nvme-int.h
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+++ b/src/hw/nvme-int.h
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
@@ -117,6 +117,7 @@ struct nvme_namespace {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
u32 block_size;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
u32 metadata_size;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ u32 max_req_size;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
/* Page aligned buffer of size NVME_PAGE_SIZE. */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
char *dma_buffer;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
@@ -131,7 +132,12 @@ struct nvme_identify_ctrl {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
char mn[40];
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
char fr[8];
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
- char _boring[516 - 72];
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ u8 rab;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ u8 ieee[3];
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ u8 cmic;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ u8 mdts;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ char _boring[516 - 78];
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
u32 nn; /* number of namespaces */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
};
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
diff --git a/src/hw/nvme.c b/src/hw/nvme.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
index 6a01204..5bc2586 100644
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
--- a/src/hw/nvme.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+++ b/src/hw/nvme.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
@@ -238,7 +238,8 @@ nvme_admin_identify_ns(struct nvme_ctrl *ctrl, u32 ns_id)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
static void
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
-nvme_probe_ns(struct nvme_ctrl *ctrl, struct nvme_namespace *ns, u32 ns_id)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+nvme_probe_ns(struct nvme_ctrl *ctrl, struct nvme_namespace *ns, u32 ns_id,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ u8 mdts)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
{
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
ns->ctrl = ctrl;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
ns->ns_id = ns_id;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
@@ -281,6 +282,14 @@ nvme_probe_ns(struct nvme_ctrl *ctrl, struct nvme_namespace *ns, u32 ns_id)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
ns->drive.blksize = ns->block_size;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
ns->drive.sectors = ns->lba_count;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ if (mdts) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ ns->max_req_size = ((1U << mdts) * NVME_PAGE_SIZE) / ns->block_size;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ dprintf(3, "NVME NS %u max request size: %d sectors\n",
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ ns_id, ns->max_req_size);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ } else {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ ns->max_req_size = -1U;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
ns->dma_buffer = zalloc_page_aligned(&ZoneHigh, NVME_PAGE_SIZE);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
char *desc = znprintf(MAXDESCSIZE, "NVMe NS %u: %llu MiB (%llu %u-byte "
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
@@ -567,7 +576,7 @@ nvme_controller_enable(struct nvme_ctrl *ctrl)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
/* Populate namespace IDs */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
int ns_idx;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
for (ns_idx = 0; ns_idx < ctrl->ns_count; ns_idx++) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
- nvme_probe_ns(ctrl, &ctrl->ns[ns_idx], ns_idx + 1);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
+ nvme_probe_ns(ctrl, &ctrl->ns[ns_idx], ns_idx + 1, identify->mdts);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
b9d282 |
dprintf(3, "NVMe initialization complete!\n");
|