Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp752896pxf; Wed, 24 Mar 2021 15:19:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzPn0GavRkD42gPynG/DdiY7T/Mizvtu54rQmw8/6hJAoqysQbtsGdlaUm0tyRRnYfdsYJI X-Received: by 2002:a17:907:689:: with SMTP id wn9mr5998250ejb.485.1616624391754; Wed, 24 Mar 2021 15:19:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616624391; cv=none; d=google.com; s=arc-20160816; b=mGwbEAdzgX7qhv/eNmmw6pHJsdx6eQd1qGA5R8sHZg7xANyN6KX83POuQRzXoxBP5g BVB0ZHxlvewnhCbILE8BN6wngMTEnDfCqHXc1l2nHfwBHyFXuAeYJ4YzFCabkTNkAYWe M0P+PgJylW3hXJJ5BNrsusI9QG+sQETU4Dhu6mKmyov0S/+sCdnI+nBtF3lA5w0x+2Kz zlslfzUKuiNDHb9SKzhB7B0QkhVf5AuNsgbWja9Qc4TkKoR2P3DbE+Cbe0KXm4vJtXZp g71b3bPgql50usiiirTs1XyRMQFNRe15gJNR2BxATVQKUFs6Rj0HYGn7FvlKmDek1Pku D3VQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date; bh=7iX3qVWObXm0eZ9YxUlCLUctHxQIAvy9Tq7J/qAGd+E=; b=kMGao90ZQ8qPCijGsPSi5VGqdu0nrj15+k5vklO649obj6TEGRnpJUMkc5z+RTxSeC ipb+/d7FKhnVDo5sH9t+fldFqDQ8/akU9ytzt5EzeyZfS5o67EFSmvdY4WuKsR8Vi7fg 3MkIF9MVxd22g+5d/HaHfMnlyujcUgoYgiHSNutD2S4AccLf37i3jOOALwcVqtT8XBUC FC099RjW7v7Pz741tmnTsLkzIOzso3SBdVapCIau4H8U3910jaeVK3ap8Kvg2CtRQS/8 V1mXtypfQJgNFtggh8K4JO01sn7AkBuHi/e4CXOTwgCJlPlByCaNDuCDZOTNqinn8UzI X3dA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=hisilicon.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id fi16si2729225ejb.239.2021.03.24.15.19.28; Wed, 24 Mar 2021 15:19:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=hisilicon.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235060AbhCXDbr (ORCPT + 99 others); Tue, 23 Mar 2021 23:31:47 -0400 Received: from szxga03-in.huawei.com ([45.249.212.189]:3380 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232782AbhCXDbP (ORCPT ); Tue, 23 Mar 2021 23:31:15 -0400 Received: from dggeme759-chm.china.huawei.com (unknown [172.30.72.55]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4F4txP5hCVz5fjd; Wed, 24 Mar 2021 11:28:41 +0800 (CST) Received: from shaphisprc48410 (100.108.177.173) by dggeme759-chm.china.huawei.com (10.3.19.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2106.2; Wed, 24 Mar 2021 11:31:11 +0800 Date: Wed, 24 Mar 2021 03:31:04 +0000 From: Zang Leigang To: Avri Altman CC: "James E . J . Bottomley" , "Martin K . Petersen" , , , , Bart Van Assche , yongmyung lee , Daejun Park , , , Avi Shchislowski , Bean Huo , , Subject: Re: [PATCH v6 02/10] scsi: ufshpb: Add host control mode support to rsp_upiu Message-ID: <20210324033104.5kms7pez6arnkaoz@shaphisprc48410> References: <20210322081044.62003-1-avri.altman@wdc.com> <20210322081044.62003-3-avri.altman@wdc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20210322081044.62003-3-avri.altman@wdc.com> User-Agent: NeoMutt/20171215 X-Originating-IP: [100.108.177.173] X-ClientProxiedBy: dggeme711-chm.china.huawei.com (10.1.199.107) To dggeme759-chm.china.huawei.com (10.3.19.105) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Mar 22, 2021 at 10:10:36AM +0200, Avri Altman wrote: > In device control mode, the device may recommend the host to either > activate or inactivate a region, and the host should follow. Meaning > those are not actually recommendations, but more of instructions. > > On the contrary, in host control mode, the recommendation protocol is > slightly changed: > a) The device may only recommend the host to update a subregion of an > already-active region. And, > b) The device may *not* recommend to inactivate a region. > > Furthermore, in host control mode, the host may choose not to follow any > of the device's recommendations. However, in case of a recommendation to > update an active and clean subregion, it is better to follow those > recommendation because otherwise the host has no other way to know that > some internal relocation took place. > > Signed-off-by: Avri Altman > --- > drivers/scsi/ufs/ufshpb.c | 34 +++++++++++++++++++++++++++++++++- > drivers/scsi/ufs/ufshpb.h | 2 ++ > 2 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/ufs/ufshpb.c b/drivers/scsi/ufs/ufshpb.c > index fb10afcbb49f..d4f0bb6d8fa1 100644 > --- a/drivers/scsi/ufs/ufshpb.c > +++ b/drivers/scsi/ufs/ufshpb.c > @@ -166,6 +166,8 @@ static void ufshpb_set_ppn_dirty(struct ufshpb_lu *hpb, int rgn_idx, > else > set_bit_len = cnt; > > + set_bit(RGN_FLAG_DIRTY, &rgn->rgn_flags); > + > if (rgn->rgn_state != HPB_RGN_INACTIVE && > srgn->srgn_state == HPB_SRGN_VALID) > bitmap_set(srgn->mctx->ppn_dirty, srgn_offset, set_bit_len); > @@ -235,6 +237,11 @@ static bool ufshpb_test_ppn_dirty(struct ufshpb_lu *hpb, int rgn_idx, > return false; > } > > +static inline bool is_rgn_dirty(struct ufshpb_region *rgn) > +{ > + return test_bit(RGN_FLAG_DIRTY, &rgn->rgn_flags); > +} > + > static int ufshpb_fill_ppn_from_page(struct ufshpb_lu *hpb, > struct ufshpb_map_ctx *mctx, int pos, > int len, u64 *ppn_buf) > @@ -713,6 +720,7 @@ static void ufshpb_put_map_req(struct ufshpb_lu *hpb, > static int ufshpb_clear_dirty_bitmap(struct ufshpb_lu *hpb, > struct ufshpb_subregion *srgn) > { > + struct ufshpb_region *rgn; > u32 num_entries = hpb->entries_per_srgn; > > if (!srgn->mctx) { > @@ -726,6 +734,10 @@ static int ufshpb_clear_dirty_bitmap(struct ufshpb_lu *hpb, > num_entries = hpb->last_srgn_entries; > > bitmap_zero(srgn->mctx->ppn_dirty, num_entries); > + > + rgn = hpb->rgn_tbl + srgn->rgn_idx; > + clear_bit(RGN_FLAG_DIRTY, &rgn->rgn_flags); > + > return 0; > } > > @@ -1245,6 +1257,18 @@ static void ufshpb_rsp_req_region_update(struct ufshpb_lu *hpb, > srgn_i = > be16_to_cpu(rsp_field->hpb_active_field[i].active_srgn); > > + rgn = hpb->rgn_tbl + rgn_i; > + if (hpb->is_hcm && > + (rgn->rgn_state != HPB_RGN_ACTIVE || is_rgn_dirty(rgn))) { > + /* > + * in host control mode, subregion activation > + * recommendations are only allowed to active regions. > + * Also, ignore recommendations for dirty regions - the > + * host will make decisions concerning those by himself > + */ > + continue; > + } > + Hi Avri, host control mode also need the recommendations from device, because the bkops would make the ppn invalid, is that right? > dev_dbg(&hpb->sdev_ufs_lu->sdev_dev, > "activate(%d) region %d - %d\n", i, rgn_i, srgn_i); > > @@ -1252,7 +1276,6 @@ static void ufshpb_rsp_req_region_update(struct ufshpb_lu *hpb, > ufshpb_update_active_info(hpb, rgn_i, srgn_i); > spin_unlock(&hpb->rsp_list_lock); > > - rgn = hpb->rgn_tbl + rgn_i; > srgn = rgn->srgn_tbl + srgn_i; > > /* blocking HPB_READ */ > @@ -1263,6 +1286,14 @@ static void ufshpb_rsp_req_region_update(struct ufshpb_lu *hpb, > hpb->stats.rb_active_cnt++; > } > > + if (hpb->is_hcm) { > + /* > + * in host control mode the device is not allowed to inactivate > + * regions > + */ > + goto out; > + } > + > for (i = 0; i < rsp_field->inactive_rgn_cnt; i++) { > rgn_i = be16_to_cpu(rsp_field->hpb_inactive_field[i]); > dev_dbg(&hpb->sdev_ufs_lu->sdev_dev, > @@ -1287,6 +1318,7 @@ static void ufshpb_rsp_req_region_update(struct ufshpb_lu *hpb, > hpb->stats.rb_inactive_cnt++; > } > > +out: > dev_dbg(&hpb->sdev_ufs_lu->sdev_dev, "Noti: #ACT %u #INACT %u\n", > rsp_field->active_rgn_cnt, rsp_field->inactive_rgn_cnt); > > diff --git a/drivers/scsi/ufs/ufshpb.h b/drivers/scsi/ufs/ufshpb.h > index 7df30340386a..032672114881 100644 > --- a/drivers/scsi/ufs/ufshpb.h > +++ b/drivers/scsi/ufs/ufshpb.h > @@ -121,6 +121,8 @@ struct ufshpb_region { > > /* below information is used by lru */ > struct list_head list_lru_rgn; > + unsigned long rgn_flags; > +#define RGN_FLAG_DIRTY 0 > }; > > #define for_each_sub_region(rgn, i, srgn) \ > -- > 2.25.1 >