From patchwork Fri Jul 20 19:21:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Gilbert X-Patchwork-Id: 10538191 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E5D76603B5 for ; Fri, 20 Jul 2018 19:22:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D33DB2986C for ; Fri, 20 Jul 2018 19:22:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C6084298A2; Fri, 20 Jul 2018 19:22:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B4EEE2986C for ; Fri, 20 Jul 2018 19:22:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388096AbeGTUL7 (ORCPT ); Fri, 20 Jul 2018 16:11:59 -0400 Received: from smtp.infotech.no ([82.134.31.41]:38363 "EHLO smtp.infotech.no" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387989AbeGTUL7 (ORCPT ); Fri, 20 Jul 2018 16:11:59 -0400 Received: from localhost (localhost [127.0.0.1]) by smtp.infotech.no (Postfix) with ESMTP id E1ED32041B2; Fri, 20 Jul 2018 21:22:18 +0200 (CEST) X-Virus-Scanned: by amavisd-new-2.6.6 (20110518) (Debian) at infotech.no Received: from smtp.infotech.no ([127.0.0.1]) by localhost (smtp.infotech.no [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id sLihXgBFOAc1; Fri, 20 Jul 2018 21:22:16 +0200 (CEST) Received: from xtwo70.hitronhub.home (CPEa84e3fcc6793-CMa84e3fcc6790.cpe.net.cable.rogers.com [99.242.181.9]) by smtp.infotech.no (Postfix) with ESMTPA id 5486D20414E; Fri, 20 Jul 2018 21:22:10 +0200 (CEST) From: Douglas Gilbert To: linux-scsi@vger.kernel.org Cc: martin.petersen@oracle.com, jejb@linux.vnet.ibm.com, hare@suse.de, bart.vanassche@wdc.com, jianchao.w.wang@oracle.com, hch@lst.de, Douglas Gilbert Subject: [PATCH] scsi_debug: add cmd abort option to every_nth Date: Fri, 20 Jul 2018 15:21:28 -0400 Message-Id: <20180720192128.9218-1-dgilbert@interlog.com> X-Mailer: git-send-email 2.17.1 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch is motivated by a response in the thread: Re: [PATCH 0/5]stop normal completion path entering a timeout req by Jianchao Wang . It generalizes the error injection of blk_abort_request() to use scsi_debug's "every_nth" mechanism. Ref with original patch to scsi_debug: https://lore.kernel.org/lkml/a68ad043-26a1-d3d8-2009-504ba4230e0f@oracle.com/ Signed-off-by: Douglas Gilbert --- This patch may not be correct, or sufficient (nothing else in SCSI subsystem calls blk_abort_request() ) and it freezes my laptop with lk 2.18.0-rc1 kernel based on MKP's repository. However that crash may be the point of the original patch. Needs positive feedback from knowledgeable parties. drivers/scsi/scsi_debug.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 4dda192b8fba..9eda71138744 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -164,29 +164,29 @@ static const char *sdebug_version_date = "20180128"; #define SDEBUG_OPT_RESET_NOISE 0x2000 #define SDEBUG_OPT_NO_CDB_NOISE 0x4000 #define SDEBUG_OPT_HOST_BUSY 0x8000 +#define SDEBUG_OPT_CMD_ABORT 0x10000 #define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \ SDEBUG_OPT_RESET_NOISE) #define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \ SDEBUG_OPT_TRANSPORT_ERR | \ SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \ SDEBUG_OPT_SHORT_TRANSFER | \ - SDEBUG_OPT_HOST_BUSY) + SDEBUG_OPT_HOST_BUSY | \ + SDEBUG_OPT_CMD_ABORT) /* When "every_nth" > 0 then modulo "every_nth" commands: * - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set * - a RECOVERED_ERROR is simulated on successful read and write * commands if SDEBUG_OPT_RECOVERED_ERR is set. * - a TRANSPORT_ERROR is simulated on successful read and write * commands if SDEBUG_OPT_TRANSPORT_ERR is set. + * - similarly for DIF_ERR, DIX_ERR, SHORT_TRANSFER, HOST_BUSY and + * CMD_ABORT * - * When "every_nth" < 0 then after "- every_nth" commands: - * - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set - * - a RECOVERED_ERROR is simulated on successful read and write - * commands if SDEBUG_OPT_RECOVERED_ERR is set. - * - a TRANSPORT_ERROR is simulated on successful read and write - * commands if _DEBUG_OPT_TRANSPORT_ERR is set. - * This will continue on every subsequent command until some other action - * occurs (e.g. the user * writing a new value (other than -1 or 1) to - * every_nth via sysfs). + * When "every_nth" < 0 then after "- every_nth" commands the selected + * error will be injected. The error will be injected on every subsequent + * command until some other action occurs; for example, the user writing + * a new value (other than -1 or 1) to every_nth: + * echo 0 > /sys/bus/pseudo/drivers/scsi_debug/every_nth */ /* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in @@ -296,6 +296,7 @@ struct sdebug_queued_cmd { unsigned int inj_dix:1; unsigned int inj_short:1; unsigned int inj_host_busy:1; + unsigned int inj_cmd_abort:1; }; struct sdebug_queue { @@ -4312,7 +4313,8 @@ static void setup_inject(struct sdebug_queue *sqp, if (sdebug_every_nth > 0) sqcp->inj_recovered = sqcp->inj_transport = sqcp->inj_dif - = sqcp->inj_dix = sqcp->inj_short = 0; + = sqcp->inj_dix = sqcp->inj_short + = sqcp->inj_host_busy = sqcp->inj_cmd_abort = 0; return; } sqcp->inj_recovered = !!(SDEBUG_OPT_RECOVERED_ERR & sdebug_opts); @@ -4321,6 +4323,7 @@ static void setup_inject(struct sdebug_queue *sqp, sqcp->inj_dix = !!(SDEBUG_OPT_DIX_ERR & sdebug_opts); sqcp->inj_short = !!(SDEBUG_OPT_SHORT_TRANSFER & sdebug_opts); sqcp->inj_host_busy = !!(SDEBUG_OPT_HOST_BUSY & sdebug_opts); + sqcp->inj_cmd_abort = !!(SDEBUG_OPT_CMD_ABORT & sdebug_opts); } /* Complete the processing of the thread that queued a SCSI command to this @@ -4459,6 +4462,11 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, sd_dp->issuing_cpu = raw_smp_processor_id(); sd_dp->defer_t = SDEB_DEFER_WQ; schedule_work(&sd_dp->ew.work); + if (unlikely(sqcp->inj_cmd_abort)) { + blk_abort_request(cmnd->request); + sdev_printk(KERN_INFO, sdp, "abort request tag %d\n", + cmnd->request->tag); + } } if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) && (scsi_result == device_qfull_result)))