From patchwork Mon Jul 10 07:06:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyijing X-Patchwork-Id: 107279 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp3039704qge; Mon, 10 Jul 2017 00:04:42 -0700 (PDT) X-Received: by 10.98.64.7 with SMTP id n7mr42400647pfa.76.1499670282279; Mon, 10 Jul 2017 00:04:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499670282; cv=none; d=google.com; s=arc-20160816; b=Gv4T4lq3o/jkT20l1iiOQUvH7jOfhYU18GG0ZRPFwNZ5CJaojkaaEfjzKtVSIEl9/Z YYsdaB0dmY/24MMZgIZVoik9O30LWcGuZp+eU1dMe/pZWPiXrWndHj9cAz57MAi18lpB IIWFLKOiad3g/eDhzAsjrQzlbtQfTe36YXZztdWLtXTlxGJpoe3PzSqmVS6IXgvpx5cm TRs0Qfp33CcTFHrt4HG/KS+f+Ff0K/CiGsFE8QHxGRr8L7EY1LjqKqRy9pNvI1mblp5F oMbYjBdLOqvlI0NVVW+IA+ERHcqVh16b+9jzWTI9WDj9mKwOmeRp/cMc+qHx3Fq0v4Jm fldA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=b4HlrVvyjsm9+uUWaI+xmwoJ8FXvNT1OWH8+jgZwwlM=; b=Wp3H5Sh/puws6ZeVSeoGXJZy+i9snQtvyi2MRxO1yeZBoNqCcF9zdGOxfnCh3XHZGn dy8OiZ5luIbj1HfuGAXBMI6t0ILM6afjdmWL34IjrLEzl0Zy3dCdyTdfa3zZr83cyKNA RBWUEE1D+qx1E3QnxLhFT0FzQo4WzValAnGSrwLu4gdq240AOYwPpaB8PUHDsmr9Al1n glEs8A7g1+dgezPLGlywikGJy/bN4k7YceLH02rDVzFBfZiBYCu+6YgYJwT+oxAnGrt7 cYB0Fc7Zn0zLczz+dIOAHTCeLTg8NYKXcI3Htmuz/gdWhjvHjJ5WzSMxGyn8jglIDc0g 30Ew== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n189si4499168pgn.110.2017.07.10.00.04.42; Mon, 10 Jul 2017 00:04:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753490AbdGJHDe (ORCPT + 1 other); Mon, 10 Jul 2017 03:03:34 -0400 Received: from szxga01-in.huawei.com ([45.249.212.187]:9295 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751130AbdGJHCV (ORCPT ); Mon, 10 Jul 2017 03:02:21 -0400 Received: from 172.30.72.54 (EHLO dggeml406-hub.china.huawei.com) ([172.30.72.54]) by dggrg01-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id ARU37597; Mon, 10 Jul 2017 15:02:11 +0800 (CST) Received: from 138.huawei.com (10.175.124.28) by dggeml406-hub.china.huawei.com (10.3.17.50) with Microsoft SMTP Server id 14.3.301.0; Mon, 10 Jul 2017 15:02:03 +0800 From: Yijing Wang To: , CC: , , , , , , , , , , , , , , , , , , , Yijing Wang Subject: [PATCH v3 2/7] libsas: remove unused port_gone_completion Date: Mon, 10 Jul 2017 15:06:04 +0800 Message-ID: <1499670369-44143-3-git-send-email-wangyijing@huawei.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> References: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.124.28] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.59632673.0189, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: a29e048e2256d90e14030923eb2d8253 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org No one uses the port_gone_completion in struct asd_sas_port, clean it out. Signed-off-by: Yijing Wang --- include/scsi/libsas.h | 2 -- 1 file changed, 2 deletions(-) -- 2.5.0 diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index c41328d..628f48b 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -263,8 +263,6 @@ struct sas_discovery { /* The port struct is Class:RW, driver:RO */ struct asd_sas_port { /* private: */ - struct completion port_gone_completion; - struct sas_discovery disc; struct domain_device *port_dev; spinlock_t dev_list_lock; From patchwork Mon Jul 10 07:06:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyijing X-Patchwork-Id: 107274 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp3037717qge; Mon, 10 Jul 2017 00:02:23 -0700 (PDT) X-Received: by 10.84.128.103 with SMTP id 94mr16345296pla.234.1499670143742; Mon, 10 Jul 2017 00:02:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499670143; cv=none; d=google.com; s=arc-20160816; b=iY1LzDr94ZKAKLgpj2LMlOEjkuCYnGDCviMiqeMvvQgptGqDenWIcG/wZMtvugzXUs xeKSKV4eEvLoPH2bVpj5IVJlNM8djwZ9tnHdgOyUfWIzALbL+jDSCY2NQMtMxhhZ/nWx eC2h0PTmXtzZ9m1swT0zZ2hdbJOS/2c6CIXwVWJG29vD1p9+f4IaEaYs36uu6aa5s1bx RGNlWnhp5GWaqZsLQtbfFXUOsYEIuRllkUYQnrYSNor8zcq//30ctnmhLkzPg36BWDws u6W8cl9kb1Azk6mfpHu7esyM9ArfFUaQRY7nYbDIY4yWw7tNlRhQOcCdKd6QtWK1O81S V5RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=VK/NgmoUgF3zmYFtRfuRM3Wkp5fHufqNEeII1X5Cqok=; b=BEefGeU8I6RQQN1spz0DW6rdPIMk9C14E+eKGTHQWJ/Zi3D3bfcHNj1t0JJu45+N4W qYjCKQrozVeY/h3+3twz4GNHP+5OQPs1uV+jmpw4LA9BjJh3zr2E8h6VZIYJwmdZEsNO LVmjycUwdh9nvMOhp+BncoPlrDObhpCIoohYuPdvKVnnZPvz/OMHbzvNVB1RYyahV9b6 tdlSVZRNRvqCNkykCF7uK1jbVejdVwiBKwMqiRVueGnx40FIxutyQhBA3/wnAiLZj2n1 FRXth4wy9OqwGfpG//S7hXKJQwGALADlrjnmn1zzi1U0Nx7rEk5XQkmlGWri2UJoM/lF THaA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u1si7286725pfa.258.2017.07.10.00.02.23; Mon, 10 Jul 2017 00:02:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752618AbdGJHCW (ORCPT + 1 other); Mon, 10 Jul 2017 03:02:22 -0400 Received: from szxga01-in.huawei.com ([45.249.212.187]:9298 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751163AbdGJHCU (ORCPT ); Mon, 10 Jul 2017 03:02:20 -0400 Received: from 172.30.72.54 (EHLO dggeml406-hub.china.huawei.com) ([172.30.72.54]) by dggrg01-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id ARU37602; Mon, 10 Jul 2017 15:02:12 +0800 (CST) Received: from 138.huawei.com (10.175.124.28) by dggeml406-hub.china.huawei.com (10.3.17.50) with Microsoft SMTP Server id 14.3.301.0; Mon, 10 Jul 2017 15:02:05 +0800 From: Yijing Wang To: , CC: , , , , , , , , , , , , , , , , , , , Yijing Wang , "Johannes Thumshirn" Subject: [PATCH v3 4/7] libsas: add sas event wait-complete support Date: Mon, 10 Jul 2017 15:06:06 +0800 Message-ID: <1499670369-44143-5-git-send-email-wangyijing@huawei.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> References: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.124.28] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020204.59632675.0017, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 395af9df5221eef312253d515a5ff7a7 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Introduce wait-complete for libsas sas event processing, execute sas port create/destruct in sync. Signed-off-by: Yijing Wang CC: John Garry CC: Johannes Thumshirn CC: Ewan Milne CC: Christoph Hellwig CC: Tomas Henzl CC: Dan Williams --- drivers/scsi/libsas/sas_discover.c | 41 ++++++++++++++++++++++++++++---------- drivers/scsi/libsas/sas_internal.h | 34 +++++++++++++++++++++++++++++++ drivers/scsi/libsas/sas_port.c | 4 ++++ include/scsi/libsas.h | 5 ++++- 4 files changed, 72 insertions(+), 12 deletions(-) -- 2.5.0 diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index 60de662..5d4a3a8 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c @@ -525,16 +525,43 @@ static void sas_revalidate_domain(struct work_struct *work) mutex_unlock(&ha->disco_mutex); } +static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { + [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, + [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, + [DISCE_PROBE] = sas_probe_devices, + [DISCE_SUSPEND] = sas_suspend_devices, + [DISCE_RESUME] = sas_resume_devices, + [DISCE_DESTRUCT] = sas_destruct_devices, +}; + +/* a simple wrapper for sas discover event funtions */ +static void sas_discover_common_fn(struct work_struct *work) +{ + struct sas_discovery_event *ev = to_sas_discovery_event(work); + struct asd_sas_port *port = ev->port; + + sas_event_fns[ev->type](work); + sas_port_put(port); +} + + /* ---------- Events ---------- */ static void sas_chain_work(struct sas_ha_struct *ha, struct sas_work *sw) { + int ret; + struct sas_discovery_event *ev = to_sas_discovery_event(&sw->work); + struct asd_sas_port *port = ev->port; + /* chained work is not subject to SA_HA_DRAINING or * SAS_HA_REGISTERED, because it is either submitted in the * workqueue, or known to be submitted from a context that is * not racing against draining */ - scsi_queue_work(ha->core.shost, &sw->work); + sas_port_get(port); + ret = scsi_queue_work(ha->core.shost, &sw->work); + if (ret != 1) + sas_port_put(port); } static void sas_chain_event(int event, unsigned long *pending, @@ -575,18 +602,10 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port) { int i; - static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { - [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, - [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, - [DISCE_PROBE] = sas_probe_devices, - [DISCE_SUSPEND] = sas_suspend_devices, - [DISCE_RESUME] = sas_resume_devices, - [DISCE_DESTRUCT] = sas_destruct_devices, - }; - disc->pending = 0; for (i = 0; i < DISC_NUM_EVENTS; i++) { - INIT_SAS_WORK(&disc->disc_work[i].work, sas_event_fns[i]); + INIT_SAS_WORK(&disc->disc_work[i].work, sas_discover_common_fn); disc->disc_work[i].port = port; + disc->disc_work[i].type = i; } } diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h index f03ce64..890b5d26 100644 --- a/drivers/scsi/libsas/sas_internal.h +++ b/drivers/scsi/libsas/sas_internal.h @@ -100,6 +100,40 @@ void sas_free_device(struct kref *kref); extern const work_func_t sas_phy_event_fns[PHY_NUM_EVENTS]; extern const work_func_t sas_port_event_fns[PORT_NUM_EVENTS]; +static void sas_complete_event(struct kref *kref) +{ + struct asd_sas_port *port = container_of(kref, struct asd_sas_port, ref); + + complete_all(&port->completion); +} + +static inline void sas_port_put(struct asd_sas_port *port) +{ + if (port->is_sync) + kref_put(&port->ref, sas_complete_event); +} + +static inline void sas_port_wait_init(struct asd_sas_port *port) +{ + init_completion(&port->completion); + kref_init(&port->ref); + port->is_sync = true; +} + +static inline void sas_port_wait_completion( + struct asd_sas_port *port) +{ + sas_port_put(port); + wait_for_completion(&port->completion); + port->is_sync = false; +} + +static inline void sas_port_get(struct asd_sas_port *port) +{ + if (port && port->is_sync) + kref_get(&port->ref); +} + #ifdef CONFIG_SCSI_SAS_HOST_SMP extern int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, struct request *rsp); diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c index 9326628..d589adb 100644 --- a/drivers/scsi/libsas/sas_port.c +++ b/drivers/scsi/libsas/sas_port.c @@ -191,7 +191,9 @@ static void sas_form_port(struct asd_sas_phy *phy) if (si->dft->lldd_port_formed) si->dft->lldd_port_formed(phy); + sas_port_wait_init(port); sas_discover_event(phy->port, DISCE_DISCOVER_DOMAIN); + sas_port_wait_completion(port); } /** @@ -218,7 +220,9 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone) dev->pathways--; if (port->num_phys == 1) { + sas_port_wait_init(port); sas_unregister_domain_devices(port, gone); + sas_port_wait_completion(port); sas_port_delete(port->port); port->port = NULL; } else { diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index a01ca42..c2ef05e 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -242,6 +242,7 @@ static inline void INIT_SAS_WORK(struct sas_work *sw, void (*fn)(struct work_str struct sas_discovery_event { struct sas_work work; struct asd_sas_port *port; + enum discover_event type; }; static inline struct sas_discovery_event *to_sas_discovery_event(struct work_struct *work) @@ -273,7 +274,9 @@ struct asd_sas_port { struct sas_work work; int suspended; - + struct kref ref; + struct completion completion; + bool is_sync; /* public: */ int id; From patchwork Mon Jul 10 07:06:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyijing X-Patchwork-Id: 107278 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp3038460qge; Mon, 10 Jul 2017 00:03:15 -0700 (PDT) X-Received: by 10.84.157.74 with SMTP id u10mr16524858plu.137.1499670194940; Mon, 10 Jul 2017 00:03:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499670194; cv=none; d=google.com; s=arc-20160816; b=i9VoSdyemtCuL4rjI6k7i9nEhMK3xpa6QJ4A0wd6DRk7oyzNwoBiikHBuMkXFyPoG4 O5qkzPNO3tDmq5S9BXzwhLD5w3F4Id7rEyil189cmrnfxrLMmPlrJ0S4DNk45nZOpYPW qSmIw6jL+LIPnq+V2XW+IHTvC9b96HK0F3IFJIOptTawvZAFnDsCQ4XRrCdpkOSsSFPA fKKcvhB1R7dvV1jQFn2Br4d7Xu4xH1cfUYMe3Av9SACWM10ROB30bEK/R8SClrK0+0HQ 5bGUjP2JMxauRQdT4jiqiY2VEHVvSkU3O5vYYrsC9nj0ZiOCeTO9jDpE9J+j0ei6JdgH VvdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=vQLkI7YAq2VGX/OKE919poL63S8N8PlD6uYKUP1Hq2I=; b=G8nSE+e19au5QxqvarfcomJ2QyFB9UnOEBi6QTGk007rmv4sOMmdwJWzoZ3MFowJjc ocO1jnu1XlCnLSLSsQhbjOVOT4npzHv0LWB+M/jbOvzdc3c5qtXc8J7t9palewpNr4gR i03C0MTnIaTyAEe5W5FNJ8xt/ay21cjrCqR/Mpw7h5lCnMa5PCGDPSJc10QtdR230IfN qFMSR9zP+bBSrvIT250CIG4tLPREn1xmbM1RAGo0kBlLkBpxTxbqShmI5/zM+uroYph4 Z9RZgMW3wxQqaciEZQ3dIHJmAJ7IZSv4HNYZl4LvfcLWuyroUQeUUa+T9BJaUHlhxmIz MRDA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d184si7436669pgc.158.2017.07.10.00.03.14; Mon, 10 Jul 2017 00:03:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752427AbdGJHDC (ORCPT + 1 other); Mon, 10 Jul 2017 03:03:02 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:9813 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752707AbdGJHCZ (ORCPT ); Mon, 10 Jul 2017 03:02:25 -0400 Received: from 172.30.72.53 (EHLO dggeml406-hub.china.huawei.com) ([172.30.72.53]) by dggrg02-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id AQU38386; Mon, 10 Jul 2017 15:02:16 +0800 (CST) Received: from 138.huawei.com (10.175.124.28) by dggeml406-hub.china.huawei.com (10.3.17.50) with Microsoft SMTP Server id 14.3.301.0; Mon, 10 Jul 2017 15:02:06 +0800 From: Yijing Wang To: , CC: , , , , , , , , , , , , , , , , , , , Yijing Wang , "Johannes Thumshirn" Subject: [PATCH v3 5/7] libsas: add a new workqueue to run probe/destruct discovery event Date: Mon, 10 Jul 2017 15:06:07 +0800 Message-ID: <1499670369-44143-6-git-send-email-wangyijing@huawei.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> References: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.124.28] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A0B0204.59632678.017A, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: f54077bcd93bd9b57e85a6725fdb9a42 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Sometimes, we want sync libsas probe or destruct in sas discovery work, like when libsas revalidate domain. We need to split probe and destruct work from the scsi host workqueue. Signed-off-by: Yijing Wang CC: John Garry CC: Johannes Thumshirn CC: Ewan Milne CC: Christoph Hellwig CC: Tomas Henzl CC: Dan Williams --- drivers/scsi/libsas/sas_discover.c | 13 ++++++++++++- drivers/scsi/libsas/sas_init.c | 8 ++++++++ include/scsi/libsas.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) -- 2.5.0 diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index 5d4a3a8..a25d648 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c @@ -559,7 +559,18 @@ static void sas_chain_work(struct sas_ha_struct *ha, struct sas_work *sw) * not racing against draining */ sas_port_get(port); - ret = scsi_queue_work(ha->core.shost, &sw->work); + /* + * discovery event probe and destruct would be called in other + * discovery event like discover domain and revalidate domain + * events, in some cases, we need to sync execute probe and destruct + * events, so run probe and destruct discover events except in a new + * workqueue. + */ + if (ev->type == DISCE_PROBE || ev->type == DISCE_DESTRUCT) + ret = queue_work(ha->disc_q, &sw->work); + else + ret = scsi_queue_work(ha->core.shost, &sw->work); + if (ret != 1) sas_port_put(port); } diff --git a/drivers/scsi/libsas/sas_init.c b/drivers/scsi/libsas/sas_init.c index 2f3b736..df1d78b 100644 --- a/drivers/scsi/libsas/sas_init.c +++ b/drivers/scsi/libsas/sas_init.c @@ -152,6 +152,13 @@ int sas_register_ha(struct sas_ha_struct *sas_ha) if (!sas_ha->event_q) goto Undo_ports; + snprintf(name, 64, "%s_disc_q", dev_name(sas_ha->dev)); + sas_ha->disc_q = create_singlethread_workqueue(name); + if(!sas_ha->disc_q) { + destroy_workqueue(sas_ha->event_q); + goto Undo_ports; + } + INIT_LIST_HEAD(&sas_ha->eh_done_q); INIT_LIST_HEAD(&sas_ha->eh_ata_q); @@ -187,6 +194,7 @@ int sas_unregister_ha(struct sas_ha_struct *sas_ha) __sas_drain_work(sas_ha); mutex_unlock(&sas_ha->drain_mutex); destroy_workqueue(sas_ha->event_q); + destroy_workqueue(sas_ha->disc_q); return 0; } diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index c2ef05e..4bcb9fe 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -406,6 +406,7 @@ struct sas_ha_struct { struct device *dev; /* should be set */ struct module *lldd_module; /* should be set */ struct workqueue_struct *event_q; + struct workqueue_struct *disc_q; u8 *sas_addr; /* must be set */ u8 hashed_sas_addr[HASHED_SAS_ADDR_SIZE]; From patchwork Mon Jul 10 07:06:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyijing X-Patchwork-Id: 107275 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp3038226qge; Mon, 10 Jul 2017 00:02:58 -0700 (PDT) X-Received: by 10.98.98.199 with SMTP id w190mr37906066pfb.44.1499670178610; Mon, 10 Jul 2017 00:02:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499670178; cv=none; d=google.com; s=arc-20160816; b=Vew+JfDNnPapVPhhOgapPGbKNLQs1NS3a0YLORSP4VlNXv0a/os3UV8853unE0HzWR 5mr9x5/E1KBKR2L0lU3pcZ0OmX2SjM14aN2Vfinlhi29zceravDy+GxHtaAyh8kYRqlb 3gDmVMoiI9BSRvlgX0TwHXuI4osE4pVRbwSwApvFRbN/fWpdsGtXnbmlqcCzMY3SGsPI 3lNgUxZNQOjhHFPeQZLaTNO7JvCg68k7JeO1OERGvXwacxtD0dvz6If7HrGPPiwHmeT1 vb22ZBPqjfDJv6YmL1aknSOM3sMF1i2RLmjtZjirZhfobYcGKaBqFbRuauLA2/k2sk8u zYjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=VUyI//NWXYOoJo1zJZYDAr6LNzBKpEB/SmVsVNVJH38=; b=EkV9Fk3lLAyzy8n8S1m8+2W8QeerSkWgWQ6PJDhwK7lwLV29SSnxg2Ologo3YyeQOW Ch+on9HQa70jhBo2Op5muylHWt3vePD/BuFMECCdawjyxEQ20BCx+EwDnR7DGUap3891 nMNRTvOeMXv+c4v5CitXchR18y10DeyrFxm5T+1RX3C6LiRDgUWigJKSr80zoNHGd6YE tEEBFhRjvgpt/3b9SKSQ08Ef8JaQhz64ayPJL1T9pYw4ZPcwaTO07F8V6EJjbbVx8qRW KDsP4bRrNOg9SdrJtjSRK0/7FdFYDPlFxLKm5knK8hpd5fTNum5P+6noMWRXE0LJPQJM dK2g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f5si7528255pgk.495.2017.07.10.00.02.58; Mon, 10 Jul 2017 00:02:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-scsi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-scsi-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753447AbdGJHCc (ORCPT + 1 other); Mon, 10 Jul 2017 03:02:32 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:9812 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751163AbdGJHCa (ORCPT ); Mon, 10 Jul 2017 03:02:30 -0400 Received: from 172.30.72.53 (EHLO dggeml406-hub.china.huawei.com) ([172.30.72.53]) by dggrg02-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id AQU38390; Mon, 10 Jul 2017 15:02:16 +0800 (CST) Received: from 138.huawei.com (10.175.124.28) by dggeml406-hub.china.huawei.com (10.3.17.50) with Microsoft SMTP Server id 14.3.301.0; Mon, 10 Jul 2017 15:02:07 +0800 From: Yijing Wang To: , CC: , , , , , , , , , , , , , , , , , , , Yijing Wang , "Johannes Thumshirn" Subject: [PATCH v3 6/7] libsas: add wait-complete support to sync discovery event Date: Mon, 10 Jul 2017 15:06:08 +0800 Message-ID: <1499670369-44143-7-git-send-email-wangyijing@huawei.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> References: <1499670369-44143-1-git-send-email-wangyijing@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.124.28] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A0B0202.59632679.014F, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: a792165b6a31d2bb78355ddd1d947fa1 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Introduce a sync flag to tag discovery event whether need to sync execute, per-event wait-complete ensure sync. Signed-off-by: Yijing Wang CC: John Garry CC: Johannes Thumshirn CC: Ewan Milne CC: Christoph Hellwig CC: Tomas Henzl CC: Dan Williams --- drivers/scsi/libsas/sas_discover.c | 8 ++++++-- drivers/scsi/libsas/sas_expander.c | 12 +++++++++++- drivers/scsi/libsas/sas_internal.h | 27 +++++++++++++++++++++++++++ include/scsi/libsas.h | 2 ++ 4 files changed, 46 insertions(+), 3 deletions(-) -- 2.5.0 diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index a25d648..d68f8dd 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c @@ -378,6 +378,7 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) list_del_init(&dev->disco_list_node); sas_rphy_free(dev->rphy); sas_unregister_common_dev(port, dev); + sas_disc_cancel_sync(&port->disc.disc_work[DISCE_DESTRUCT]); return; } @@ -541,6 +542,7 @@ static void sas_discover_common_fn(struct work_struct *work) struct asd_sas_port *port = ev->port; sas_event_fns[ev->type](work); + sas_disc_wakeup(ev); sas_port_put(port); } @@ -571,8 +573,10 @@ static void sas_chain_work(struct sas_ha_struct *ha, struct sas_work *sw) else ret = scsi_queue_work(ha->core.shost, &sw->work); - if (ret != 1) + if (ret != 1) { sas_port_put(port); + sas_disc_cancel_sync(ev); + } } static void sas_chain_event(int event, unsigned long *pending, @@ -592,9 +596,9 @@ int sas_discover_event(struct asd_sas_port *port, enum discover_event ev) { struct sas_discovery *disc; + disc = &port->disc; if (!port) return 0; - disc = &port->disc; BUG_ON(ev >= DISC_NUM_EVENTS); diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index 570b2cb..9d26c28 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c @@ -822,14 +822,18 @@ static struct domain_device *sas_ex_discover_end_dev( list_add_tail(&child->disco_list_node, &parent->port->disco_list); + sas_disc_wait_init(child->port, DISCE_PROBE); res = sas_discover_sata(child); if (res) { + sas_disc_cancel_sync(&child->port->disc.disc_work[DISCE_PROBE]); SAS_DPRINTK("sas_discover_sata() for device %16llx at " "%016llx:0x%x returned 0x%x\n", SAS_ADDR(child->sas_addr), SAS_ADDR(parent->sas_addr), phy_id, res); goto out_list_del; } + sas_disc_wait_completion(child->port, DISCE_PROBE); + } else #endif if (phy->attached_tproto & SAS_PROTOCOL_SSP) { @@ -847,14 +851,17 @@ static struct domain_device *sas_ex_discover_end_dev( list_add_tail(&child->disco_list_node, &parent->port->disco_list); + sas_disc_wait_init(child->port, DISCE_PROBE); res = sas_discover_end_dev(child); if (res) { + sas_disc_cancel_sync(&child->port->disc.disc_work[DISCE_PROBE]); SAS_DPRINTK("sas_discover_end_dev() for device %16llx " "at %016llx:0x%x returned 0x%x\n", SAS_ADDR(child->sas_addr), SAS_ADDR(parent->sas_addr), phy_id, res); goto out_list_del; } + sas_disc_wait_completion(child->port, DISCE_PROBE); } else { SAS_DPRINTK("target proto 0x%x at %016llx:0x%x not handled\n", phy->attached_tproto, SAS_ADDR(parent->sas_addr), @@ -1890,8 +1897,11 @@ static void sas_unregister_devs_sas_addr(struct domain_device *parent, if (child->dev_type == SAS_EDGE_EXPANDER_DEVICE || child->dev_type == SAS_FANOUT_EXPANDER_DEVICE) sas_unregister_ex_tree(parent->port, child); - else + else { + sas_disc_wait_init(parent->port, DISCE_DESTRUCT); sas_unregister_dev(parent->port, child); + sas_disc_wait_completion(parent->port, DISCE_DESTRUCT); + } found = child; break; } diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h index 890b5d26..09a9b10 100644 --- a/drivers/scsi/libsas/sas_internal.h +++ b/drivers/scsi/libsas/sas_internal.h @@ -134,6 +134,33 @@ static inline void sas_port_get(struct asd_sas_port *port) kref_get(&port->ref); } +static inline void sas_disc_cancel_sync(struct sas_discovery_event *event) +{ + event->is_sync = false; +} + +static inline void sas_disc_wakeup(struct sas_discovery_event *event) +{ + if (event->is_sync) + complete(&event->completion); +} + +static inline void sas_disc_wait_init(struct asd_sas_port *port, + enum discover_event event) +{ + port->disc.disc_work[event].is_sync = true; + init_completion(&port->disc.disc_work[event].completion); +} + +static inline void sas_disc_wait_completion(struct asd_sas_port *port, + enum discover_event event) +{ + if (port->disc.disc_work[event].is_sync) { + wait_for_completion(&port->disc.disc_work[event].completion); + port->disc.disc_work[event].is_sync = false; + } +} + #ifdef CONFIG_SCSI_SAS_HOST_SMP extern int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, struct request *rsp); diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 4bcb9fe..21e9fb140 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -243,6 +243,8 @@ struct sas_discovery_event { struct sas_work work; struct asd_sas_port *port; enum discover_event type; + bool is_sync; + struct completion completion; }; static inline struct sas_discovery_event *to_sas_discovery_event(struct work_struct *work)