lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 28 Jun 2023 15:02:27 +0800
From:   Lu Hongfei <luhongfei@...o.com>
To:     Alim Akhtar <alim.akhtar@...sung.com>,
        Avri Altman <avri.altman@....com>,
        Bart Van Assche <bvanassche@....org>,
        "James E.J. Bottomley" <jejb@...ux.ibm.com>,
        "Martin K. Petersen" <martin.petersen@...cle.com>,
        Stanley Chu <stanley.chu@...iatek.com>,
        Bean Huo <beanhuo@...ron.com>,
        Asutosh Das <quic_asutoshd@...cinc.com>,
        "Bao D. Nguyen" <quic_nguyenb@...cinc.com>,
        Keoseong Park <keosung.park@...sung.com>,
        Arthur Simchaev <Arthur.Simchaev@....com>,
        linux-scsi@...r.kernel.org, linux-kernel@...r.kernel.org
Cc:     opensource.kernel@...o.com, luhongfei@...o.com,
        Tang Huan <tanghuan@...o.com>
Subject: [PATCH] scsi: ufs: Optimize the WB flush process to save device power consumption

In the original logic, WB Hibern Flush was always on.
During suspend flow, the host will determine whether the device needs
BKOP or WB flush, and if so, it will keep VCC supply.
WB flush is only a part of BKOP, and device that needs BKOP do not
necessarily need WB flush if the conditions are not met. Therefore,
if WB flush is not needed, it will be better to disable WB Hibern
Flush, which could save device power consumption. When WB Hibern
Flush is needed, enable it again.

In this way, the WB Hibern Flush always on strategy is changed to a dynamic
on/off strategy.

Signed-off-by: Lu Hongfei <luhongfei@...o.com>
Signed-off-by: Tang Huan <tanghuan@...o.com>
---
 drivers/ufs/core/ufshcd.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 983fae84d9e8..484d7fa96407 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -9592,13 +9592,20 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
 		 * If device needs to do BKOP or WB buffer flush during
 		 * Hibern8, keep device power mode as "active power mode"
 		 * and VCC supply.
+		 * If device does not need WB buffer flush now, it's better
+		 * to disable WB flush during H8 to save power consumption.
 		 */
-		hba->dev_info.b_rpm_dev_flush_capable =
-			hba->auto_bkops_enabled ||
-			(((req_link_state == UIC_LINK_HIBERN8_STATE) ||
-			((req_link_state == UIC_LINK_ACTIVE_STATE) &&
-			ufshcd_is_auto_hibern8_enabled(hba))) &&
-			ufshcd_wb_need_flush(hba));
+		hba->dev_info.b_rpm_dev_flush_capable = hba->auto_bkops_enabled;
+		if (((req_link_state == UIC_LINK_HIBERN8_STATE) ||
+		    ((req_link_state == UIC_LINK_ACTIVE_STATE) &&
+		    ufshcd_is_auto_hibern8_enabled(hba))) &&
+		    ufshcd_wb_need_flush(hba)) {
+			ufshcd_wb_toggle_buf_flush_during_h8(hba, true);
+			hba->dev_info.b_rpm_dev_flush_capable = true;
+		} else {
+			ufshcd_wb_toggle_buf_flush_during_h8(hba, false);
+		}
+
 	}
 
 	flush_work(&hba->eeh_work);
-- 
2.39.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ