From patchwork Fri Jul 17 16:12:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670651 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E0CAC13B6 for ; Fri, 17 Jul 2020 16:12:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C8E052074B for ; Fri, 17 Jul 2020 16:12:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="E6gCXV+R" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727771AbgGQQMk (ORCPT ); Fri, 17 Jul 2020 12:12:40 -0400 Received: from mail1.bemta25.messagelabs.com ([195.245.230.1]:49573 "EHLO mail1.bemta25.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727115AbgGQQMi (ORCPT ); Fri, 17 Jul 2020 12:12:38 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002355; i=@ts.fujitsu.com; bh=2Frq/UoMo2ZmRBbp04/5Qkl6kYBSP2A4sdzcLM8oql8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=E6gCXV+RoFX34k0r5E0ItfiRwKlaTqgSNlzjlin3g62m2cII8CS5nswV/OVacXOCu n2hzactIesX2HkG8vfBEamHQB0sci5twF7I9xUgdpDdI5mAeilM7o5+avXxfxGLPGa 2HI68HVwzYvsHUTUiq8QHQmZXIr4ByPaN7qA/LXaJXT1M9Mc+7S2eT2M+FdT8ffjWQ hroCYlnK3kOO1qv3zr25G+Ah33I/sf2ginhggw9KRA5tS4NLtMKd6sWy/wvqpQrpQo b3uO8PmdBh+Bbdf3yLbv+/TTQZ19idgzWTc82WAnATHOVEaW79utkXtG0ed9Ub9g1l 9146/jdswsVIw== Received: from [100.112.192.94] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-1.bemta.az-a.eu-west-1.aws.symcld.net id 39/CB-19802-3FDC11F5; Fri, 17 Jul 2020 16:12:35 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDLMWRWlGSWpSXmKPExsViZ8MxVffzWcF 4g8c3ZC26r+9gs1h+/B+Txd9JN1gtWpe+ZXJg8fj49BaLx+dNcgFMUayZeUn5FQmsGRt/LGYr +CVU8bD1AmsD41aBLkYuDiGByYwSh17PZIRwpjNKHJ3+ga2LkZODTcBAYsWk+ywgCRGBNYwSK +/MYwZJMAvoSUz7t44dxBYWcJKYs2MjC4jNIqAqcWbqVVYQm1fATuLu8ZNggyQE5CU6DkwGq+ EUsJeY/e0gI4gtBFTzYN1b5gmM3AsYGVYxWiQVZaZnlOQmZuboGhoY6BoaGukaWhrpGhmY6CV W6SbqpZbqlqcWl+ga6iWWF+sVV+Ym56To5aWWbGIEBkpKwYEzOxhPvf6gd4hRkoNJSZS3bZVg vBBfUn5KZUZicUZ8UWlOavEhRhkODiUJXvFTQDnBotT01Iq0zBxg0MKkJTh4lER4W4GBK8RbX JCYW5yZDpE6xagoJc7bA5IQAElklObBtcEi5RKjrJQwLyMDA4MQT0FqUW5mCar8K0ZxDkYlYd 69IFN4MvNK4Ka/AlrMBLR442dekMUliQgpqQamIBfN9puC1tM8z0q8cxJeu7/RRNa3eOHsh1M u9fdmPKljkmT5+W1fPfO/+KPdTybxXtnuvefSO/Ebfg/nRZxjNf+fN2nP5nhZ7szdTb8jTYru i0rcMf8XOHt32Bf9B5IHzwZ/OHR0tVYBB5vRhY7/ByM3qMhuu2txvf2/7qOSW/4irQemxM4Pn 1W++p/cqvz3He4PNsWsv9QtdeaiUf3R6xM4+UQcs5Nj/iesvrioNpTb5MuXqddaDhs4ichbBR 38kOG0NTIt6nGh1v/uafJ3vnjYnZxTUz95fuXbixpBW+QZ5HkDvnx/KFZydvYuUV3nohcSgSG /RBcbaR2wX7ciXWyRhNFMRoO9vTPuLMq0VGIpzkg01GIuKk4EAPcYxQcPAwAA X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-28.tower-265.messagelabs.com!1595002354!89497!1 X-Originating-IP: [62.60.8.149] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 28885 invoked from network); 17 Jul 2020 16:12:35 -0000 Received: from unknown (HELO mailhost2.uk.fujitsu.com) (62.60.8.149) by server-28.tower-265.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:35 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost2.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCQFD010041; Fri, 17 Jul 2020 17:12:26 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id E545520468; Fri, 17 Jul 2020 18:12:20 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 1/8] scsi: target: Modify core_tmr_abort_task() Date: Fri, 17 Jul 2020 18:12:05 +0200 Message-Id: <20200717161212.10731-2-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org This patch modifies core_tmr_abort_task() to use same looping and locking scheme as core_tmr_drain_state_list() does. This frees the state_list element in se_cmd for later use by tmr notification handling. Note: __target_check_io_state() now is called with param 0 instead of dev->dev_attrib.emulate_tas, because tas is not relevant since we always get ABRT on same session like the aborted command. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_tmr.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c index 89c84d472cd7..b65d7a0a5df1 100644 --- a/drivers/target/target_core_tmr.c +++ b/drivers/target/target_core_tmr.c @@ -116,14 +116,15 @@ void core_tmr_abort_task( struct se_tmr_req *tmr, struct se_session *se_sess) { - struct se_cmd *se_cmd; + struct se_cmd *se_cmd, *next; unsigned long flags; + bool rc; u64 ref_tag; - spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); - list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) { + spin_lock_irqsave(&dev->execute_task_lock, flags); + list_for_each_entry_safe(se_cmd, next, &dev->state_list, state_list) { - if (dev != se_cmd->se_dev) + if (se_sess != se_cmd->se_sess) continue; /* skip task management functions, including tmr->task_cmd */ @@ -137,11 +138,16 @@ void core_tmr_abort_task( printk("ABORT_TASK: Found referenced %s task_tag: %llu\n", se_cmd->se_tfo->fabric_name, ref_tag); - if (!__target_check_io_state(se_cmd, se_sess, - dev->dev_attrib.emulate_tas)) + spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); + rc = __target_check_io_state(se_cmd, se_sess, 0); + spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); + if (!rc) continue; - spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); + list_del_init(&se_cmd->state_list); + se_cmd->state_active = false; + + spin_unlock_irqrestore(&dev->execute_task_lock, flags); /* * Ensure that this ABORT request is visible to the LU RESET @@ -159,7 +165,7 @@ void core_tmr_abort_task( atomic_long_inc(&dev->aborts_complete); return; } - spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); + spin_unlock_irqrestore(&dev->execute_task_lock, flags); printk("ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST for ref_tag: %lld\n", tmr->ref_task_tag); From patchwork Fri Jul 17 16:12:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670629 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9CCCC6C1 for ; Fri, 17 Jul 2020 16:12:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4B0D82074B for ; Fri, 17 Jul 2020 16:12:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="CSO3KqOJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727086AbgGQQMe (ORCPT ); Fri, 17 Jul 2020 12:12:34 -0400 Received: from mail1.bemta25.messagelabs.com ([195.245.230.68]:33401 "EHLO mail1.bemta25.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726633AbgGQQMd (ORCPT ); Fri, 17 Jul 2020 12:12:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002350; i=@ts.fujitsu.com; bh=egmweCa5pZm/0eaUhgjJ9HDsMmuNSgWkgH65Ktkuo60=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=CSO3KqOJaayWskJ3mCWrDoUxAGQYXUqDHBhr0iGq6mKnm+V1rTxDM9qf8H1WVqL6u mTYVoHZwYMx084qgji3mmb54JJvY8F+w8Awyhz7bZn7BAcYaWpDVVnrkwc0wJiyhPx 3+JrC+YDELzU9pU3eXkyY4DD1o0l08/ER4igYH3YLEOuB46ugDROhRqrKxuAtJDX4m nX8o4wvAu+eP3KU2LWKh2WafXtROUU+0xRIRJJQ0X2JFg0ZHQRLxbi4+L+7T0Ze9zQ /FQ3vVZYV2QltNiW0Ebddk0SI3MLe8QI8Sut87VPOfibLFRKKxqln/k7n6ySgZHMSO ZmFBYCLT3PI4g== Received: from [100.112.197.196] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-4.bemta.az-b.eu-west-1.aws.symcld.net id 0B/BA-16187-EEDC11F5; Fri, 17 Jul 2020 16:12:30 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRWlGSWpSXmKPExsViZ8MRovvurGC 8waTtrBbd13ewWSw//o/J4u+kG6wWrUvfMjmweHx8eovF4/MmuQCmKNbMvKT8igTWjAdrGpgL HslX3Jns28B4TrqLkYtDSGAyo8SeWcdZIZzpjBJLrneydTFycrAJGEismHSfBSQhIrCGUWLln XnMIAlmAT2Jaf/WsYPYwgKuErPefGcCsVkEVCUOdC5nBbF5Bewk3m45zwhiSwjIS3QcmMwCYn MK2EvM/nYQLC4EVPNg3VvmCYzcCxgZVjFaJBVlpmeU5CZm5ugaGhjoGhoa6RpaWugamhvrJVb pJumlluqWpxaX6BrqJZYX6xVX5ibnpOjlpZZsYgSGSUrBsbU7GHvefNA7xCjJwaQkytu2SjBe iC8pP6UyI7E4I76oNCe1+BCjDAeHkgSv+CmgnGBRanpqRVpmDjBkYdISHDxKIrzGZ4DSvMUFi bnFmekQqVOMilLivGIgCQGQREZpHlwbLE4uMcpKCfMyMjAwCPEUpBblZpagyr9iFOdgVBLmDQ OZwpOZVwI3/RXQYiagxRs/84IsLklESEk1ME3k5y9c4u2xN3hBsdnWZ7J2dxcE5Owy2K3bdtd z9gLPm9PZZ2zf5ijMNk18K8/Mq66zzsqdenFe7tE8Fn6Xv3eN0qIcz1uGN7S0eP6+WnHbyMFk c2SpNXPUdQWpuS7bQv6rZetPitB2zblV/mVyg3kf302BE2+SfiixGhqZ39tiu/6o5qH8MieZR /t9dn10f90SfO1bPNOrq3MF1kXMuWSRvTDg/vtJegqHONUWPA//0LJizURjznVep6KmHcrjOZ X23iLuzMeEc5cOdl/9ez2wmF0+W0bY7tzEiq//p86eJncztiRq2qKXTL+M7veeL8mWKq4XuHR +6QQ3sR3/H14rk37ZoRorXb+da0bGxXNKLMUZiYZazEXFiQCbAK+BDgMAAA== X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-17.tower-287.messagelabs.com!1595002349!316577!1 X-Originating-IP: [62.60.8.84] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 24145 invoked from network); 17 Jul 2020 16:12:29 -0000 Received: from unknown (HELO mailhost3.uk.fujitsu.com) (62.60.8.84) by server-17.tower-287.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:29 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost3.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCNg3009778; Fri, 17 Jul 2020 17:12:23 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id F226C20489; Fri, 17 Jul 2020 18:12:20 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 2/8] scsi: target: Add tmr_notify backend function Date: Fri, 17 Jul 2020 18:12:06 +0200 Message-Id: <20200717161212.10731-3-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org Target core is modified to call an optional backend callback function if a TMR is received or commands are aborted implicitly after a PR command was received. The backend function takes as parameters the se_dev, the type of the TMR, and the list of aborted commands. If no commands were aborted, an empty list is supplied. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_tmr.c | 16 +++++++++++++++- drivers/target/target_core_transport.c | 1 + include/target/target_core_backend.h | 2 ++ include/target/target_core_base.h | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c index b65d7a0a5df1..39d93357db65 100644 --- a/drivers/target/target_core_tmr.c +++ b/drivers/target/target_core_tmr.c @@ -116,6 +116,7 @@ void core_tmr_abort_task( struct se_tmr_req *tmr, struct se_session *se_sess) { + LIST_HEAD(aborted_list); struct se_cmd *se_cmd, *next; unsigned long flags; bool rc; @@ -144,7 +145,7 @@ void core_tmr_abort_task( if (!rc) continue; - list_del_init(&se_cmd->state_list); + list_move_tail(&se_cmd->state_list, &aborted_list); se_cmd->state_active = false; spin_unlock_irqrestore(&dev->execute_task_lock, flags); @@ -157,6 +158,11 @@ void core_tmr_abort_task( WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd) < 0); + if (dev->transport->tmr_notify) + dev->transport->tmr_notify(dev, TMR_ABORT_TASK, + &aborted_list); + + list_del_init(&se_cmd->state_list); target_put_cmd_and_wait(se_cmd); printk("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for" @@ -167,6 +173,9 @@ void core_tmr_abort_task( } spin_unlock_irqrestore(&dev->execute_task_lock, flags); + if (dev->transport->tmr_notify) + dev->transport->tmr_notify(dev, TMR_ABORT_TASK, &aborted_list); + printk("ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST for ref_tag: %lld\n", tmr->ref_task_tag); tmr->response = TMR_TASK_DOES_NOT_EXIST; @@ -318,6 +327,11 @@ static void core_tmr_drain_state_list( } spin_unlock_irqrestore(&dev->execute_task_lock, flags); + if (dev->transport->tmr_notify) + dev->transport->tmr_notify(dev, preempt_and_abort_list ? + TMR_LUN_RESET_PRO : TMR_LUN_RESET, + &drain_task_list); + while (!list_empty(&drain_task_list)) { cmd = list_entry(drain_task_list.next, struct se_cmd, state_list); list_del_init(&cmd->state_list); diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index e6e1fa68de54..9fb0be0aa620 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -2946,6 +2946,7 @@ static const char *target_tmf_name(enum tcm_tmreq_table tmf) case TMR_LUN_RESET: return "LUN_RESET"; case TMR_TARGET_WARM_RESET: return "TARGET_WARM_RESET"; case TMR_TARGET_COLD_RESET: return "TARGET_COLD_RESET"; + case TMR_LUN_RESET_PRO: return "LUN_RESET_PRO"; case TMR_UNKNOWN: break; } return "(?)"; diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index f51452e3b984..6336780d83a7 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h @@ -40,6 +40,8 @@ struct target_backend_ops { ssize_t (*show_configfs_dev_params)(struct se_device *, char *); sense_reason_t (*parse_cdb)(struct se_cmd *cmd); + void (*tmr_notify)(struct se_device *se_dev, enum tcm_tmreq_table, + struct list_head *aborted_cmds); u32 (*get_device_type)(struct se_device *); sector_t (*get_blocks)(struct se_device *); sector_t (*get_alignment_offset_lbas)(struct se_device *); diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 18c3f277b770..549947d407cf 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -207,6 +207,7 @@ enum tcm_tmreq_table { TMR_LUN_RESET = 5, TMR_TARGET_WARM_RESET = 6, TMR_TARGET_COLD_RESET = 7, + TMR_LUN_RESET_PRO = 0x80, TMR_UNKNOWN = 0xff, }; From patchwork Fri Jul 17 16:12:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670645 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DCB726C1 for ; Fri, 17 Jul 2020 16:12:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BD76D2076A for ; Fri, 17 Jul 2020 16:12:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="gDsm07ZQ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727768AbgGQQMh (ORCPT ); Fri, 17 Jul 2020 12:12:37 -0400 Received: from mail1.bemta25.messagelabs.com ([195.245.230.1]:49573 "EHLO mail1.bemta25.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727085AbgGQQMf (ORCPT ); Fri, 17 Jul 2020 12:12:35 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002352; i=@ts.fujitsu.com; bh=3Dr9L1Lw9/CiK8afeg4DStkBmBuyCm8ZavaSMzq71do=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=gDsm07ZQDZCE/TaHZcif1WrlbnPyIgqultwyYBgq9AaWtSJZdgyiiIhGT3FdcEno6 63jFeRHKtIQcOv09h8jkFn2Wdt0cmXjHQQO2qWJf08uLB3ZO7jWwnG3JOkKQbhMjnh ie3wTyNnASEJo2N36ei8Wgu62zXiuiooRChSIIC9vQDBFEX8Nc/COf5VYXFb/oqxti wlO5N7rz/kUGE4+VP1PwNZv6JC5u6JNv5JkKbm/KvDayaWgiM9BLHiu8vNrimI+TSW WBLSzMgiuDd6iWlDZSj8RruUdHGLy5Wo33EEDfFA9IokY5N0mfTiENRr1ecusZDctd zVNfkl3W56miQ== Received: from [100.112.192.94] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-1.bemta.az-a.eu-west-1.aws.symcld.net id 1E/9B-19802-0FDC11F5; Fri, 17 Jul 2020 16:12:32 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDLMWRWlGSWpSXmKPExsViZ8MxRffDWcF 4gyebuSy6r+9gs1h+/B+Txd9JN1gtWpe+ZXJg8fj49BaLx+dNcgFMUayZeUn5FQmsGdO+zmYv uMlb8WfmEvYGxs/cXYxcHEICkxkleiZuZIJwpjNK7Nj6iKWLkZODTcBAYsWk+ywgCRGBNYwSK +/MYwZJMAvoSUz7t44dxBYWcJP4PAEiziKgKnHuyA8mEJtXwE5ix2yIuISAvETHgclgQzkF7C VmfzvICGILAdU8WPeWeQIj9wJGhlWMFklFmekZJbmJmTm6hgYGuoaGRrqGlkBsYqKXWKWbqJd aqlueWlyia6iXWF6sV1yZm5yTopeXWrKJERgoKQUHJuxg3P/6g94hRkkOJiVR3rZVgvFCfEn5 KZUZicUZ8UWlOanFhxhlODiUJHjFTwHlBItS01Mr0jJzgEELk5bg4FES4TU+A5TmLS5IzC3OT IdInWJUlBLnFQNJCIAkMkrz4NpgkXKJUVZKmJeRgYFBiKcgtSg3swRV/hWjOAejkjBvGMgUns y8Erjpr4AWMwEt3viZF2RxSSJCSqqBKYr/VGmh45nqCNPQA19LJsQftFC6kSmz8ELVJAmBu8w RxwvDF2pbx023sFnQf6RvF4v6q/jbIZJ8xzjmcO7a5nFP4s6j1f9fyASs3GKtu3fCQoUlSQ9Y bm+sPbyMbz2ri+7Go1l3T5swOd2cUZR6kF+eu/reuyK/PV7H/PQXe2+9Nu+Czd4Nlld/BItVh P25tPgpv67C/8YbS5z3fF43NWT6NU6PAjGNjJkPT0f9Xhvq0vFhrUzZj8UbOXU+iYasfT6ZU2 Bjm1VIAPeG4xNtpi5d48+yWSL18HvXhzwcrI1T27N22Sh+E537/xeT1fES5fLeKf6vj4YuXr7 77sffr59Ma97w9d3dT2K3r4QcSsxXYinOSDTUYi4qTgQA1min5A8DAAA= X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-23.tower-267.messagelabs.com!1595002351!26012!1 X-Originating-IP: [62.60.8.148] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 23744 invoked from network); 17 Jul 2020 16:12:32 -0000 Received: from unknown (HELO mailhost1.uk.fujitsu.com) (62.60.8.148) by server-23.tower-267.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:32 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost1.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCLpu028936; Fri, 17 Jul 2020 17:12:21 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id 0096620561; Fri, 17 Jul 2020 18:12:21 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 3/8] scsi: target: tcmu: Use priv pointer in se_cmd Date: Fri, 17 Jul 2020 18:12:07 +0200 Message-Id: <20200717161212.10731-4-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org We initialize and clean up the se_cmd's priv pointer under cmd_ring_lock to point to the corresponding tcmu_cmd. In the patch that implements tmr_notify callback in tcmu we will use the priv pointer. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_user.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 366878b0b2fd..b06b18d1b135 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -541,6 +541,8 @@ tcmu_get_block_page(struct tcmu_dev *udev, uint32_t dbi) static inline void tcmu_free_cmd(struct tcmu_cmd *tcmu_cmd) { + if (tcmu_cmd->se_cmd) + tcmu_cmd->se_cmd->priv = NULL; kfree(tcmu_cmd->dbi); kmem_cache_free(tcmu_cmd_cache, tcmu_cmd); } @@ -1109,10 +1111,11 @@ tcmu_queue_cmd(struct se_cmd *se_cmd) return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; mutex_lock(&udev->cmdr_lock); + se_cmd->priv = tcmu_cmd; ret = queue_cmd_ring(tcmu_cmd, &scsi_ret); - mutex_unlock(&udev->cmdr_lock); if (ret < 0) tcmu_free_cmd(tcmu_cmd); + mutex_unlock(&udev->cmdr_lock); return scsi_ret; } @@ -1179,7 +1182,6 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * target_complete_cmd(cmd->se_cmd, entry->rsp.scsi_status); out: - cmd->se_cmd = NULL; tcmu_cmd_free_data(cmd, cmd->dbi_cnt); tcmu_free_cmd(cmd); } @@ -1285,6 +1287,7 @@ static void tcmu_check_expired_ring_cmd(struct tcmu_cmd *cmd) set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags); list_del_init(&cmd->queue_entry); se_cmd = cmd->se_cmd; + se_cmd->priv = NULL; cmd->se_cmd = NULL; pr_debug("Timing out inflight cmd %u on dev %s.\n", From patchwork Fri Jul 17 16:12:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670639 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CCC1660D for ; Fri, 17 Jul 2020 16:12:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B55BA2074B for ; Fri, 17 Jul 2020 16:12:36 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="mYmi7lCQ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727107AbgGQQMg (ORCPT ); Fri, 17 Jul 2020 12:12:36 -0400 Received: from mail1.bemta26.messagelabs.com ([85.158.142.114]:22352 "EHLO mail1.bemta26.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726736AbgGQQMf (ORCPT ); Fri, 17 Jul 2020 12:12:35 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002352; i=@ts.fujitsu.com; bh=tK3FIVROxYjkLrzhtoyLVijq5QAfznqa/3uJx7/8R3M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=mYmi7lCQZqy2H2rE01ZVN/fzMc4N32rZ4P9pK6STUgb1M6PPGf0wmqyiaLKaNePIu ab/P+CD1CZJuOQPBi8pxKTlw66x6D/QEnTRyxAjwvMbX9G0lNW1Zc6dXBLwvYq1zE9 M/xplQINZ7ZXGVq/5sBQSTeDAXsXs8gz84+Mdo6sNUGIx5DFhfXBmgSZ2Jxy1NXxuQ 4YJvczeoUGmeftONDdSNGtmIx1YhNWU3YQPo+jsVglaLTkf3du7YoejTCo4HY7syKv 2UCm6o49ytEqbcklGQfTzKJGF2mJhnXzTRwCO7RuCmW7SAgZMIheRdLlDuHwJDAZlH l0y2GyaBbIOng== Received: from [100.113.7.235] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-3.bemta.az-b.eu-central-1.aws.symcld.net id 67/18-62820-FEDC11F5; Fri, 17 Jul 2020 16:12:31 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDLMWRWlGSWpSXmKPExsViZ8MRovvurGC 8wekl7Bbd13ewWSw//o/J4u+kG6wWrUvfMjmweHx8eovF4/MmuQCmKNbMvKT8igTWjP8zjjEW fOWo6H9U2sD4hL2LkYtDSGAyo8TuHc0sEM50RolZ3V9Yuxg5OdgEDCRWTLoPlhARWMMosfLOP GaQBLOAnsS0f+vYQWxhAU+JlZcPsIDYLAKqElNOX2UCsXkF7CQOPl7ACGJLCMhLdByYDFbDKW AvMfvbQbC4EFDNg3VvmScwci9gZFjFaJlUlJmeUZKbmJmja2hgoGtoaKxrpmtkYqCXWKWbpJd aqpucmldSlAiU1UssL9YrrsxNzknRy0st2cQIDJSUQrYPOxinvPmgd4hRkoNJSZS3bZVgvBBf Un5KZUZicUZ8UWlOavEhRhkODiUJXvFTQDnBotT01Iq0zBxg0MKkJTh4lER4jc8ApXmLCxJzi zPTIVKnGBWlxHnFQBICIImM0jy4NlikXGKUlRLmZWRgYBDiKUgtys0sQZV/xSjOwagkzBsGMo UnM68EbvoroMVMQIs3fuYFWVySiJCSamAS+7Sqj8sh57rDXIGCLOEM06+p/06tvHxX72Ovh2a w5pt4HxeP6xdjij/89L4gfHv+9cJvU9lkbVnltG99m9t7dWL5pO8CliH+de3bH2m/5p8k3br0 Kv/vT1qn3kqWHzz37c73c7MPrZ/fJSdzyfZigXL//S+Bd2wfpW27temSoOlSPg/pn+pf9FQXL lts9bVrbZL8d0Z2JgPV/zzOrYpr/qxd3mBhkB918banV0/7tVVbH98IfHzKpddfknvRtGXfJb 5YLePcnLk4Y/6ZNrkEWb6+veIznYueFP6Zd+ByfVHO7dgvLh5KCRwH7BYcK42d1dZg8LL+q+B Xc877S9N9D0bG6j2N4H59ZXvSM7sGJZbijERDLeai4kQA9ACjIQ8DAAA= X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-36.tower-245.messagelabs.com!1595002349!401634!1 X-Originating-IP: [62.60.8.84] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 23497 invoked from network); 17 Jul 2020 16:12:30 -0000 Received: from unknown (HELO mailhost3.uk.fujitsu.com) (62.60.8.84) by server-36.tower-245.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:30 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost3.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCN0w009783; Fri, 17 Jul 2020 17:12:23 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id 034F920619; Fri, 17 Jul 2020 18:12:21 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 4/8] scsi: target: tcmu: Do not queue aborted commands Date: Fri, 17 Jul 2020 18:12:08 +0200 Message-Id: <20200717161212.10731-5-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org If tcmu receives an already aborted command, tcmu_queue_cmd() should reject it. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_user.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index b06b18d1b135..25c480fde9ee 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -1103,8 +1103,8 @@ tcmu_queue_cmd(struct se_cmd *se_cmd) struct se_device *se_dev = se_cmd->se_dev; struct tcmu_dev *udev = TCMU_DEV(se_dev); struct tcmu_cmd *tcmu_cmd; - sense_reason_t scsi_ret; - int ret; + sense_reason_t scsi_ret = TCM_CHECK_CONDITION_ABORT_CMD; + int ret = -1; tcmu_cmd = tcmu_alloc_cmd(se_cmd); if (!tcmu_cmd) @@ -1112,7 +1112,8 @@ tcmu_queue_cmd(struct se_cmd *se_cmd) mutex_lock(&udev->cmdr_lock); se_cmd->priv = tcmu_cmd; - ret = queue_cmd_ring(tcmu_cmd, &scsi_ret); + if (!(se_cmd->transport_state & CMD_T_ABORTED)) + ret = queue_cmd_ring(tcmu_cmd, &scsi_ret); if (ret < 0) tcmu_free_cmd(tcmu_cmd); mutex_unlock(&udev->cmdr_lock); From patchwork Fri Jul 17 16:12:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670657 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9404B6C1 for ; Fri, 17 Jul 2020 16:12:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7649C2076A for ; Fri, 17 Jul 2020 16:12:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="Gd54Fv9W" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726256AbgGQQMr (ORCPT ); Fri, 17 Jul 2020 12:12:47 -0400 Received: from mail1.bemta26.messagelabs.com ([85.158.142.1]:31588 "EHLO mail1.bemta26.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726736AbgGQQMj (ORCPT ); Fri, 17 Jul 2020 12:12:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002355; i=@ts.fujitsu.com; bh=RLWTXTWFyHAGnk+WtQu0/qy0qd9euXFeGbDkGp5OEXQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=Gd54Fv9WN5j2W2ENvOvs6ohghsepDuuOeJzerWZAEa6mjGzUtuBzwC6faUkQ286ZQ UdwKLHEssDVd6g0WO9dXSFx52q7yfQfY6difbuL0kSQ8DNAgf2bMXixwkLiYZoyEaS MtSzi/blrf9OXRXlH1EzoYAT2kccVbHXEJgojFAqU9ooZkq/hXtavch2pgBcN5AeyW BBSxXd63OXcVpUthzdFmLsnMd1lBDzy6cKyA+CudSkVIM21MZJrar5EZm70by6TD/u 6pBiVdJzlTQ6SnCReJI9z8hiindv5RxnsX35SgyYs6L/1Kxl9t093ev1IbJ6+Ay4Y1 OXBdJMj5HnDfg== Received: from [100.113.2.186] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-1.bemta.az-a.eu-central-1.aws.symcld.net id 77/BB-07993-3FDC11F5; Fri, 17 Jul 2020 16:12:35 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFLMWRWlGSWpSXmKPExsViZ8MxVffzWcF 4g+ebZC26r+9gs1h+/B+Txd9JN1gtWpe+ZXJg8fj49BaLx+dNcgFMUayZeUn5FQmsGS+7LjIW HJSqOPtasYHxiFgXIxeHkMBkRol73w6yQDjTGSVObFvB1MXIycEmYCCxYtJ9sISIwBpGiZV35 jGDJJgF9CSm/VvHDmILC4RKXD65iAXEZhFQlbi/chdQMwcHr4CdxLaGapCwhIC8RMeByWAlnA L2ErO/HWQEsYWASh6se8s8gZF7ASPDKkaLpKLM9IyS3MTMHF1DAwNdQ0NjXSNdU0O9xCrdRL3 UUt3k1LySokSgpF5iebFecWVuck6KXl5qySZGYJCkFDIZ72C89vqD3iFGSQ4mJVHetlWC8UJ8 SfkplRmJxRnxRaU5qcWHGGU4OJQkeMVPAeUEi1LTUyvSMnOAAQuTluDgURLhNT4DlOYtLkjML c5Mh0idYlSUEucVA0kIgCQySvPg2mBRcolRVkqYl5GBgUGIpyC1KDezBFX+FaM4B6OSMG8YyB SezLwSuOmvgBYzAS3e+JkXZHFJIkJKqoHJ1HH58yfGG9MdFpW+jYpknCSzKDltr8zsPW7/C+Z //7ZfQqLwML9dp+mr7FOPuyP7dmst2LM/7mK4adXyxkstypmVVTPv8HNryF5w2qXTUPDwrJ7V 7OrY/46fOZjn7Nsk8ZlDd6PfRf6A34ZCXu5ZKW+uLfLPPmj9fK5mSe2vFhst/n/3Ymr8c3Mtd FfWObyaMLW4Z9+O+b6X4iOPF0cEbFKLOT69/uTNnIjMcP8bb/4s7Vty+cnuFecuLpK7pJZ1uG OWoYCEpHyb4Cd2qSm9dzl3zjmueObYvClz2u7M1lo9x/kOy8yNbT3uV6VVRYO8tatCFlhuvjv FO+CFV2qanW9I8c7GECGJslyBMHklluKMREMt5qLiRADadkB1DQMAAA== X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-17.tower-232.messagelabs.com!1595002354!1123521!1 X-Originating-IP: [62.60.8.149] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 29003 invoked from network); 17 Jul 2020 16:12:35 -0000 Received: from unknown (HELO mailhost2.uk.fujitsu.com) (62.60.8.149) by server-17.tower-232.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:35 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost2.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCT3x010090; Fri, 17 Jul 2020 17:12:29 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id 0FB3820800; Fri, 17 Jul 2020 18:12:21 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 5/8] scsi: target: tcmu: Factor out new helper ring_insert_padding Date: Fri, 17 Jul 2020 18:12:09 +0200 Message-Id: <20200717161212.10731-6-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org The new helper ring_insert_padding is split off from and then called by queue_cmd_ring. It inserts a padding if necessary. The new helper will in a further patch be used during writing of TMR notifications to command ring. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_user.c | 51 +++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 25c480fde9ee..7a27e838a7d3 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -926,6 +926,34 @@ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) return 0; } +static uint32_t ring_insert_padding(struct tcmu_dev *dev, size_t cmd_size) +{ + struct tcmu_cmd_entry_hdr *hdr; + struct tcmu_mailbox *mb = dev->mb_addr; + uint32_t cmd_head = mb->cmd_head % dev->cmdr_size; /* UAM */ + + /* Insert a PAD if end-of-ring space is too small */ + if (head_to_end(cmd_head, dev->cmdr_size) < cmd_size) { + size_t pad_size = head_to_end(cmd_head, dev->cmdr_size); + + hdr = (void *) mb + CMDR_OFF + cmd_head; + tcmu_hdr_set_op(&hdr->len_op, TCMU_OP_PAD); + tcmu_hdr_set_len(&hdr->len_op, pad_size); + hdr->cmd_id = 0; /* not used for PAD */ + hdr->kflags = 0; + hdr->uflags = 0; + tcmu_flush_dcache_range(hdr, sizeof(*hdr)); + + UPDATE_HEAD(mb->cmd_head, pad_size, dev->cmdr_size); + tcmu_flush_dcache_range(mb, sizeof(*mb)); + + cmd_head = mb->cmd_head % dev->cmdr_size; /* UAM */ + WARN_ON(cmd_head != 0); + } + + return cmd_head; +} + /** * queue_cmd_ring - queue cmd to ring or internally * @tcmu_cmd: cmd to queue @@ -941,7 +969,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; struct se_cmd *se_cmd = tcmu_cmd->se_cmd; size_t base_command_size, command_size; - struct tcmu_mailbox *mb; + struct tcmu_mailbox *mb = udev->mb_addr; struct tcmu_cmd_entry *entry; struct iovec *iov; int iov_cnt, cmd_id; @@ -980,8 +1008,6 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) if (!list_empty(&udev->qfull_queue)) goto queue; - mb = udev->mb_addr; - cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */ if ((command_size > (udev->cmdr_size / 2)) || data_length > udev->data_size) { pr_warn("TCMU: Request of size %zu/%zu is too big for %u/%zu " @@ -1001,24 +1027,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) goto queue; } - /* Insert a PAD if end-of-ring space is too small */ - if (head_to_end(cmd_head, udev->cmdr_size) < command_size) { - size_t pad_size = head_to_end(cmd_head, udev->cmdr_size); - - entry = (void *) mb + CMDR_OFF + cmd_head; - tcmu_hdr_set_op(&entry->hdr.len_op, TCMU_OP_PAD); - tcmu_hdr_set_len(&entry->hdr.len_op, pad_size); - entry->hdr.cmd_id = 0; /* not used for PAD */ - entry->hdr.kflags = 0; - entry->hdr.uflags = 0; - tcmu_flush_dcache_range(entry, sizeof(entry->hdr)); - - UPDATE_HEAD(mb->cmd_head, pad_size, udev->cmdr_size); - tcmu_flush_dcache_range(mb, sizeof(*mb)); - - cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */ - WARN_ON(cmd_head != 0); - } + cmd_head = ring_insert_padding(udev, command_size); entry = (void *) mb + CMDR_OFF + cmd_head; memset(entry, 0, command_size); From patchwork Fri Jul 17 16:12:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670661 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DFDBD1751 for ; Fri, 17 Jul 2020 16:12:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C7BD82076A for ; Fri, 17 Jul 2020 16:12:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="iuQJePin" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726736AbgGQQMr (ORCPT ); Fri, 17 Jul 2020 12:12:47 -0400 Received: from mail3.bemta25.messagelabs.com ([195.245.230.81]:50536 "EHLO mail3.bemta25.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727114AbgGQQMj (ORCPT ); Fri, 17 Jul 2020 12:12:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002355; i=@ts.fujitsu.com; bh=ovzdZWVboKUhNlzkplbxqJCfqX9OXFqspWfAsmRf0os=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=iuQJePinHJ9G2HP+zUL/tHPxJxxL3XOOIcPY5dw7VL+ewadL/g48yJgyDVYNsn6m4 xvmRQW56ar4aysKQhEXOeG/J0ahPLfT0CgNaUJ1N8hCrcSHWGsndWY1L1WYgfpywOX LvOLXx1rUQuNcW3d6/xh8BBQWJtqqTkI8YKQXfYaSIKEjjc+//l0En2DB99KnMx7QZ g54qcj1/mgASNWuQpCwudQu9512syY+ZZvkic8Z9BDNv2mS0KWwZvsRvJsMMax2I8X GKDxBHHoEcNHLXaoYG2wRERaZGmwWni1oAk8vEWRn8HddGr+LEBIOhmlDCh6oNRLLb A0vS+Z3VJgR/Q== Received: from [100.112.197.196] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-1.bemta.az-b.eu-west-1.aws.symcld.net id 33/50-01492-3FDC11F5; Fri, 17 Jul 2020 16:12:35 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRWlGSWpSXmKPExsViZ8MxVffzWcF 4g4WXpSy6r+9gs1h+/B+Txd9JN1gtWpe+ZXJg8fj49BaLx+dNcgFMUayZeUn5FQmsGT/mPWEt WKlacW2SYAPjYfkuRi4OIYHJjBLtS78yQTjTGSX2drxm7GLk5GATMJBYMek+C0hCRGANo8TKO /OYQRLMAnoS0/6tYwexhQV8Jc7dmM0CYrMIqErcPb2fDcTmFbCTOHxtPli9hIC8RMeByWA1nA L2ErO/HQRbIARU82DdW+YJjNwLGBlWMVokFWWmZ5TkJmbm6BoaGOgaGhrpGlpa6BoZmuolVuk m6aWW6panFpfoGuollhfrFVfmJuek6OWllmxiBIZJSsGx6zsYr77+oHeIUZKDSUmUt22VYLwQ X1J+SmVGYnFGfFFpTmrxIUYZDg4lCV7xU0A5waLU9NSKtMwcYMjCpCU4eJREeI3PAKV5iwsSc 4sz0yFSpxgVpcR5xUASAiCJjNI8uDZYnFxilJUS5mVkYGAQ4ilILcrNLEGVf8UozsGoJMwbBj KFJzOvBG76K6DFTECLN37mBVlckoiQkmpgYg7xTQmNuJ0+V8Bo1iVFPq6fN3laVbUSncPOduy 7I/e1+xJvEq+0euWjmr87maPaX693eZ98oOXdqtPHvJqeMrw0Lz9RpxC3eemF23nLpyum8JzN PNb6ur++RulPjTpfwQ7xz58ufCny5Q/M6bzq1x3wmo273MBF5PuD18y39b9d0fFMcBGarPaB9 avvVx62/7wfJBi38TpsiWZbncCTvuWV/7Joznv5z7u+aL2z4tuyXut8ft+/2cx37tps3uZg2K +jyX8zZOO+qd/UEsOiLBYk3doRvrM4JXQ654XDz9VfhxWe/XLYSEhCpkcq9KltbYBU93L2q4Z zdkSWeWU9bF8wZ5Mfz64j6pncN98osRRnJBpqMRcVJwIAAzK0kg4DAAA= X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-16.tower-285.messagelabs.com!1595002354!315561!1 X-Originating-IP: [62.60.8.149] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 20947 invoked from network); 17 Jul 2020 16:12:35 -0000 Received: from unknown (HELO mailhost2.uk.fujitsu.com) (62.60.8.149) by server-16.tower-285.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:35 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost2.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCTiX010089; Fri, 17 Jul 2020 17:12:29 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id 1C60F208F1; Fri, 17 Jul 2020 18:12:21 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 6/8] scsi: target: tcmu: Fix and simplify timeout handling Date: Fri, 17 Jul 2020 18:12:10 +0200 Message-Id: <20200717161212.10731-7-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org During cmd timeout handling in check_timedout_devices() due to a race it can happen, that tcmu_set_next_deadline() does not start a timer as expected: 1) Either tcmu_check_expired_ring_cmd() checks the inflight_queue or tcmu_check_expired_queue_cmd() checks the qfull_queue while jiffies has the value X 2) At the end of the check the queue contains one remaining command with deadline X (time_after(X, X) is false and thus the command is not handled as being timed out). 3) After tcmu_check_expired_xxxxx_cmd() a timer interrupt happens and jiffies is incremented to X+1. 4) Now tcmu_set_next_deadline() is called, but it skips the command, since time_after(X+1, X) is true. Therefore tcmu_set_next_deadline() finds no new deadline and stops the timer, which it shouldn't. Since commands that time out are removed from inflight_queue or qfull_queue, we don't need the check with time_after() in tcmu_set_next_deadline(), but can use the deadline from the first cmd in the queue. Additionally I replaced the remaining time_after() calls in tcmu_check_expired_xxxxx_cmd() with time_after_eq(), because it is not useful to set the timeout to deadline, but then check for jiffies being greater than deadline. Next I simplified the end of tcmu_handle_completions() and changed the check for no more pending commands from "mb->cmd_tail == mb->cmd_head" to "idr_is_empty(&udev->commands)" because the old check doesn't work correctly if paddings or in the future TMRs are in the ring. Finally tcmu_set_next_deadline() was shifted in the source as preparation for later implementation of tmr_notify callback. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_user.c | 59 +++++++++++++++------------------------ 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 7a27e838a7d3..6adf4e7cc00b 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -1129,6 +1129,18 @@ tcmu_queue_cmd(struct se_cmd *se_cmd) return scsi_ret; } +static void tcmu_set_next_deadline(struct list_head *queue, + struct timer_list *timer) +{ + struct tcmu_cmd *cmd; + + if (!list_empty(queue)) { + cmd = list_first_entry(queue, struct tcmu_cmd, queue_entry); + mod_timer(timer, cmd->deadline); + } else + del_timer(timer); +} + static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry *entry) { struct se_cmd *se_cmd = cmd->se_cmd; @@ -1196,25 +1208,6 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * tcmu_free_cmd(cmd); } -static void tcmu_set_next_deadline(struct list_head *queue, - struct timer_list *timer) -{ - struct tcmu_cmd *tcmu_cmd, *tmp_cmd; - unsigned long deadline = 0; - - list_for_each_entry_safe(tcmu_cmd, tmp_cmd, queue, queue_entry) { - if (!time_after(jiffies, tcmu_cmd->deadline)) { - deadline = tcmu_cmd->deadline; - break; - } - } - - if (deadline) - mod_timer(timer, deadline); - else - del_timer(timer); -} - static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) { struct tcmu_mailbox *mb; @@ -1267,22 +1260,16 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) handled++; } - if (mb->cmd_tail == mb->cmd_head) { - /* no more pending commands */ - del_timer(&udev->cmd_timer); - - if (list_empty(&udev->qfull_queue)) { - /* - * no more pending or waiting commands so try to - * reclaim blocks if needed. - */ - if (atomic_read(&global_db_count) > - tcmu_global_max_blocks) - schedule_delayed_work(&tcmu_unmap_work, 0); - } - } else if (udev->cmd_time_out) { - tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); + if (atomic_read(&global_db_count) > tcmu_global_max_blocks && + idr_is_empty(&udev->commands) && list_empty(&udev->qfull_queue)) { + /* + * Allocated blocks exceeded global block limit, currently no + * more pending or waiting commands so try to reclaim blocks. + */ + schedule_delayed_work(&tcmu_unmap_work, 0); } + if (udev->cmd_time_out) + tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); return handled; } @@ -1291,7 +1278,7 @@ static void tcmu_check_expired_ring_cmd(struct tcmu_cmd *cmd) { struct se_cmd *se_cmd; - if (!time_after(jiffies, cmd->deadline)) + if (!time_after_eq(jiffies, cmd->deadline)) return; set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags); @@ -1310,7 +1297,7 @@ static void tcmu_check_expired_queue_cmd(struct tcmu_cmd *cmd) { struct se_cmd *se_cmd; - if (!time_after(jiffies, cmd->deadline)) + if (!time_after_eq(jiffies, cmd->deadline)) return; pr_debug("Timing out queued cmd %p on dev %s.\n", From patchwork Fri Jul 17 16:12:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670653 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A756460D for ; Fri, 17 Jul 2020 16:12:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8505D2074B for ; Fri, 17 Jul 2020 16:12:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="mwER2bHz" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727115AbgGQQMl (ORCPT ); Fri, 17 Jul 2020 12:12:41 -0400 Received: from mail1.bemta26.messagelabs.com ([85.158.142.5]:14512 "EHLO mail1.bemta26.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727080AbgGQQMj (ORCPT ); Fri, 17 Jul 2020 12:12:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002352; i=@ts.fujitsu.com; bh=etaPAAtcvspSMIpJap9NcyDtpC2sASnat67ZKKkgKnM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=mwER2bHzQUOfDerqDdV+0nJtUakzNEp0VDmFz8R8f34xFk/egO8b6MrHqYHuRqj6W vcqkqu+EpWm2bSn+zzNJGbG0UqsfIbY0FATXOVLX27eFZMxTSflx11oN156q4Lr7+q r0v7AVHUM+WmGMJXtBW2knEENfb0g/qD3BEtsdlNcjU4/4+V4FxODf7Up/KImlXN3z g2c4eOjLpliEd5ONXtXghjEVEi4PToVnyE+eSgnA8YLw6Rf1AO9R6mYF8Z8cuQn2NB 9qUJVDoBmDuhkbohooVnqQ7MuFz9uE7c5y0r5wuRc+plOCNv+xzWsDnHJN+8rZkYtE cLajVr08UvIFw== Received: from [100.113.2.186] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-5.bemta.az-a.eu-central-1.aws.symcld.net id 1F/5E-13954-0FDC11F5; Fri, 17 Jul 2020 16:12:32 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupgkeJIrShJLcpLzFFi42Kxs+GYovvhrGC 8wbJHfBbd13ewWSw//o/J4u+kG6wWrUvfMjmweHx8eovF4/MmuQCmKNbMvKT8igTWjAV317AV vE+v+NT+jrGB8Vd4FyMXh5DAZEaJV2vesUI40xkl2jresHUxcnKwCRhIrJh0nwUkISKwhlFi5 Z15zCAJZgE9iWn/1rGD2MICnhIt308D2RwcLAKqEtcPmYOEeQXsJH7eawcrlxCQl+g4MJkFxO YUsJeY/e0gI4gtBFTzYN1b5gmM3AsYGVYxWiYVZaZnlOQmZuboGhoY6BoaGusa6hoZm+klVuk m6qWW6ian5pUUJQJl9RLLi/WKK3OTc1L08lJLNjECAyWlkPHNDsavrz/oHWKU5GBSEuVtWyUY L8SXlJ9SmZFYnBFfVJqTWnyIUYaDQ0mCV/wUUE6wKDU9tSItMwcYtDBpCQ4eJRFe4zNAad7ig sTc4sx0iNQpRl2OzXOXLmIWYsnLz0uVEucVAykSACnKKM2DGwGLoEuMslLCvIwMDAxCPAWpRb mZJajyrxjFORiVhHnDQKbwZOaVwG16BXQEE9ARGz/zghxRkoiQkmpgCnn+8ceCfle9R8mzjNT Ed6UxK8kWr829Vbcmp+mpwYY9Fl2vLvV0Xn/02WZrZ6xe9i0Nj9RlBS67J+r+Xqlod+7i07yI VuEPD376cpd6mC1M8RH9bLt59qFAHX+LfItNFYEzvkdMXywi9FC1k3WRxG4B4c1zaqIamRduO ap3eddVcZGVCzOzt/x/bb83LrG2MvjSJrW/i6a/jy879lup7nPeeq0H30rKpB+FGvYtXzFfT/ 1ZU+8M+xkf/NY2rHsycc+L7RPL3XK296ntT9w9XzEm+A+LpmkY0NTZ7CXe38SZf2mxhsrsfNB y6UWbumZlvf69Yy/XnDywpYC50aLU7d61VCbl00yqJmcmuf1TYinOSDTUYi4qTgQAFZxpiRsD AAA= X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-20.tower-228.messagelabs.com!1595002351!893414!1 X-Originating-IP: [62.60.8.148] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 16971 invoked from network); 17 Jul 2020 16:12:32 -0000 Received: from unknown (HELO mailhost1.uk.fujitsu.com) (62.60.8.148) by server-20.tower-228.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:32 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost1.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCT3Q029024; Fri, 17 Jul 2020 17:12:29 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id 28F0F208F7; Fri, 17 Jul 2020 18:12:21 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 7/8] scsi: target: tcmu: Implement tmr_notify callback Date: Fri, 17 Jul 2020 18:12:11 +0200 Message-Id: <20200717161212.10731-8-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org This patch implements the tmr_notify callback for tcmu. When the callback is called, tcmu checks the list of aborted commands it received as parameter: - aborted commands in the qfull_queue are removed from the queue and target_complete_command is called - from the cmd_ids of aborted commands currently uncompleted in cmd ring it creates a list of aborted cmd_ids. Finally a TMR notification is written to cmd ring containing TMR type and cmd_id list. If there is no space in ring, the TMR notification is queued on a TMR specific queue. The TMR specific queue 'tmr_queue' can be seen as a extension of the cmd ring. At the end of each iexecution of tcmu_complete_commands() we check, whether tmr_queue contains TMRs and try to move them onto the ring. If tmr_queue is not empty after that, we don't call run_qfull_queue() because commands must not overtake TMRs. Operating that way we guarantee that cmd_ids in TMR notification received by userspace either match an active, not yet completed command or are no longer valid due to userspace having complete some cmd_ids meanwhile. New commands that were assigned to an aborted cmd_id will always appear on the cmd ring _after_ the TMR. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_user.c | 225 ++++++++++++++++++++++++++++++++-- include/uapi/linux/target_core_user.h | 25 ++++ 2 files changed, 241 insertions(+), 9 deletions(-) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 6adf4e7cc00b..92b7a2e84e64 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -137,6 +137,7 @@ struct tcmu_dev { struct mutex cmdr_lock; struct list_head qfull_queue; + struct list_head tmr_queue; uint32_t dbi_max; uint32_t dbi_thresh; @@ -183,6 +184,15 @@ struct tcmu_cmd { #define TCMU_CMD_BIT_EXPIRED 0 unsigned long flags; }; + +struct tcmu_tmr { + struct list_head queue_entry; + + uint8_t tmr_type; + uint32_t tmr_cmd_cnt; + int16_t tmr_cmd_ids[0]; +}; + /* * To avoid dead lock the mutex lock order should always be: * @@ -844,6 +854,9 @@ static bool is_ring_space_avail(struct tcmu_dev *udev, struct tcmu_cmd *cmd, return false; } + if (!data_needed) + return true; + /* try to check and get the data blocks as needed */ space = spc_bitmap_free(udev->data_bitmap, udev->dbi_thresh); if ((space * DATA_BLOCK_SIZE) < data_needed) { @@ -1106,6 +1119,60 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) return 1; } +/** + * queue_tmr_ring - queue tmr info to ring or internally + * @dev: related tcmu_dev + * @tmr: tcmu_tmr containing tmr info to queue + * + * Returns: + * 0 success + * 1 internally queued to wait for ring memory to free. + */ +static int +queue_tmr_ring(struct tcmu_dev *dev, struct tcmu_tmr *tmr) +{ + struct tcmu_tmr_entry *entry; + int cmd_size; + int id_list_sz; + struct tcmu_mailbox *mb = dev->mb_addr; + uint32_t cmd_head; + + if (test_bit(TCMU_DEV_BIT_BROKEN, &dev->flags)) + goto out_free; + + id_list_sz = sizeof(tmr->tmr_cmd_ids[0]) * tmr->tmr_cmd_cnt; + cmd_size = round_up(sizeof(*entry) + id_list_sz, TCMU_OP_ALIGN_SIZE); + + if (!list_empty(&dev->tmr_queue) || + !is_ring_space_avail(dev, NULL, cmd_size, 0)) { + list_add_tail(&tmr->queue_entry, &dev->tmr_queue); + pr_debug("adding tmr %p on dev %s to TMR ring space wait queue\n", + tmr, dev->name); + return 1; + } + + cmd_head = ring_insert_padding(dev, cmd_size); + + entry = (void *)mb + CMDR_OFF + cmd_head; + memset(entry, 0, cmd_size); + tcmu_hdr_set_op(&entry->hdr.len_op, TCMU_OP_TMR); + tcmu_hdr_set_len(&entry->hdr.len_op, cmd_size); + entry->tmr_type = tmr->tmr_type; + entry->cmd_cnt = tmr->tmr_cmd_cnt; + memcpy(&entry->cmd_ids[0], &tmr->tmr_cmd_ids[0], id_list_sz); + tcmu_flush_dcache_range(entry, cmd_size); + + UPDATE_HEAD(mb->cmd_head, cmd_size, dev->cmdr_size); + tcmu_flush_dcache_range(mb, sizeof(*mb)); + + uio_event_notify(&dev->uio_info); + +out_free: + kfree(tmr); + + return 0; +} + static sense_reason_t tcmu_queue_cmd(struct se_cmd *se_cmd) { @@ -1141,6 +1208,85 @@ static void tcmu_set_next_deadline(struct list_head *queue, del_timer(timer); } +static int +tcmu_tmr_type(enum tcm_tmreq_table tmf) +{ + switch (tmf) { + case TMR_ABORT_TASK: return TCMU_TMR_ABORT_TASK; + case TMR_ABORT_TASK_SET: return TCMU_TMR_ABORT_TASK_SET; + case TMR_CLEAR_ACA: return TCMU_TMR_CLEAR_ACA; + case TMR_CLEAR_TASK_SET: return TCMU_TMR_CLEAR_TASK_SET; + case TMR_LUN_RESET: return TCMU_TMR_LUN_RESET; + case TMR_TARGET_WARM_RESET: return TCMU_TMR_TARGET_WARM_RESET; + case TMR_TARGET_COLD_RESET: return TCMU_TMR_TARGET_COLD_RESET; + case TMR_LUN_RESET_PRO: return TCMU_TMR_LUN_RESET_PRO; + default: return TCMU_TMR_UNKNOWN; + } +} + +static void +tcmu_tmr_notify(struct se_device *se_dev, enum tcm_tmreq_table tmf, + struct list_head *cmd_list) +{ + int i = 0, cmd_cnt = 0; + bool unqueued = false; + uint16_t *cmd_ids = NULL; + struct tcmu_cmd *cmd; + struct se_cmd *se_cmd; + struct tcmu_tmr *tmr; + struct tcmu_dev *dev = TCMU_DEV(se_dev); + + mutex_lock(&dev->cmdr_lock); + + /* First we check for aborted commands in qfull_queue */ + list_for_each_entry(se_cmd, cmd_list, state_list) { + i++; + if (!se_cmd->priv) + continue; + cmd = se_cmd->priv; + /* Commands on qfull queue have no id yet */ + if (cmd->cmd_id) { + cmd_cnt++; + continue; + } + pr_debug("Removing aborted command %p from queue on dev %s.\n", + cmd, dev->name); + + list_del_init(&cmd->queue_entry); + tcmu_free_cmd(cmd); + target_complete_cmd(se_cmd, SAM_STAT_TASK_ABORTED); + unqueued = true; + } + if (unqueued) + tcmu_set_next_deadline(&dev->qfull_queue, &dev->qfull_timer); + + pr_debug("TMR event %d on dev %s, aborted cmds %d, afflicted cmd_ids %d\n", + tcmu_tmr_type(tmf), dev->name, i, cmd_cnt); + + tmr = kmalloc(sizeof(*tmr) + cmd_cnt * sizeof(*cmd_ids), GFP_KERNEL); + if (!tmr) + goto unlock; + + tmr->tmr_type = tcmu_tmr_type(tmf); + tmr->tmr_cmd_cnt = cmd_cnt; + + if (cmd_cnt != 0) { + cmd_cnt = 0; + list_for_each_entry(se_cmd, cmd_list, state_list) { + if (!se_cmd->priv) + continue; + cmd = se_cmd->priv; + if (cmd->cmd_id) + tmr->tmr_cmd_ids[cmd_cnt++] = cmd->cmd_id; + } + } + + queue_tmr_ring(dev, tmr); + +unlock: + mutex_unlock(&dev->cmdr_lock); +} + static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry *entry) { struct se_cmd *se_cmd = cmd->se_cmd; @@ -1208,11 +1354,43 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * tcmu_free_cmd(cmd); } +static int tcmu_run_tmr_queue(struct tcmu_dev *dev) +{ + struct tcmu_tmr *tmr, *tmp; + LIST_HEAD(tmrs); + + if (list_empty(&dev->tmr_queue)) + return 1; + + pr_debug("running %s's tmr queue\n", dev->name); + + list_splice_init(&dev->tmr_queue, &tmrs); + + list_for_each_entry_safe(tmr, tmp, &tmrs, queue_entry) { + list_del_init(&tmr->queue_entry); + + pr_debug("removing tmr %p on dev %s from queue\n", + tmr, dev->name); + + if (queue_tmr_ring(dev, tmr)) { + pr_debug("ran out of space during tmr queue run\n"); + /* + * tmr was requeued, so just put all tmrs back in + * the queue + */ + list_splice_tail(&tmrs, &dev->tmr_queue); + return 0; + } + } + + return 1; +} + static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) { struct tcmu_mailbox *mb; struct tcmu_cmd *cmd; - int handled = 0; + bool free_space = false; if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags)) { pr_err("ring broken, not handling completions\n"); @@ -1235,7 +1413,10 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) tcmu_flush_dcache_range(entry, ring_left < sizeof(*entry) ? ring_left : sizeof(*entry)); - if (tcmu_hdr_get_op(entry->hdr.len_op) == TCMU_OP_PAD) { + free_space = true; + + if (tcmu_hdr_get_op(entry->hdr.len_op) == TCMU_OP_PAD || + tcmu_hdr_get_op(entry->hdr.len_op) == TCMU_OP_TMR) { UPDATE_HEAD(udev->cmdr_last_cleaned, tcmu_hdr_get_len(entry->hdr.len_op), udev->cmdr_size); @@ -1256,9 +1437,9 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) UPDATE_HEAD(udev->cmdr_last_cleaned, tcmu_hdr_get_len(entry->hdr.len_op), udev->cmdr_size); - - handled++; } + if (free_space) + free_space = tcmu_run_tmr_queue(udev); if (atomic_read(&global_db_count) > tcmu_global_max_blocks && idr_is_empty(&udev->commands) && list_empty(&udev->qfull_queue)) { @@ -1271,7 +1452,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) if (udev->cmd_time_out) tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); - return handled; + return free_space; } static void tcmu_check_expired_ring_cmd(struct tcmu_cmd *cmd) @@ -1381,6 +1562,7 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name) INIT_LIST_HEAD(&udev->node); INIT_LIST_HEAD(&udev->timedout_entry); INIT_LIST_HEAD(&udev->qfull_queue); + INIT_LIST_HEAD(&udev->tmr_queue); INIT_LIST_HEAD(&udev->inflight_queue); idr_init(&udev->commands); @@ -1455,8 +1637,8 @@ static int tcmu_irqcontrol(struct uio_info *info, s32 irq_on) struct tcmu_dev *udev = container_of(info, struct tcmu_dev, uio_info); mutex_lock(&udev->cmdr_lock); - tcmu_handle_completions(udev); - run_qfull_queue(udev, false); + if (tcmu_handle_completions(udev)) + run_qfull_queue(udev, false); mutex_unlock(&udev->cmdr_lock); return 0; @@ -1609,6 +1791,16 @@ static void tcmu_blocks_release(struct radix_tree_root *blocks, } } +static void tcmu_remove_all_queued_tmr(struct tcmu_dev *dev) +{ + struct tcmu_tmr *tmr, *tmp; + + list_for_each_entry_safe(tmr, tmp, &dev->tmr_queue, queue_entry) { + list_del_init(&tmr->queue_entry); + kfree(tmr); + } +} + static void tcmu_dev_kref_release(struct kref *kref) { struct tcmu_dev *udev = container_of(kref, struct tcmu_dev, kref); @@ -1631,6 +1823,8 @@ static void tcmu_dev_kref_release(struct kref *kref) if (tcmu_check_and_free_pending_cmd(cmd) != 0) all_expired = false; } + /* There can be left over TMR cmds. Remove them. */ + tcmu_remove_all_queued_tmr(udev); if (!list_empty(&udev->qfull_queue)) all_expired = false; idr_destroy(&udev->commands); @@ -1885,7 +2079,9 @@ static int tcmu_configure_device(struct se_device *dev) /* Initialise the mailbox of the ring buffer */ mb = udev->mb_addr; mb->version = TCMU_MAILBOX_VERSION; - mb->flags = TCMU_MAILBOX_FLAG_CAP_OOOC | TCMU_MAILBOX_FLAG_CAP_READ_LEN; + mb->flags = TCMU_MAILBOX_FLAG_CAP_OOOC | + TCMU_MAILBOX_FLAG_CAP_READ_LEN | + TCMU_MAILBOX_FLAG_CAP_TMR; mb->cmdr_off = CMDR_OFF; mb->cmdr_size = udev->cmdr_size; @@ -2055,6 +2251,15 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) del_timer(&udev->cmd_timer); + /* + * ring is empty and qfull queue never contains aborted commands. + * So TMRs in tmr queue do not contain relevant cmd_ids. + * After a ring reset userspace should do a fresh start, so + * even LUN RESET message is no longer relevant. + * Therefore remove all TMRs from qfull queue + */ + tcmu_remove_all_queued_tmr(udev); + run_qfull_queue(udev, false); mutex_unlock(&udev->cmdr_lock); @@ -2607,6 +2812,7 @@ static struct target_backend_ops tcmu_ops = { .destroy_device = tcmu_destroy_device, .free_device = tcmu_free_device, .parse_cdb = tcmu_parse_cdb, + .tmr_notify = tcmu_tmr_notify, .set_configfs_dev_params = tcmu_set_configfs_dev_params, .show_configfs_dev_params = tcmu_show_configfs_dev_params, .get_device_type = sbc_get_device_type, @@ -2633,7 +2839,8 @@ static void find_free_blocks(void) } /* Try to complete the finished commands first */ - tcmu_handle_completions(udev); + if (tcmu_handle_completions(udev)) + run_qfull_queue(udev, false); /* Skip the udevs in idle */ if (!udev->dbi_thresh) { diff --git a/include/uapi/linux/target_core_user.h b/include/uapi/linux/target_core_user.h index b7b57967d90f..95b1597f16ae 100644 --- a/include/uapi/linux/target_core_user.h +++ b/include/uapi/linux/target_core_user.h @@ -45,6 +45,7 @@ #define ALIGN_SIZE 64 /* Should be enough for most CPUs */ #define TCMU_MAILBOX_FLAG_CAP_OOOC (1 << 0) /* Out-of-order completions */ #define TCMU_MAILBOX_FLAG_CAP_READ_LEN (1 << 1) /* Read data length */ +#define TCMU_MAILBOX_FLAG_CAP_TMR (1 << 2) /* TMR notifications */ struct tcmu_mailbox { __u16 version; @@ -62,6 +63,7 @@ struct tcmu_mailbox { enum tcmu_opcode { TCMU_OP_PAD = 0, TCMU_OP_CMD, + TCMU_OP_TMR, }; /* @@ -128,6 +130,29 @@ struct tcmu_cmd_entry { } __packed; +struct tcmu_tmr_entry { + struct tcmu_cmd_entry_hdr hdr; + +#define TCMU_TMR_UNKNOWN 0 +#define TCMU_TMR_ABORT_TASK 1 +#define TCMU_TMR_ABORT_TASK_SET 2 +#define TCMU_TMR_CLEAR_ACA 3 +#define TCMU_TMR_CLEAR_TASK_SET 4 +#define TCMU_TMR_LUN_RESET 5 +#define TCMU_TMR_TARGET_WARM_RESET 6 +#define TCMU_TMR_TARGET_COLD_RESET 7 +/* Pseudo reset due to received PR OUT */ +#define TCMU_TMR_LUN_RESET_PRO 128 + __u8 tmr_type; + + __u8 __pad1; + __u16 __pad2; + __u32 cmd_cnt; + __u64 __pad3; + __u64 __pad4; + __u16 cmd_ids[0]; +} __packed; + #define TCMU_OP_ALIGN_SIZE sizeof(__u64) enum tcmu_genl_cmd { From patchwork Fri Jul 17 16:12:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bodo Stroesser X-Patchwork-Id: 11670631 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B8A3013B6 for ; Fri, 17 Jul 2020 16:12:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A0F5F2074B for ; Fri, 17 Jul 2020 16:12:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=ts.fujitsu.com header.i=@ts.fujitsu.com header.b="PB0C8Z3q" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726633AbgGQQMf (ORCPT ); Fri, 17 Jul 2020 12:12:35 -0400 Received: from mail1.bemta26.messagelabs.com ([85.158.142.3]:13165 "EHLO mail1.bemta26.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726715AbgGQQMe (ORCPT ); Fri, 17 Jul 2020 12:12:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ts.fujitsu.com; s=200619tsfj; t=1595002351; i=@ts.fujitsu.com; bh=dZhFODA67iOeAY5hp0b1fuqO9uOJIOpZU4v8VMP7G3s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=PB0C8Z3qNTg2TGIz1jNZ3yWbcVE/5yzTYPtfkISg712X/N7HzEblNovOHbYz568W9 bhbP8sPLNonsjZienPKPwJ4hF3QNZ5JW2XgJzf7IF2hESYWvoXuVtqx5aDjPr21CpD 0+rbE/Lj3hEqiqKrhulyDIxD77glWtr8TmxZgakoUdp34hBY5zKp3txy2j3MtthkEr XPK88Retm4aU93LY9UW4eBNStjTsd3RYnZO5HBd9oetXSQ5n+lXZfiiM/BZdpkAB7t gTawVJGtwcr8bH2Y7Ec7FiQYwrVN0RcuzQSE2atDNNUJ8Q5cbmAb4G5EVgc1Gbmp5X b2zo7jcnPRcYw== Received: from [100.113.2.186] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-3.bemta.az-a.eu-central-1.aws.symcld.net id C0/57-21639-EEDC11F5; Fri, 17 Jul 2020 16:12:30 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRWlGSWpSXmKPExsViZ8MRovvurGC 8QXu/nEX39R1sFsuP/2Oy+DvpBqtF69K3TA4sHh+f3mLx+LxJLoApijUzLym/IoE14/9NmYL/ IhUPlh1ibWCcLNTFyMUhJDCZUeLZubssEM50Rom/77cydTFycrAJGEismHQfLCEisIZRYuWde cwgCWYBPYlp/9axg9jCAl4Sb59tYu1i5OBgEVCV+H0nHiTMK2An0f5rJ1i5hIC8RMeBySwgNq eAvcTsbwcZQWwhoJoH694yT2DkXsDIsIrRMqkoMz2jJDcxM0fX0MBA19DQWBdIGhvoJVbpJuq lluomp+aVFCUCZfUSy4v1iitzk3NS9PJSSzYxAsMkpZChaQfju1cf9A4xSnIwKYnytq0SjBfi S8pPqcxILM6ILyrNSS0+xCjDwaEkwSt+CignWJSanlqRlpkDDFmYtAQHj5IIr/EZoDRvcUFib nFmOkTqFKOilDivGEhCACSRUZoH1waLk0uMslLCvIwMDAxCPAWpRbmZJajyrxjFORiVhHnDQK bwZOaVwE1/BbSYCWjxxs+8IItLEhFSUg1MMw4dnf/8943bTz6kTeiZIctZ8FKhqM1icU6qp7H UirV+lxbGndYyfWW6mmmufOpsMcbuldsCz53XVJw7W2377M9Hc6IEf1ou6Pp3R/oX48f/R1w0 HOdYZt8L7tFpPPBVbpm2xap9k5Rb83V1n3QtCr/ZZLCxaXY3W8/Frotf7t/06N6SHXPt1ZtXR 6XbxE4XnTmeWaR6u/iVeP4pTcWLC4M3mnka/M1eOafUfYO11zXnlUeeXZxpGluqselMhMCbYw fPMhmrmThNXsvv//PoJMbmDQ5nglvfLyr5ry2s1uZ92u7BYk/ZvntcyaGbJ++8pmcyqyUxas2 ZoMXbNtSneax4kuYm37MituF6/5wTn5VYijMSDbWYi4oTAeVcYtQOAwAA X-Env-Sender: bstroesser@ts.fujitsu.com X-Msg-Ref: server-34.tower-232.messagelabs.com!1595002349!1121731!1 X-Originating-IP: [62.60.8.84] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.50.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 18996 invoked from network); 17 Jul 2020 16:12:30 -0000 Received: from unknown (HELO mailhost3.uk.fujitsu.com) (62.60.8.84) by server-34.tower-232.messagelabs.com with ECDHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Jul 2020 16:12:30 -0000 Received: from x-serv01 ([172.17.38.52]) by mailhost3.uk.fujitsu.com (8.14.5/8.14.5) with SMTP id 06HGCTom009897; Fri, 17 Jul 2020 17:12:29 +0100 Received: from VTC.emeia.fujitsu.local (unknown [172.17.38.7]) by x-serv01 (Postfix) with ESMTP id 37A6120918; Fri, 17 Jul 2020 18:12:21 +0200 (CEST) From: Bodo Stroesser To: "Martin K. Petersen" , Mike Christie , linux-scsi@vger.kernel.org, target-devel@vger.kernel.org Cc: Bodo Stroesser Subject: [PATCH v2 8/8] scsi: target: tcmu: Make TMR notification optional Date: Fri, 17 Jul 2020 18:12:12 +0200 Message-Id: <20200717161212.10731-9-bstroesser@ts.fujitsu.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> References: <20200717161212.10731-1-bstroesser@ts.fujitsu.com> Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org Add "tmr_notification" configFS attribute to tcmu devices. If default value 0 of the attribute is used, tcmu only removes aborted commands from qfull_queue. If user changes tmr_notification to 1, additionally TMR notifications will be written to the cmd ring. Signed-off-by: Bodo Stroesser --- drivers/target/target_core_user.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 92b7a2e84e64..95e66b707373 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -118,6 +118,7 @@ struct tcmu_dev { #define TCMU_DEV_BIT_OPEN 0 #define TCMU_DEV_BIT_BROKEN 1 #define TCMU_DEV_BIT_BLOCKED 2 +#define TCMU_DEV_BIT_TMR_NOTIFY 3 unsigned long flags; struct uio_info uio_info; @@ -1260,6 +1261,9 @@ tcmu_tmr_notify(struct se_device *se_dev, enum tcm_tmreq_table tmf, if (unqueued) tcmu_set_next_deadline(&dev->qfull_queue, &dev->qfull_timer); + if (!test_bit(TCMU_DEV_BIT_TMR_NOTIFY, &dev->flags)) + goto unlock; + pr_debug("TMR event %d on dev %s, aborted cmds %d, afflicted cmd_ids %d\n", tcmu_tmr_type(tmf), dev->name, i, cmd_cnt); @@ -2706,6 +2710,40 @@ static ssize_t tcmu_emulate_write_cache_store(struct config_item *item, } CONFIGFS_ATTR(tcmu_, emulate_write_cache); +static ssize_t tcmu_tmr_notification_show(struct config_item *item, + char *page) +{ + struct se_dev_attrib *da = container_of(to_config_group(item), + struct se_dev_attrib, da_group); + struct tcmu_dev *dev = TCMU_DEV(da->da_dev); + + return snprintf(page, PAGE_SIZE, "%i\n", + test_bit(TCMU_DEV_BIT_TMR_NOTIFY, &dev->flags)); +} + +static ssize_t tcmu_tmr_notification_store(struct config_item *item, + const char *page, size_t count) +{ + struct se_dev_attrib *da = container_of(to_config_group(item), + struct se_dev_attrib, da_group); + struct tcmu_dev *dev = TCMU_DEV(da->da_dev); + u8 val; + int ret; + + ret = kstrtou8(page, 0, &val); + if (ret < 0) + return ret; + if (val > 1) + return -EINVAL; + + if (val) + set_bit(TCMU_DEV_BIT_TMR_NOTIFY, &dev->flags); + else + clear_bit(TCMU_DEV_BIT_TMR_NOTIFY, &dev->flags); + return count; +} +CONFIGFS_ATTR(tcmu_, tmr_notification); + static ssize_t tcmu_block_dev_show(struct config_item *item, char *page) { struct se_device *se_dev = container_of(to_config_group(item), @@ -2787,6 +2825,7 @@ static struct configfs_attribute *tcmu_attrib_attrs[] = { &tcmu_attr_dev_config, &tcmu_attr_dev_size, &tcmu_attr_emulate_write_cache, + &tcmu_attr_tmr_notification, &tcmu_attr_nl_reply_supported, NULL, };