Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6139240imu; Wed, 30 Jan 2019 09:25:11 -0800 (PST) X-Google-Smtp-Source: ALg8bN6TsJze7PMEGx1nGqfS1yhZX+0OgjS8ib4kmud0I3yEjeqKrwxeESrtgyT44OsmmRmAmdtO X-Received: by 2002:a63:194f:: with SMTP id 15mr21961789pgz.192.1548869110960; Wed, 30 Jan 2019 09:25:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548869110; cv=none; d=google.com; s=arc-20160816; b=dvlzfGivEY7/UgAynXH4C0lK2n/nAPpgas69Anfs1BzBs/njNqG5L7P4otlvDeFoPB sjIBh0EO5FVsLdtxxCeZQ0/oFT2MvnD0h88WfntCbp/R3/IdbOB0QRRO+H9zVXr+jb6E oSOh5lGGl3qTxpAymLNvK1CQKnEE9kP/4b4pTGZOKwcASHsG54NQHjMXIKx35pYvL3ak CVQILaPPsjtFtsBuyT2dsZOGm9p5Aqe6dTfS8xeLBwXAuxwmbTbqReqOoRDAD0jBONoR L0h6wkWja5EUJcXEdbx4oXVpZWJSKbUGRUFYNd8YK5nGgqTT+4WKtQlarNN4Dj5rQrEt NlEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject; bh=Z4Ac0nwAAeltWrprPvBWpSYD6kAVHByXaBgsTPCslrw=; b=kjA16Cf/dBogbUS4kw7q6vAgJTkueJu3NHO9MlnnmW1lndy5iaUeRkv0eGdJzx9ibp XoMcFngRxtCpIxpM9+plaF5lSLA/u88vQMWa3PU84GeGhVwjfmcoMf+BSI0Dz8yYUwYS kqD+AmbVjpCWVLEf5xDHXxpdPLlM7GJpSxNYgEQ3RRmkB9dQQpicoVHEy/bj5rOcXl56 41swS+dthoIaYP69SqnwEjefZw0i9ZzXt6JycJy+o/T4Pp7FR4SpxgsmlVdFnPlAgNBe 5itK/044jYSaXIfbLgOPy2zuhOhaCo8mAQ76JA7q00zIxt9/muHWmFwrdZOIKaXzfMMl eZrA== 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 b124si1895643pfg.47.2019.01.30.09.24.46; Wed, 30 Jan 2019 09:25:10 -0800 (PST) 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 S1732481AbfA3RXJ (ORCPT + 99 others); Wed, 30 Jan 2019 12:23:09 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:3248 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726972AbfA3RXJ (ORCPT ); Wed, 30 Jan 2019 12:23:09 -0500 Received: from DGGEMS408-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 9E61FD9D045FA5C07869; Thu, 31 Jan 2019 01:23:06 +0800 (CST) Received: from [127.0.0.1] (10.202.226.43) by DGGEMS408-HUB.china.huawei.com (10.3.19.208) with Microsoft SMTP Server id 14.3.408.0; Thu, 31 Jan 2019 01:22:56 +0800 Subject: Re: [PATCH v2 4/7] scsi: libsas: split the replacement of sas disks in two steps To: Jason Yan , , References: <20190130082412.9357-1-yanaijie@huawei.com> <20190130082412.9357-5-yanaijie@huawei.com> CC: , , , , , , , , , , , , Ewan Milne , Tomas Henzl From: John Garry Message-ID: <17908564-35f2-4c5d-e9e4-4fe109fae4cc@huawei.com> Date: Wed, 30 Jan 2019 17:22:47 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: <20190130082412.9357-5-yanaijie@huawei.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.202.226.43] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 30/01/2019 08:24, Jason Yan wrote: > Now if a new device replaced a old device, the sas address will change. Hmmm... not if it's a SATA disk, which would have some same invented SAS address. > We unregister the old device and discover the new device in one > revalidation process. But after we deferred the sas_port_delete(), the > sas port is not deleted when we registering the new port and device. > The sas port cannot be added because the name of the new port is the > same as the old. > > Fix this by doing the replacement in two steps. The first revalidation > only delete the old device and trigger a new revalidation. The second > revalidation discover the new device. To keep the event processing > synchronised to the original event, Did I originally suggest this? It seems to needlessly make the code more complicated. we wrapped a loop and added a new > parameter to see if we should revalidate again. > > Signed-off-by: Jason Yan > CC: chenxiang > CC: John Garry > CC: Johannes Thumshirn > CC: Ewan Milne > CC: Christoph Hellwig > CC: Tomas Henzl > CC: Dan Williams > CC: Hannes Reinecke > --- > drivers/scsi/libsas/sas_discover.c | 20 +++++++++++++++----- > drivers/scsi/libsas/sas_expander.c | 20 ++++++++++++++------ > include/scsi/libsas.h | 2 +- > 3 files changed, 30 insertions(+), 12 deletions(-) > > diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c > index ffc571a12916..c825c89fbddd 100644 > --- a/drivers/scsi/libsas/sas_discover.c > +++ b/drivers/scsi/libsas/sas_discover.c > @@ -498,12 +498,10 @@ static void sas_discover_domain(struct work_struct *work) > task_pid_nr(current), error); > } > > -static void sas_revalidate_domain(struct work_struct *work) > +static void sas_do_revalidate_domain(struct asd_sas_port *port, bool *retry) > { > - struct sas_discovery_event *ev = to_sas_discovery_event(work); > - struct asd_sas_port *port = ev->port; > - struct sas_ha_struct *ha = port->ha; > struct domain_device *ddev = port->port_dev; > + struct sas_ha_struct *ha = port->ha; > > /* prevent revalidation from finding sata links in recovery */ > mutex_lock(&ha->disco_mutex); > @@ -520,7 +518,7 @@ static void sas_revalidate_domain(struct work_struct *work) > > if (ddev && (ddev->dev_type == SAS_FANOUT_EXPANDER_DEVICE || > ddev->dev_type == SAS_EDGE_EXPANDER_DEVICE)) > - sas_ex_revalidate_domain(ddev); > + sas_ex_revalidate_domain(ddev, retry); > > pr_debug("done REVALIDATING DOMAIN on port %d, pid:%d\n", > port->id, task_pid_nr(current)); > @@ -532,6 +530,18 @@ static void sas_revalidate_domain(struct work_struct *work) > sas_probe_devices(port); > } > > +static void sas_revalidate_domain(struct work_struct *work) > +{ > + struct sas_discovery_event *ev = to_sas_discovery_event(work); > + struct asd_sas_port *port = ev->port; > + bool retry; > + > + do { > + retry = false; > + sas_do_revalidate_domain(port, &retry); > + } while (retry); > +} > + > /* ---------- Events ---------- */ > > static void sas_chain_work(struct sas_ha_struct *ha, struct sas_work *sw) > diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c > index 5cd720f93f96..cdbf8d8a28bf 100644 > --- a/drivers/scsi/libsas/sas_expander.c > +++ b/drivers/scsi/libsas/sas_expander.c > @@ -1994,7 +1994,8 @@ static bool dev_type_flutter(enum sas_device_type new, enum sas_device_type old) > return false; > } > > -static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last) > +static int sas_unregister(struct domain_device *dev, int phy_id, bool last, > + bool *retry) > { > struct expander_device *ex = &dev->ex_dev; > struct ex_phy *phy = &ex->ex_phy[phy_id]; > @@ -2045,7 +2046,12 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last) > SAS_ADDR(phy->attached_sas_addr)); > sas_unregister_devs_sas_addr(dev, phy_id, last); > > - return sas_discover_new(dev, phy_id); > + /* force the next revalidation find this phy and bring it up */ > + phy->phy_change_count = -1; > + ex->ex_change_count = -1; > + *retry = true; Ohh, sorry to say, but that's a real hack :) Could we just add a flag for the expander PHY to force a discovery instead of this? I assume that you need to do this as the expander PHY change count will not be modified for the next revalidation (so no discovery on that PHY). > + > + return 0; > } > > /** > @@ -2062,7 +2068,8 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last) > * first phy,for other phys in this port, we add it to the port to > * forming the wide-port. > */ > -static void sas_rediscover(struct domain_device *dev, const int phy_id) > +static void sas_rediscover(struct domain_device *dev, const int phy_id, > + bool *retry) > { > struct expander_device *ex = &dev->ex_dev; > struct ex_phy *changed_phy = &ex->ex_phy[phy_id]; > @@ -2087,7 +2094,7 @@ static void sas_rediscover(struct domain_device *dev, const int phy_id) > break; > } > } > - res = sas_rediscover_dev(dev, phy_id, last); > + res = sas_unregister(dev, phy_id, last, retry); > } else > res = sas_discover_new(dev, phy_id); > > @@ -2098,13 +2105,14 @@ static void sas_rediscover(struct domain_device *dev, const int phy_id) > /** > * sas_ex_revalidate_domain - revalidate the domain > * @port_dev: port domain device. > + * @retry: do we need to revalidate again > * > * NOTE: this process _must_ quit (return) as soon as any connection > * errors are encountered. Connection recovery is done elsewhere. > * Discover process only interrogates devices in order to discover the > * domain. > */ > -void sas_ex_revalidate_domain(struct domain_device *port_dev) > +void sas_ex_revalidate_domain(struct domain_device *port_dev, bool *retry) > { > int res; > struct domain_device *dev = NULL; > @@ -2119,7 +2127,7 @@ void sas_ex_revalidate_domain(struct domain_device *port_dev) > res = sas_find_bcast_phy(dev, &phy_id, i, true); > if (phy_id == -1) > break; > - sas_rediscover(dev, phy_id); > + sas_rediscover(dev, phy_id, retry); > i = phy_id + 1; > } while (i < ex->num_phys); > } > diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h > index e557bcb0c266..deb75765e555 100644 > --- a/include/scsi/libsas.h > +++ b/include/scsi/libsas.h > @@ -692,7 +692,7 @@ int sas_discover_root_expander(struct domain_device *); > > void sas_init_ex_attr(void); > > -void sas_ex_revalidate_domain(struct domain_device *); > +void sas_ex_revalidate_domain(struct domain_device *port_dev, bool *retry); > > void sas_unregister_domain_devices(struct asd_sas_port *port, int gone); > void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *); >