From: Bart Van Assche <bvanassche@acm.org>
To: Keith Busch <keith.busch@intel.com>,
linux-scsi@vger.kernel.org, linux-block@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Subject: Re: [PATCH 2/3] scsi: Do not rely on blk-mq for double completions
Date: Wed, 14 Nov 2018 09:51:36 -0800 [thread overview]
Message-ID: <1542217896.100259.2.camel@acm.org> (raw)
In-Reply-To: <20181114162601.11477-2-keith.busch@intel.com>
On Wed, 2018-11-14 at 09:26 -0700, Keith Busch wrote:
> The scsi timeout error handling had been directly updating the request
> state to prevent a natural completion and error handling from completing
> the same request twice. Fix this layering violation by having scsi
> control the fate of its commands with scsi owned flags rather than
> use blk-mq's.
>
> Signed-off-by: Keith Busch <keith.busch@intel.com>
> ---
> drivers/scsi/scsi_error.c | 17 +++--------------
> drivers/scsi/scsi_lib.c | 6 +++++-
> include/scsi/scsi_cmnd.h | 5 ++++-
> 3 files changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index c736d61b1648..f89e829a1c51 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -199,6 +199,9 @@ scsi_abort_command(struct scsi_cmnd *scmd)
> return FAILED;
> }
>
> + if (test_and_set_bit(__SCMD_COMPLETE, &scmd->flags))
> + return SUCCESS;
> +
> spin_lock_irqsave(shost->host_lock, flags);
> if (shost->eh_deadline != -1 && !shost->last_reset)
> shost->last_reset = jiffies;
> @@ -296,20 +299,6 @@ enum blk_eh_timer_return scsi_times_out(struct request
> *req)
> rtn = host->hostt->eh_timed_out(scmd);
>
> if (rtn == BLK_EH_DONE) {
> - /*
> - * For blk-mq, we must set the request state to complete
> now
> - * before sending the request to the scsi error handler.
> This
> - * will prevent a use-after-free in the event the LLD
> manages
> - * to complete the request before the error handler
> finishes
> - * processing this timed out request.
> - *
> - * If the request was already completed, then the LLD beat
> the
> - * time out handler from transferring the request to the
> scsi
> - * error handler. In that case we can return immediately
> as no
> - * further action is required.
> - */
> - if (req->q->mq_ops && !blk_mq_mark_complete(req))
> - return rtn;
> if (scsi_abort_command(scmd) != SUCCESS) {
> set_host_byte(scmd, DID_TIME_OUT);
> scsi_eh_scmd_add(scmd);
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index c7fccbb8f554..1e74137f1073 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -2044,8 +2044,11 @@ static int scsi_mq_prep_fn(struct request *req)
>
> static void scsi_mq_done(struct scsi_cmnd *cmd)
> {
> + if (test_and_set_bit(__SCMD_COMPLETE, &cmd->flags))
> + return;
> trace_scsi_dispatch_cmd_done(cmd);
> - blk_mq_complete_request(cmd->request);
> + if (unlikely(!blk_mq_complete_request(cmd->request)))
> + clear_bit(__SCMD_COMPLETE, &cmd->flags);
> }
>
> static void scsi_mq_put_budget(struct blk_mq_hw_ctx *hctx)
> @@ -2104,6 +2107,7 @@ static blk_status_t scsi_queue_rq(struct
> blk_mq_hw_ctx *hctx,
> goto out_dec_host_busy;
> req->rq_flags |= RQF_DONTPREP;
> } else {
> + cmd->flags &= ~SCMD_COMPLETE;
> blk_mq_start_request(req);
> }
Hi Keith,
Please Cc Martin Petersen and the scsi mailing list for SCSI patches.
Regarding this patch: I think this patch introduces a subtle but severe bug
in the SCSI core, namely that if an abort is processed concurrently with
request completion with "fake timeout" enabled that the abort is ignored.
Bart.
next prev parent reply other threads:[~2018-11-14 17:51 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-14 16:25 [PATCH 1/3] blk-mq: Return true if request was completed Keith Busch
2018-11-14 16:26 ` [PATCH 2/3] scsi: Do not rely on blk-mq for double completions Keith Busch
2018-11-14 17:51 ` Bart Van Assche [this message]
2018-11-14 18:00 ` Keith Busch
2018-11-14 18:10 ` Keith Busch
2018-11-14 16:26 ` [PATCH 3/3] blk-mq: Simplify request completion state Keith Busch
-- strict thread matches above, loose matches on Subject: below --
2018-11-15 17:56 [PATCH 1/3] blk-mq: Return true if request was completed Keith Busch
2018-11-15 17:56 ` [PATCH 2/3] scsi: Do not rely on blk-mq for double completions Keith Busch
2018-11-15 17:57 ` Keith Busch
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 \
--in-reply-to=1542217896.100259.2.camel@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=keith.busch@intel.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).