* [PATCH] nvmet: avoid queuing keep-alive timer if it is disabled @ 2021-04-15 9:05 Hou Pu 2021-04-15 20:17 ` Chaitanya Kulkarni 0 siblings, 1 reply; 3+ messages in thread From: Hou Pu @ 2021-04-15 9:05 UTC (permalink / raw) To: sagi, hch, chaitanya.kulkarni; +Cc: linux-nvme, houpu.main Issue following command: nvme set-feature -f 0xf -v 0 /dev/nvme1n1 # disable keep-alive timer nvme admin-passthru -o 0x18 /dev/nvme1n1 # send keep-alive command will make keep-alive timer fired and thus delete the controller like bellowing: [247459.907635] nvmet: ctrl 1 keep-alive timer (0 seconds) expired! [247459.930294] nvmet: ctrl 1 fatal error occurred! Avoid this by not queuing delayed keep-alive if it is disabled when keep-alive command is received from the admin queue. Signed-off-by: Hou Pu <houpu.main@gmail.com> --- drivers/nvme/target/admin-cmd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index f4cc32674edd..b8a33d1506ba 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -926,8 +926,12 @@ void nvmet_execute_keep_alive(struct nvmet_req *req) pr_debug("ctrl %d update keep-alive timer for %d secs\n", ctrl->cntlid, ctrl->kato); - mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); - nvmet_req_complete(req, 0); + if (ctrl->kato) { + mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); + nvmet_req_complete(req, 0); + return; + } + nvmet_req_complete(req, NVME_SC_KA_TIMEOUT_INVALID); } u16 nvmet_parse_admin_cmd(struct nvmet_req *req) -- 2.28.0 _______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] nvmet: avoid queuing keep-alive timer if it is disabled 2021-04-15 9:05 [PATCH] nvmet: avoid queuing keep-alive timer if it is disabled Hou Pu @ 2021-04-15 20:17 ` Chaitanya Kulkarni 2021-04-16 2:48 ` Hou Pu 0 siblings, 1 reply; 3+ messages in thread From: Chaitanya Kulkarni @ 2021-04-15 20:17 UTC (permalink / raw) To: Hou Pu; +Cc: sagi, hch, linux-nvme Hou, On 4/15/21 02:07, Hou Pu wrote: > --- > drivers/nvme/target/admin-cmd.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c > index f4cc32674edd..b8a33d1506ba 100644 > --- a/drivers/nvme/target/admin-cmd.c > +++ b/drivers/nvme/target/admin-cmd.c > @@ -926,8 +926,12 @@ void nvmet_execute_keep_alive(struct nvmet_req *req) > pr_debug("ctrl %d update keep-alive timer for %d secs\n", > ctrl->cntlid, ctrl->kato); > > - mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); > - nvmet_req_complete(req, 0); > + if (ctrl->kato) { > + mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); > + nvmet_req_complete(req, 0); > + return; > + } > + nvmet_req_complete(req, NVME_SC_KA_TIMEOUT_INVALID); > } > > u16 nvmet_parse_admin_cmd(struct nvmet_req *req) > -- 2.28.0 I've validated that this behaviour does exists and this patch fixes that.Please add my :- Tested-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Also, please consider following on the top of this patch :- diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index a892cd246783..3422d35b25a1 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -1010,19 +1010,21 @@ void nvmet_execute_async_event(struct nvmet_req *req) void nvmet_execute_keep_alive(struct nvmet_req *req) { struct nvmet_ctrl *ctrl = req->sq->ctrl; + u16 status = 0; if (!nvmet_check_transfer_len(req, 0)) return; + if (!ctrl->kato) { + status = NVME_SC_KA_TIMEOUT_INVALID; + goto out; + } + pr_debug("ctrl %d update keep-alive timer for %d secs\n", ctrl->cntlid, ctrl->kato); - - if (ctrl->kato) { - mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); - nvmet_req_complete(req, 0); - return; - } - nvmet_req_complete(req, NVME_SC_KA_TIMEOUT_INVALID); + mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); +out: + nvmet_req_complete(req, status); } u16 nvmet_parse_admin_cmd(struct nvmet_req *req) _______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] nvmet: avoid queuing keep-alive timer if it is disabled 2021-04-15 20:17 ` Chaitanya Kulkarni @ 2021-04-16 2:48 ` Hou Pu 0 siblings, 0 replies; 3+ messages in thread From: Hou Pu @ 2021-04-16 2:48 UTC (permalink / raw) To: Chaitanya Kulkarni; +Cc: sagi, hch, linux-nvme On 2021/4/16 4:17 AM, Chaitanya Kulkarni wrote: > Hou, > > On 4/15/21 02:07, Hou Pu wrote: >> --- >> drivers/nvme/target/admin-cmd.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c >> index f4cc32674edd..b8a33d1506ba 100644 >> --- a/drivers/nvme/target/admin-cmd.c >> +++ b/drivers/nvme/target/admin-cmd.c >> @@ -926,8 +926,12 @@ void nvmet_execute_keep_alive(struct nvmet_req *req) >> pr_debug("ctrl %d update keep-alive timer for %d secs\n", >> ctrl->cntlid, ctrl->kato); >> >> - mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); >> - nvmet_req_complete(req, 0); >> + if (ctrl->kato) { >> + mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); >> + nvmet_req_complete(req, 0); >> + return; >> + } >> + nvmet_req_complete(req, NVME_SC_KA_TIMEOUT_INVALID); >> } >> >> u16 nvmet_parse_admin_cmd(struct nvmet_req *req) >> -- 2.28.0 > I've validated that this behaviour does exists and this patch > fixes that.Please add my :- > > Tested-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Thanks. > > Also, please consider following on the top of this patch :- Thanks. Changed in v2. > > diff --git a/drivers/nvme/target/admin-cmd.c > b/drivers/nvme/target/admin-cmd.c > index a892cd246783..3422d35b25a1 100644 > --- a/drivers/nvme/target/admin-cmd.c > +++ b/drivers/nvme/target/admin-cmd.c > @@ -1010,19 +1010,21 @@ void nvmet_execute_async_event(struct nvmet_req > *req) > void nvmet_execute_keep_alive(struct nvmet_req *req) > { > struct nvmet_ctrl *ctrl = req->sq->ctrl; > + u16 status = 0; > > if (!nvmet_check_transfer_len(req, 0)) > return; > > + if (!ctrl->kato) { > + status = NVME_SC_KA_TIMEOUT_INVALID; > + goto out; > + } > + > pr_debug("ctrl %d update keep-alive timer for %d secs\n", > ctrl->cntlid, ctrl->kato); > - > - if (ctrl->kato) { > - mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * > HZ); > - nvmet_req_complete(req, 0); > - return; > - } > - nvmet_req_complete(req, NVME_SC_KA_TIMEOUT_INVALID); > + mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); > +out: > + nvmet_req_complete(req, status); > } > > u16 nvmet_parse_admin_cmd(struct nvmet_req *req) > > Thanks, Hou _______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-04-16 2:49 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-04-15 9:05 [PATCH] nvmet: avoid queuing keep-alive timer if it is disabled Hou Pu 2021-04-15 20:17 ` Chaitanya Kulkarni 2021-04-16 2:48 ` Hou Pu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).