From patchwork Mon Jul 10 07:06:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyijing X-Patchwork-Id: 107277 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp3038459qge; Mon, 10 Jul 2017 00:03:14 -0700 (PDT) X-Received: by 10.84.233.204 with SMTP id m12mr16935335pln.292.1499670194676; 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=hQJxO3MgtnctFTCf+FcuRyoFB84BYiz+h/H96zSnpCrE5j5f30XrXFUhsg2icd2rLT 7rLc9WqnG68pI+6TheudAyllqZaP3p8BvDJBrz0B8oZgLUqqQd3G07osyuagdub6PN4m Ohucw6Z5hoAgDl1p8A+a4e5ihcmyfE90rgJ7NEx16YUircnwp0cCEBXXjIhIiqSOflRY q1JAEDxxrgnHEmY4dEmywY4/CvKATfDPb9INfOKvSghI2+ptrlY4MGvpI0zMJ8W6AAJn AmeA5KTAImnlW0KtLWjMJ/vQZQcPmcEh+DAtSg5VVMkyNx2jwWNSBm6zoT6ROWADCv8u +tiQ== 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=+SOAvezOufk/ckMy+AfYCoEU/NEnBXJbkIjFoV05w1I=; b=nhun6fISYCmuIiDHnf8Fg+489shoa/xAKy0oSvqTVMMU88/paRt4HP33qVE9mZ2D7y SwgnXJ85bYocoimujmdjLHj4BFniDfq/YsMkPij4onXBQvpdHOEgUQBtRt8D8ujkrHO+ Qu7XRjy0kz9jBGOw4uhNa76KiCdERN+vzEG2T4p+9jVtWheHZmllVUKeFQKLkXv6uCFd csAF6OvyLEBejmdmKccTXTcobYWNHAQgQWID3odwsvouu//TxlBzd/NmTu3mvt80HT7R RRmhni+vFzDxwxJOXj4ZLGQuGMvrh6cWntvCyZ/CpxJgJdXvGW+HvkmtZbZSUNuR67M8 ZqSQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-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-kernel-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-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752892AbdGJHCZ (ORCPT + 25 others); Mon, 10 Jul 2017 03:02:25 -0400 Received: from szxga01-in.huawei.com ([45.249.212.187]:9297 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751161AbdGJHCU (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 ARU37599; 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:04 +0800 From: Yijing Wang To: , CC: , , , , , , , , , , , , , , , , , , , Yijing Wang , "Johannes Thumshirn" Subject: [PATCH v3 3/7] libsas: Use new workqueue to run sas event Date: Mon, 10 Jul 2017 15:06:05 +0800 Message-ID: <1499670369-44143-4-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.59632674.003A, 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: 2e3100d947df2923e6be90f2336e7895 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now all libsas works are queued to scsi host workqueue, include sas event work post by LLDD and sas discovery work, and a sas hotplug flow may be divided into several works, e.g libsas receive a PORTE_BYTES_DMAED event, now we process it as following steps: sas_form_port --- run in work in shot workq sas_discover_domain --- run in another work in shost workq ... sas_probe_devices --- run in new work in shost workq We found during hot-add a device, libsas may need run several works in same workqueue to add device in system, the process is not atomic, it may interrupt by other sas event works, like PHYE_LOSS_OF_SIGNAL. Finally, we would found lots unexpected errors. This patch is preparation of execute libsas sas event 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_event.c | 4 ++-- drivers/scsi/libsas/sas_init.c | 7 +++++++ include/scsi/libsas.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) -- 2.5.0 Reviewed-by: Hannes Reinecke diff --git a/drivers/scsi/libsas/sas_event.c b/drivers/scsi/libsas/sas_event.c index a1370bd..a72a089 100644 --- a/drivers/scsi/libsas/sas_event.c +++ b/drivers/scsi/libsas/sas_event.c @@ -46,7 +46,7 @@ int sas_queue_work(struct sas_ha_struct *ha, struct sas_work *sw) if (list_empty(&sw->drain_node)) list_add(&sw->drain_node, &ha->defer_q); } else - rc = scsi_queue_work(ha->core.shost, &sw->work); + rc = queue_work(ha->event_q, &sw->work); return rc; } @@ -69,7 +69,7 @@ void __sas_drain_work(struct sas_ha_struct *ha) { int ret; unsigned long flags; - struct workqueue_struct *wq = ha->core.shost->work_q; + struct workqueue_struct *wq = ha->event_q; struct sas_work *sw, *_sw; set_bit(SAS_HA_DRAINING, &ha->state); diff --git a/drivers/scsi/libsas/sas_init.c b/drivers/scsi/libsas/sas_init.c index c227a8b..2f3b736 100644 --- a/drivers/scsi/libsas/sas_init.c +++ b/drivers/scsi/libsas/sas_init.c @@ -115,6 +115,7 @@ void sas_hae_reset(struct work_struct *work) int sas_register_ha(struct sas_ha_struct *sas_ha) { + char name[64]; int error = 0; mutex_init(&sas_ha->disco_mutex); @@ -146,6 +147,11 @@ int sas_register_ha(struct sas_ha_struct *sas_ha) goto Undo_ports; } + snprintf(name, 64, "%s_event_q", dev_name(sas_ha->dev)); + sas_ha->event_q = create_singlethread_workqueue(name); + if (!sas_ha->event_q) + goto Undo_ports; + INIT_LIST_HEAD(&sas_ha->eh_done_q); INIT_LIST_HEAD(&sas_ha->eh_ata_q); @@ -180,6 +186,7 @@ int sas_unregister_ha(struct sas_ha_struct *sas_ha) mutex_lock(&sas_ha->drain_mutex); __sas_drain_work(sas_ha); mutex_unlock(&sas_ha->drain_mutex); + destroy_workqueue(sas_ha->event_q); return 0; } diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 628f48b..a01ca42 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -402,6 +402,7 @@ struct sas_ha_struct { char *sas_ha_name; struct device *dev; /* should be set */ struct module *lldd_module; /* should be set */ + struct workqueue_struct *event_q; u8 *sas_addr; /* must be set */ u8 hashed_sas_addr[HASHED_SAS_ADDR_SIZE];