From: Kanchan Joshi <[email protected]>
To: [email protected], [email protected], [email protected],
[email protected]
Cc: [email protected], [email protected],
[email protected], [email protected],
[email protected], [email protected],
Kanchan Joshi <[email protected]>
Subject: [RFC PATCH v3 2/3] nvme: keep nvme_command instead of pointer to it
Date: Tue, 16 Mar 2021 19:31:25 +0530 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
nvme_req structure originally contained a pointer to nvme_command.
Change nvme_req structure to keep the command itself.
This helps in avoiding hot-path memory-allocation for async-passthrough.
Signed-off-by: Anuj Gupta <[email protected]>
Signed-off-by: Kanchan Joshi <[email protected]>
---
drivers/nvme/host/core.c | 6 +++---
drivers/nvme/host/fabrics.c | 4 ++--
drivers/nvme/host/lightnvm.c | 16 +++++-----------
drivers/nvme/host/nvme.h | 2 +-
4 files changed, 11 insertions(+), 17 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index e68a8c4ac5a6..46c1bb7a89f0 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -596,7 +596,7 @@ static inline void nvme_init_request(struct request *req,
req->cmd_flags |= REQ_FAILFAST_DRIVER;
nvme_clear_nvme_request(req);
- nvme_req(req)->cmd = cmd;
+ nvme_req(req)->cmd = *cmd;
}
struct request *nvme_alloc_request(struct request_queue *q,
@@ -728,7 +728,7 @@ static void nvme_assign_write_stream(struct nvme_ctrl *ctrl,
static void nvme_setup_passthrough(struct request *req,
struct nvme_command *cmd)
{
- memcpy(cmd, nvme_req(req)->cmd, sizeof(*cmd));
+ memcpy(cmd, &nvme_req(req)->cmd, sizeof(*cmd));
/* passthru commands should let the driver set the SGL flags */
cmd->common.flags &= ~NVME_CMD_SGL_ALL;
}
@@ -1128,7 +1128,7 @@ static void nvme_passthru_end(struct nvme_ctrl *ctrl, u32 effects)
void nvme_execute_passthru_rq(struct request *rq)
{
- struct nvme_command *cmd = nvme_req(rq)->cmd;
+ struct nvme_command *cmd = &nvme_req(rq)->cmd;
struct nvme_ctrl *ctrl = nvme_req(rq)->ctrl;
struct nvme_ns *ns = rq->q->queuedata;
struct gendisk *disk = ns ? ns->disk : NULL;
diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
index 5dfd806fc2d2..c374dcf6595e 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -578,8 +578,8 @@ bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
*/
switch (ctrl->state) {
case NVME_CTRL_CONNECTING:
- if (blk_rq_is_passthrough(rq) && nvme_is_fabrics(req->cmd) &&
- req->cmd->fabrics.fctype == nvme_fabrics_type_connect)
+ if (blk_rq_is_passthrough(rq) && nvme_is_fabrics(&req->cmd) &&
+ req->cmd.fabrics.fctype == nvme_fabrics_type_connect)
return true;
break;
default:
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index b705988629f2..5f4d7f0f5d8d 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -640,7 +640,6 @@ static void nvme_nvm_end_io(struct request *rq, blk_status_t status)
rqd->error = nvme_req(rq)->status;
nvm_end_io(rqd);
- kfree(nvme_req(rq)->cmd);
blk_mq_free_request(rq);
}
@@ -672,25 +671,21 @@ static int nvme_nvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd,
{
struct nvm_geo *geo = &dev->geo;
struct request_queue *q = dev->q;
- struct nvme_nvm_command *cmd;
+ struct nvme_nvm_command cmd;
struct request *rq;
int ret;
- cmd = kzalloc(sizeof(struct nvme_nvm_command), GFP_KERNEL);
- if (!cmd)
- return -ENOMEM;
-
- rq = nvme_nvm_alloc_request(q, rqd, cmd);
+ rq = nvme_nvm_alloc_request(q, rqd, &cmd);
if (IS_ERR(rq)) {
ret = PTR_ERR(rq);
- goto err_free_cmd;
+ goto err_cmd;
}
if (buf) {
ret = blk_rq_map_kern(q, rq, buf, geo->csecs * rqd->nr_ppas,
GFP_KERNEL);
if (ret)
- goto err_free_cmd;
+ goto err_cmd;
}
rq->end_io_data = rqd;
@@ -699,8 +694,7 @@ static int nvme_nvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd,
return 0;
-err_free_cmd:
- kfree(cmd);
+err_cmd:
return ret;
}
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 07b34175c6ce..0254aa611dfa 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -157,7 +157,7 @@ enum nvme_quirks {
* this structure as the first member of their request-private data.
*/
struct nvme_request {
- struct nvme_command *cmd;
+ struct nvme_command cmd;
union nvme_result result;
u8 retries;
u8 flags;
--
2.25.1
next prev parent reply other threads:[~2021-03-16 14:03 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20210316140229epcas5p23d68a4c9694bbf7759b5901115a4309b@epcas5p2.samsung.com>
2021-03-16 14:01 ` [RFC PATCH v3 0/3] Async nvme passthrough over io_uring Kanchan Joshi
[not found] ` <CGME20210316140233epcas5p372405e7cb302c61dba5e1094fa796513@epcas5p3.samsung.com>
2021-03-16 14:01 ` [RFC PATCH v3 1/3] io_uring: add helper for uring_cmd completion in submitter-task Kanchan Joshi
2021-03-16 15:43 ` Stefan Metzmacher
2021-03-18 1:57 ` Jens Axboe
2021-03-18 5:25 ` Kanchan Joshi
2021-03-18 5:48 ` Christoph Hellwig
2021-03-18 6:14 ` Kanchan Joshi
[not found] ` <CGME20210316140236epcas5p4de087ee51a862402146fbbc621d4d4c6@epcas5p4.samsung.com>
2021-03-16 14:01 ` Kanchan Joshi [this message]
2021-03-16 17:16 ` [RFC PATCH v3 2/3] nvme: keep nvme_command instead of pointer to it Keith Busch
2021-03-17 9:38 ` Kanchan Joshi
2021-03-17 14:17 ` Keith Busch
[not found] ` <CGME20210316140240epcas5p3e71bfe2afecd728c5af60056f21cc9b7@epcas5p3.samsung.com>
2021-03-16 14:01 ` [RFC PATCH v3 3/3] nvme: wire up support for async passthrough Kanchan Joshi
2021-03-17 8:52 ` Christoph Hellwig
2021-03-17 16:49 ` Jens Axboe
2021-03-17 16:59 ` Christoph Hellwig
2021-03-17 17:21 ` Jens Axboe
2021-03-17 18:59 ` Jens Axboe
2021-03-18 5:54 ` Kanchan Joshi
2021-03-17 16:45 ` Keith Busch
2021-03-17 17:02 ` Christoph Hellwig
2021-03-16 15:51 ` [RFC PATCH v3 0/3] Async nvme passthrough over io_uring Jens Axboe
2021-03-17 9:31 ` Kanchan Joshi
2021-03-18 1:58 ` Jens Axboe
2021-03-18 7:47 ` Kanchan Joshi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox