From patchwork Sun Feb 7 06:22:37 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nicholas A. Bellinger" X-Patchwork-Id: 8243841 Return-Path: X-Original-To: patchwork-linux-scsi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 18498BEEE5 for ; Sun, 7 Feb 2016 06:25:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 066A52017E for ; Sun, 7 Feb 2016 06:25:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BDF842011B for ; Sun, 7 Feb 2016 06:25:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753148AbcBGGZp (ORCPT ); Sun, 7 Feb 2016 01:25:45 -0500 Received: from mail-ob0-f170.google.com ([209.85.214.170]:35912 "EHLO mail-ob0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753257AbcBGGZn (ORCPT ); Sun, 7 Feb 2016 01:25:43 -0500 Received: by mail-ob0-f170.google.com with SMTP id ba1so121830629obb.3 for ; Sat, 06 Feb 2016 22:25:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daterainc-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=2CB2mc0k5+HYDSSj+UW9FcA0rbapJH5Ani8YzZaOfrU=; b=Wooor1QFxlv2bzLeUAxsZ9ENF19HpzDUF+nsNS8lN3fmbg8mzEFZW3J+cI9s2hS6FS bju6WLa84vfRkaBPoMU5VVG/5+vMNHvAeqICbBY/27pfWnvp5bhqP30cu4hO0DhK+OQr GSydJtOkVrH9jYnSIWLw2PXXyrvv/+TywMQO2NsIJqqsIQJFXRFrw8QZIIIUDbRHRcHp LTEyxOrj7Nu26LCGbV+TW3II2i8mV2yXKvj5BGIPm7CaX5n5DShbOW80nHPIRAZlyYRN xqpVTz7uwwblIBiIRsmyCgcfgEDeGc7Qy3TCGisXWqfkR1sFXSvF1ji1wg/vt62AJrAI h8QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=2CB2mc0k5+HYDSSj+UW9FcA0rbapJH5Ani8YzZaOfrU=; b=EbLwsf8VBZQbcrUkU4kwBK+3kJLLha2yCRPK+VfwTo5/qrSJZ3Edy2xSLUgrllSala MIXnssOU1xk10mUM5Tsdeaelpi//xHxZZr2z0tN85BgUcshMge/DXsQbwcBQ6eo1Wll0 S0a3P4IT/i2AIcF/oCN5wdVrjn71Rca6NJEDetHFhFNlhS296uwmvBMALBvnouJsPgBT hgB/L69Foyku9NmcK9oMLXFCNAbTzciFrRWQIvF/1JCuMiwX48CXkM/BfWBcfOsJ5zlF 74nExnI3TlG2bFGsdWOuCUF8+ErDMy5Aazh3jHep5fyqdyXJKNaodXzih2eJXsGB7l2B vDXQ== X-Gm-Message-State: AG10YOQUHBAODXZS2P/vNUYCH1pNi+VyTxLQHFh8B9rM3s8z9/3oX/uVSBlxjyUQSsdCQg== X-Received: by 10.60.39.136 with SMTP id p8mr19355056oek.81.1454826342957; Sat, 06 Feb 2016 22:25:42 -0800 (PST) Received: from localhost.localdomain (mail.linux-iscsi.org. [67.23.28.174]) by smtp.gmail.com with ESMTPSA id co3sm13620802obb.15.2016.02.06.22.25.42 (version=TLS1 cipher=AES128-SHA bits=128/128); Sat, 06 Feb 2016 22:25:42 -0800 (PST) From: "Nicholas A. Bellinger" To: target-devel Cc: linux-scsi , Christoph Hellwig , Hannes Reinecke , Sagi Grimberg , Andy Grover , Mike Christie , Nicholas Bellinger Subject: [PATCH] target/iblock: Use -EAGAIN/-ENOMEM to propigate SAM BUSY/TASK_SET_FULL Date: Sun, 7 Feb 2016 06:22:37 +0000 Message-Id: <1454826157-20877-1-git-send-email-nab@daterainc.com> X-Mailer: git-send-email 1.7.2.5 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nicholas Bellinger This patch updates target/iblock backend driver code to check for bio completion status of -EAGAIN / -ENOMEM provided by raw block drivers and scsi devices, in order to generate the following SCSI status to initiators: - SAM_STAT_BUSY - SAM_STAT_TASK_SET_FULL Note these two SAM status codes are useful to signal to Linux SCSI host side that se_cmd should be retried again, or with TASK_SET_FULL case to attempt to lower our internal host LLD queue_depth and scsi_cmnd retry. It also updates target_complete_cmd() to parse status when signalling success to target_completion_wq. Cc: Christoph Hellwig Cc: Hannes Reinecke Cc: Sagi Grimberg Cc: Andy Grover Cc: Mike Christie Signed-off-by: Nicholas Bellinger Reviewed-by: Hannes Reinecke --- drivers/target/target_core_iblock.c | 38 +++++++++++++++++++++++++++------- drivers/target/target_core_iblock.h | 1 + drivers/target/target_core_transport.c | 13 ++++++++++-- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 5a2899f..77d0381 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -300,11 +300,28 @@ static void iblock_complete_cmd(struct se_cmd *cmd) if (!atomic_dec_and_test(&ibr->pending)) return; - - if (atomic_read(&ibr->ib_bio_err_cnt)) - status = SAM_STAT_CHECK_CONDITION; - else + /* + * Propigate use these two bio completion values from raw block + * drivers to signal up BUSY and TASK_SET_FULL status to the + * host side initiator. The latter for Linux/iSCSI initiators + * means the Linux/SCSI LLD will begin to reduce it's internal + * per session queue_depth. + */ + if (atomic_read(&ibr->ib_bio_err_cnt)) { + switch (ibr->ib_bio_retry) { + case -EAGAIN: + status = SAM_STAT_BUSY; + break; + case -ENOMEM: + status = SAM_STAT_TASK_SET_FULL; + break; + default: + status = SAM_STAT_CHECK_CONDITION; + break; + } + } else { status = SAM_STAT_GOOD; + } target_complete_cmd(cmd, status); kfree(ibr); @@ -316,7 +333,15 @@ static void iblock_bio_done(struct bio *bio) struct iblock_req *ibr = cmd->priv; if (bio->bi_error) { - pr_err("bio error: %p, err: %d\n", bio, bio->bi_error); + pr_debug_ratelimited("test_bit(BIO_UPTODATE) failed for bio: %p," + " err: %d\n", bio, bio->bi_error); + /* + * Save the retryable status provided and translate into + * SAM status in iblock_complete_cmd(). + */ + if (bio->bi_error == -EAGAIN || bio->bi_error == -ENOMEM) { + ibr->ib_bio_retry = bio->bi_error; + } /* * Bump the ib_bio_err_cnt and release bio. */ @@ -655,8 +680,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, u32 sg_num = sgl_nents; sector_t block_lba; unsigned bio_cnt; - int rw = 0; - int i; + int i, rw = 0; if (data_direction == DMA_TO_DEVICE) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); diff --git a/drivers/target/target_core_iblock.h b/drivers/target/target_core_iblock.h index 01c2afd..ff3cfdd 100644 --- a/drivers/target/target_core_iblock.h +++ b/drivers/target/target_core_iblock.h @@ -9,6 +9,7 @@ struct iblock_req { atomic_t pending; atomic_t ib_bio_err_cnt; + int ib_bio_retry; } ____cacheline_aligned; #define IBDF_HAS_UDEV_PATH 0x01 diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 6becc94..eb12ae2 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -732,11 +732,20 @@ static unsigned char *transport_get_sense_buffer(struct se_cmd *cmd) void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) { struct se_device *dev = cmd->se_dev; - int success = scsi_status == GOOD; + int success; unsigned long flags; cmd->scsi_status = scsi_status; - + switch (cmd->scsi_status) { + case SAM_STAT_GOOD: + case SAM_STAT_BUSY: + case SAM_STAT_TASK_SET_FULL: + success = 1; + break; + default: + success = 0; + break; + } spin_lock_irqsave(&cmd->t_state_lock, flags); cmd->transport_state &= ~CMD_T_BUSY;