From nobody Sun May 11 04:58:50 2025
Received: from out162-62-57-252.mail.qq.com (out162-62-57-252.mail.qq.com
 [162.62.57.252])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4114D1EE02A
	for <linux-kernel@vger.kernel.org>; Tue,  1 Apr 2025 09:27:09 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=162.62.57.252
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1743499635; cv=none;
 b=nczqqrmncIScLGrqKebFvKaLUAajcNaMZEj8zd3QYS9cmEqWVzKokHV28Bn3dAW+iznv8QpuZXcqpIm2aWTTCfsyldAyOO9GuXSp/XaFpo58vP6R61ByEjawT4C5GxYZEvm1Dr6othZOKI9I7o9tAuAfDklpDTVmcU5c71O9p0s=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1743499635; c=relaxed/simple;
	bh=cHc8cRI//OpL7HrOGQZOpapIfyn1fJ7Fp5evzrZ0Fa0=;
	h=Message-ID:From:To:Cc:Subject:Date:In-Reply-To:References:
	 MIME-Version;
 b=TxppNhgtBsyEdugjVINciVOVJZlD/a2fddF+fgaUPHqP2B85t2UoY9nL74H3kSMf/nZbdDEitKIdJ0tKwMCrEuWRKPNCahcF+ni9GZ1IiR9g9N5YLKr+cw4tfHrqb1kKw8Kwci/6iG0239ehGknHHaMlRk5fxqic3UqiGaCZMWQ=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=qq.com;
 spf=pass smtp.mailfrom=qq.com;
 dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b=f408uEa6;
 arc=none smtp.client-ip=162.62.57.252
Authentication-Results: smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=qq.com
Authentication-Results: smtp.subspace.kernel.org;
 spf=pass smtp.mailfrom=qq.com
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b="f408uEa6"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;
	t=1743499615; bh=zhM28tVWB3zXR2MALinPT7qj4zaeGBFg9qNIBSW/QlQ=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References;
	b=f408uEa68Y0Pbl8jekBG+WKxATFYADQukS1qlSgW46hQO4squwmKG87UQb+OGTMdG
	 O0ndpW4ZkAZPi/i5QPtCjI85/326yAC21lBr1TA72YkwVZIxSjMz5nkVGz5vuQL5/A
	 jVKSTFaYzTaIt3MHR+zKl+2LRMYPvDhA82HhhOEo=
Received: from localhost.localdomain ([116.128.244.169])
	by newxmesmtplogicsvrsza36-0.qq.com (NewEsmtp) with SMTP
	id 6B53F051; Tue, 01 Apr 2025 17:26:53 +0800
X-QQ-mid: xmsmtpt1743499613t65g81ywp
Message-ID: <tencent_A06D513AE17E9D4B4AC66E84F447FE730C09@qq.com>
X-QQ-XMAILINFO: MRMtjO3A6C9Xd9qg9PKd1L7ecbnL0lynqHNnxKuTMmdGAMkkOIYWNLozW797TD
	 ENDQVpt6rsUXT6O1fZ/bK70oUEi/UNeQXLsIEgbQFdhWCB8xkj03YMG5V/HJxwhDZ5wpCcVf8D9K
	 Hqhu+Kf0iXuGCDIe1NfXfl0CKeGuCvuGwHCCQmb1alRiFbq4v09uCXMNw6YNph6+/HjniRZOD3hL
	 yMfDpr+QLrxMy4r7WTxBQoDAplQo/GsY9WmK7fJIwd1F3byop+lP0SdUIEZ/EgySWAXYpQUqO689
	 BaJtgvxc8xLEGy2o9lGA6mBW8ZHylBFFFuISulKZ+GJtDzWzWmZaSXIb3a4ea2oLyTCq5Y3zljwi
	 qfaMF8ke7D49AN9qa49gOhT/1KRQvB/leKgicWtrxiQffR8R+EPRCNdKlc42HtmMxI5ufBt8jQvq
	 8B9CWQeiRTxvFPO269dNSc9PX6f5ROLyxD/uEruA7MsR0AZmM4kUwgy7fj4ZnKY7ZuRE8TsFnwws
	 fUznhoeJD7qrgsu+1+h+mcfOSJAirq58qG/dLzDTjWLmVC9DZ9/PKPbXG/eneJrJO/TmIAYfzlVJ
	 fRYHqqddhLVsB39wG3AeaqwatpWUfFZhETanEwsU1CoBm1Q9zmohqvHFLBZPs+/mXmnsj8Oxxw+Y
	 NvUtUoim4ZkN8CBEUSmb8H/GnB4sunoib7YGEH6ZA5DBiACALtH3g9IFgKf/l6NjmjDcvUhi8ozc
	 rmya8YrZAPs+tBwIDf9hff7+qLB06ndvwsT7TZKrs4QzV2Kgz1CNkAakiEo0PakRjMe8XfRGDo3u
	 D6gN6NijNbEOj6ZyED4mfim4YndopWFdnqBH7+Ks6UrEeb1VYUKlKK1KkBvsJU932aezMKwBEliw
	 Y1wm12IvuhrboPXvSUeIn+6oq2ws0rKRh0+vyN2OIdm9xDwDlS4ZaIgo0C/+ehvExRiIWhLu3wmN
	 NYVjjGRKQn9CS0T/NVQpMeXBr+x4p21osdlTwAY0J2T8xDIPwzJbCr9EbzWtpXr6GgleP2RF8=
X-QQ-XMRINFO: OWPUhxQsoeAVDbp3OJHYyFg=
From: Yaxiong Tian <iambestgod@qq.com>
To: kbusch@kernel.org,
	axboe@kernel.dk,
	hch@lst.de,
	sagi@grimberg.me,
	chaitanyak@nvidia.com
Cc: linux-nvme@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Yaxiong Tian <tianyaxiong@kylinos.cn>,
	Chaitanya Kulkarni <kch@nvidia.com>
Subject: [PATCH v3 1/3] nvme: Add warning for PST table memory allocation
 failure in nvme_configure_apst
Date: Tue,  1 Apr 2025 17:26:52 +0800
X-OQ-MSGID: <20250401092652.1557590-1-iambestgod@qq.com>
X-Mailer: git-send-email 2.25.1
In-Reply-To: <tencent_4612952C8C5109058CD8E688D81276A2FD0A@qq.com>
References: <tencent_4612952C8C5109058CD8E688D81276A2FD0A@qq.com>
Precedence: bulk
X-Mailing-List: linux-kernel@vger.kernel.org
List-Id: <linux-kernel.vger.kernel.org>
List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org>
List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Yaxiong Tian <tianyaxiong@kylinos.cn>

Currently the function fails silently on PST table memory allocation failur=
e.
Add warning messages to improve error visibility.

Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Yaxiong Tian <tianyaxiong@kylinos.cn>
---
 drivers/nvme/host/core.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index c2d89fac86c5..fb0404fee551 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2678,8 +2678,10 @@ static int nvme_configure_apst(struct nvme_ctrl *ctr=
l)
 	}
=20
 	table =3D kzalloc(sizeof(*table), GFP_KERNEL);
-	if (!table)
+	if (!table) {
+		dev_warn(ctrl->device, "Failed to allocate pst table; not using APST\n");
 		return 0;
+	}
=20
 	if (!ctrl->apst_enabled || ctrl->ps_max_latency_us =3D=3D 0) {
 		/* Turn off APST. */
--=20
2.25.1
From nobody Sun May 11 04:58:50 2025
Received: from out203-205-221-164.mail.qq.com (out203-205-221-164.mail.qq.com
 [203.205.221.164])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C6552AEFE
	for <linux-kernel@vger.kernel.org>; Tue,  1 Apr 2025 09:32:19 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=203.205.221.164
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1743499943; cv=none;
 b=Me79sUCsPEnOXtwMdXUF3uzY3KKR0TmgAc9h80k0wQN262BkTdIr4+b1ej/uI5Z+6fa6DaGX+mc7xL6l+GC5d9rHVRTcK4E09x0aoTZGTa1Hz617l8h/s6ZTmWf1ldaZLtBVYa481cC+LHBzNmP5w3bmYFjpPtg0c4cMxMdcirs=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1743499943; c=relaxed/simple;
	bh=OAKVSvRwfQi5FNmnLndFBbj2HUDr15x02ukw7LAYHkY=;
	h=Message-ID:From:To:Cc:Subject:Date:In-Reply-To:References:
	 MIME-Version;
 b=EG/KGKVGflTB/ptEReA1ot14CumNRvo47aBRsXon9umUoouBpNpCNE9P3E90IxXV+9QTm9CnJAZu+WlTrwnsqGkKfZMmwNkSk3YcD47FND9gmECvTWb4BblCUOz5U6wP/mNqczFooTj3H/8TL8Xqa5NorSgMqlgFT/OxP/sDAzc=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=qq.com;
 spf=pass smtp.mailfrom=qq.com;
 dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b=yzJjk7lv;
 arc=none smtp.client-ip=203.205.221.164
Authentication-Results: smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=qq.com
Authentication-Results: smtp.subspace.kernel.org;
 spf=pass smtp.mailfrom=qq.com
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b="yzJjk7lv"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;
	t=1743499626; bh=rHnNmt3+i6+Fmmxq3LKb4Rz5gmJ6NIMisYM0ZQcKssA=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References;
	b=yzJjk7lvm4rMAyz3Fuf3CKntuGeNeE6UGeKvFpTQWZh/sW92MKYKH5WYanzQDhKz8
	 i1kWs40Pf15vKlYCi5m5dT3BaAhI19fXVhduwcEprzCmK6D4MpNM2VjuIp2JdaCdRZ
	 6xx3BT3xwlMtsF8/g16CwfrAccjvPv3393U+fKbU=
Received: from localhost.localdomain ([116.128.244.169])
	by newxmesmtplogicsvrszc16-0.qq.com (NewEsmtp) with SMTP
	id 6C41646E; Tue, 01 Apr 2025 17:27:04 +0800
X-QQ-mid: xmsmtpt1743499624txlq3fgvi
Message-ID: <tencent_46894AB4C702852846EC72D26C273B817E09@qq.com>
X-QQ-XMAILINFO: NbgegmlEc3JuPn2KFxiEiDoj/jELAQe4blJkXPNJwF33bp2e/1jHKrg4+l/tpb
	 +FNG6swqazzHmsJ7vA8SZ0ez7lULzJc/kX1EqGyjlDD6WLwfenzEv0Tapnn2ZrzmBcL0CJOWnW/c
	 2ZJCGYFTKN7/UgvON1GePZmqSvRXki4jDPsFwvLm0Sk4wOe3giuG/WVfqcQAJGkISXVZknD3nXoC
	 X9qu3L+217VWL88XNpGXOMDx5onruI7ObrzHnGJXF64Wbve4oL1QbcjL9/XkzacxKhY2qQIXJai+
	 NXZGH2q7XQ/DmbAreNQRtr7lN3Io/NH7UNNI7L3/AQdjlLoDwd5jqI4l4x7r61kWR9VR44asJ5Va
	 6W8mjNIaDQcqQxeXy0gaiKM6O7QSCwTOJZk3mfoZmMaCm0zBP8yvubcjSnohY0jW5a0oBQPgltYC
	 0bT0tsL7qVNRDB4UxnXjEfrfajOXX1qJs0SW+icYXNymIkJRh34rXf4swG8ez7hROl96i7lgnPIX
	 Zy6xshhtYLeGsOVZ4HpEDPNB+3ur2H8K7Bx2akuPlTvRglHxL5r2TSWduWz2Ry+n3663aZ9U/eop
	 kqUDjtVmqgG3rWQwsJCfvBOAbGe1kLqjcBV2M7Qd95s/uu7EJlwqbvi/puEFxDKQbPILInN4ZvqV
	 ZplKy7AUoxPjoR/VOW1zsv8Kx64JJe1irFhpBypaHIFJb7BapReEixHPmJpVoSCQUXtouVLLksOh
	 LSBTEbp9VMDrYpHsCQHUJ/Ec9Qc2UODqdID5vIgYuHXZ30b/wlOEurkcM3BxtjlE9GMU12ldDn+8
	 ro1KNzMRPB7tz6wYc4ZacJ/koQGoLYA7cxx2wkALt7DeaTHNEe5EMSlclkGEVAJGJlrMHyfpuN1p
	 t3gtF3YHDRAyb3F761TAdy5Z10XX+lG0Wxd4p33YcUWyux1ws736wVl+EAkIoU7QbYz+8FZtML3b
	 7MHpEodAS1O2JuF3gY+WoX0m1UvP0s83Rzlq5oTfFQEgA/9YEfUQIJRbO1wbrLIkOHdkcMU5/CCn
	 kxv5nYuhsnr12eWbiU
X-QQ-XMRINFO: Mp0Kj//9VHAxr69bL5MkOOs=
From: Yaxiong Tian <iambestgod@qq.com>
To: kbusch@kernel.org,
	axboe@kernel.dk,
	hch@lst.de,
	sagi@grimberg.me,
	chaitanyak@nvidia.com
Cc: linux-nvme@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Yaxiong Tian <tianyaxiong@kylinos.cn>
Subject: [PATCH v3 2/3] nvme: add sysfs interface for APST table updates
Date: Tue,  1 Apr 2025 17:27:02 +0800
X-OQ-MSGID: <20250401092702.1558230-1-iambestgod@qq.com>
X-Mailer: git-send-email 2.25.1
In-Reply-To: <tencent_4612952C8C5109058CD8E688D81276A2FD0A@qq.com>
References: <tencent_4612952C8C5109058CD8E688D81276A2FD0A@qq.com>
Precedence: bulk
X-Mailing-List: linux-kernel@vger.kernel.org
List-Id: <linux-kernel.vger.kernel.org>
List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org>
List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Yaxiong Tian <tianyaxiong@kylinos.cn>

In desktop systems, users can choose between power-saving mode and
performance mode. These two modes involve different trade-offs between
NVMe performance and power efficiency, thus requiring dynamic updates to AP=
ST.

Currently, the APST (Autonomous Power State Transition) table can only be
updated during module initialization via module parameters or indirectly
by setting QoS latency requirements. This patch adds a direct sysfs
interface to allow dynamic updates to the APST table at runtime.

The new sysfs entry is created at:
/sys/class/nvme/<controller>/apst_update

This provides more flexibility in power management tuning without
requiring module reload or QoS latency changes.

Example usage:
update nvme module parameters.
echo 1  > /sys/class/nvme/nvme0/apst_update

Signed-off-by: Yaxiong Tian  <tianyaxiong@kylinos.cn>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
---
 drivers/nvme/host/core.c  |  9 +++++++--
 drivers/nvme/host/nvme.h  |  2 ++
 drivers/nvme/host/sysfs.c | 24 ++++++++++++++++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index fb0404fee551..9dea1046b8b4 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2654,7 +2654,7 @@ static bool nvme_apst_get_transition_time(u64 total_l=
atency,
  *
  * Users can set ps_max_latency_us to zero to turn off APST.
  */
-static int nvme_configure_apst(struct nvme_ctrl *ctrl)
+int nvme_configure_apst(struct nvme_ctrl *ctrl)
 {
 	struct nvme_feat_auto_pst *table;
 	unsigned apste =3D 0;
@@ -2778,8 +2778,11 @@ static void nvme_set_latency_tolerance(struct device=
 *dev, s32 val)
=20
 	if (ctrl->ps_max_latency_us !=3D latency) {
 		ctrl->ps_max_latency_us =3D latency;
-		if (nvme_ctrl_state(ctrl) =3D=3D NVME_CTRL_LIVE)
+		if (nvme_ctrl_state(ctrl) =3D=3D NVME_CTRL_LIVE) {
+			mutex_lock(&ctrl->apst_lock);
 			nvme_configure_apst(ctrl);
+			mutex_unlock(&ctrl->apst_lock);
+		}
 	}
 }
=20
@@ -4852,6 +4855,8 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct dev=
ice *dev,
 	ctrl->ka_cmd.common.opcode =3D nvme_admin_keep_alive;
 	ctrl->ka_last_check_time =3D jiffies;
=20
+	mutex_init(&ctrl->apst_lock);
+
 	BUILD_BUG_ON(NVME_DSM_MAX_RANGES * sizeof(struct nvme_dsm_range) >
 			PAGE_SIZE);
 	ctrl->discard_page =3D alloc_page(GFP_KERNEL);
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 51e078642127..7f8e10f5bf7a 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -385,6 +385,7 @@ struct nvme_ctrl {
 	key_serial_t tls_pskid;
=20
 	/* Power saving configuration */
+	struct mutex apst_lock;
 	u64 ps_max_latency_us;
 	bool apst_enabled;
=20
@@ -828,6 +829,7 @@ void nvme_unfreeze(struct nvme_ctrl *ctrl);
 void nvme_wait_freeze(struct nvme_ctrl *ctrl);
 int nvme_wait_freeze_timeout(struct nvme_ctrl *ctrl, long timeout);
 void nvme_start_freeze(struct nvme_ctrl *ctrl);
+int nvme_configure_apst(struct nvme_ctrl *ctrl);
=20
 static inline enum req_op nvme_req_op(struct nvme_command *cmd)
 {
diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c
index 6d31226f7a4f..20146eb4c671 100644
--- a/drivers/nvme/host/sysfs.c
+++ b/drivers/nvme/host/sysfs.c
@@ -684,6 +684,29 @@ static DEVICE_ATTR(dhchap_ctrl_secret, S_IRUGO | S_IWU=
SR,
 	nvme_ctrl_dhchap_ctrl_secret_show, nvme_ctrl_dhchap_ctrl_secret_store);
 #endif
=20
+static ssize_t apst_update_store(struct device *dev,
+					      struct device_attribute *attr,
+					      const char *buf, size_t size)
+{
+	struct nvme_ctrl *ctrl =3D dev_get_drvdata(dev);
+	bool bool_data =3D false;
+	int err;
+
+	err =3D kstrtobool(buf, &bool_data);
+
+	if (err)
+		return err;
+
+	if (bool_data && nvme_ctrl_state(ctrl) =3D=3D NVME_CTRL_LIVE) {
+		mutex_lock(&ctrl->apst_lock);
+		nvme_configure_apst(ctrl);
+		mutex_unlock(&ctrl->apst_lock);
+	}
+
+	return size;
+}
+static DEVICE_ATTR_WO(apst_update);
+
 static struct attribute *nvme_dev_attrs[] =3D {
 	&dev_attr_reset_controller.attr,
 	&dev_attr_rescan_controller.attr,
@@ -712,6 +735,7 @@ static struct attribute *nvme_dev_attrs[] =3D {
 	&dev_attr_dhchap_ctrl_secret.attr,
 #endif
 	&dev_attr_adm_passthru_err_log_enabled.attr,
+	&dev_attr_apst_update.attr,
 	NULL
 };
=20
--=20
2.25.1
From nobody Sun May 11 04:58:50 2025
Received: from out162-62-58-216.mail.qq.com (out162-62-58-216.mail.qq.com
 [162.62.58.216])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id C18D61624D5
	for <linux-kernel@vger.kernel.org>; Tue,  1 Apr 2025 09:33:33 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=162.62.58.216
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1743500017; cv=none;
 b=gf61OMzkYXcLKv8Bm/UGJCyRecPBdEo1eanP1qdCje9H6G6oRC68Nat+72RspiP3bn1QfmCo3pk0z3+GCgLJ2luS7VjeV5d1QsqQf54CrqF0GVZ7PNAR1nXbo+IZyb+hCNT7RRb3NB9XXJjpKooJY9PXdPr/LzIBwfwl+bOajJc=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1743500017; c=relaxed/simple;
	bh=tjvcp4POZcgFYSJi6w8QFtqD88zOShmsfmbQ949KIF8=;
	h=Message-ID:From:To:Cc:Subject:Date:In-Reply-To:References:
	 MIME-Version;
 b=koZrroD8qzJBqBASaeDEVVWM+VRl4UgZwT9rHaFwaLaZnkwvC3V0uOi1XgL3qqmsHsCC35196Rx7QxP1UPgi+zetrnPi9ffk41ITSGJDcnzbKWMoFwz2QJLgpZPb1mmlRuvOBWEAwChZI3d+MTPxx/EGvybsRE4RIWuFgkAE708=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=qq.com;
 spf=pass smtp.mailfrom=qq.com;
 dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b=WgDz5MMh;
 arc=none smtp.client-ip=162.62.58.216
Authentication-Results: smtp.subspace.kernel.org;
 dmarc=pass (p=quarantine dis=none) header.from=qq.com
Authentication-Results: smtp.subspace.kernel.org;
 spf=pass smtp.mailfrom=qq.com
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b="WgDz5MMh"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;
	t=1743500009; bh=QEYVKhECladfxjqyKQSzAOMcOlFrMVaRY3xj2wEcNhc=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References;
	b=WgDz5MMh82Mv7X5fG5PXPmMymuq738j7zT05yyU3Q0U0HlPM7sC+7ARNW23OyAo41
	 U4IR08PRABBpyt3zWv3mIcphzzzpxMq70BYdCc77WP1wCswVejKJdhaEOsRSb5Mu0s
	 K4h2vl4onzbKs9JqRmgzaXGYwXoobZrXXfNY86Pg=
Received: from localhost.localdomain ([116.128.244.169])
	by newxmesmtplogicsvrszb16-1.qq.com (NewEsmtp) with SMTP
	id 6CC3BEF9; Tue, 01 Apr 2025 17:27:12 +0800
X-QQ-mid: xmsmtpt1743499632trvvhpf3l
Message-ID: <tencent_1B8B23E13980B65C9D11BFCA253F636E4208@qq.com>
X-QQ-XMAILINFO: OZZSS56D9fAjdaSckX8XONgCXT6acTC9p1TuZ1I/AgH3J44VKB3DA3dBdicJwN
	 kQ85NILCbkJYqYK0PCkm4ZvBhPmC/qLjQzwC+IzjvlVB8NvEJvGvC3YTBjrsLBo4WzyXjdlDkG9x
	 y2rpuMiVchYqXoFbdGHxJ4rFFLgjXU2dwvDZB2nekpdAB0RbnUjG9GyPR7qyqZdc51LZFJJ3H3b8
	 dikSdMpBg7EqlWIrWm944DaUm0xZkepk8DVM3z8Ce7Dg8JjwbWeeT/pLoVmERU20/RSGhwQW5ku0
	 xkIlr2XmsDchUAEV5neyV9UfiBw3+gQ1AuxN+DlQeL/tcaOBVpzJM183o5BpWsxAzJYTEGpG+h5v
	 8bfLXjOLxf7OMyBExbPeBLTeuKodnTQ+NizdT8e8+OveCppjV48/x2SzJrokbbjAWfs1Epw0N6mr
	 1psVfY4Y0qTrUDN9w6RHqun1NRIMFOjKAtdDHYhG40N95+ABgLOzjiPQkamGpgYzrIs27/E005bd
	 BULjDzER0Kse/ECavuZu5jYEDOBaNmjXxznatcq1dskBe/l/mLXdmARcDZOPORQw+OsiizpHdddw
	 j46w9IS3aREPyqn0wpleff62nkIH2yvc7NjSqKk2ROfwsXDeKQhzYWhfIIyFeSsjtmhHsddLZZhw
	 FWaD0NBt18zZGYl+S9bwCN17jPcR6IcZoq8G8ZMWaRA/0TP+eJCSk0flyZNXRdRCSUBUy2FwrMPQ
	 +neerZmSojOxUg43/u+zXwWUZZQfxAX4/pKdi+nw/WyDChPyr6A22IHmiYuV5h1rSmBmwDky/9wm
	 f6Q/7LHj0YKRs64tBCHXU7sF4BZvj3GbcAqwc36Wu8kYkDg3UU2BW0mn8fwCXAicK9UvcFzbBWK1
	 Adhya+wM3cwMcjq7GhPn5uqnjtGPEDZfRQbaQiN9oqbA0/LSra5XJ16aUW1kmW6ub9kH56BdgEss
	 mfYnucMO8ZfC2PRvwSTOYfmE8wNNA2+haXPdFfDhQ=
X-QQ-XMRINFO: Nq+8W0+stu50PRdwbJxPCL0=
From: Yaxiong Tian <iambestgod@qq.com>
To: kbusch@kernel.org,
	axboe@kernel.dk,
	hch@lst.de,
	sagi@grimberg.me,
	chaitanyak@nvidia.com
Cc: linux-nvme@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Yaxiong Tian <tianyaxiong@kylinos.cn>
Subject: [PATCH v3 3/3] nvme: add per-controller sysfs interface for APST
 configuration
Date: Tue,  1 Apr 2025 17:27:11 +0800
X-OQ-MSGID: <20250401092711.1558779-1-iambestgod@qq.com>
X-Mailer: git-send-email 2.25.1
In-Reply-To: <tencent_4612952C8C5109058CD8E688D81276A2FD0A@qq.com>
References: <tencent_4612952C8C5109058CD8E688D81276A2FD0A@qq.com>
Precedence: bulk
X-Mailing-List: linux-kernel@vger.kernel.org
List-Id: <linux-kernel.vger.kernel.org>
List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org>
List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Yaxiong Tian <tianyaxiong@kylinos.cn>

Currently, APST (Autonomous Power State Transition) parameters are
configured as module parameters affecting all controllers uniformly,
 This lacks flexibility for heterogeneous systems.

This patch introduces per-controller sysfs attributes under each NVMe
controller's sysfs directory:
- apst_primary_timeout_ms
- apst_secondary_timeout_ms
- apst_primary_latency_tol_us
- apst_secondary_latency_tol_us

The attributes allow runtime configuration of: Timeout values for
primary/secondary states.

The existing module parameters are retained for backward compatibility
but now only serve as default values for new controllers.

Signed-off-by: Yaxiong Tian <tianyaxiong@kylinos.cn>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
---
 drivers/nvme/host/core.c  | 16 ++++++++++------
 drivers/nvme/host/nvme.h  |  4 ++++
 drivers/nvme/host/sysfs.c | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 9dea1046b8b4..c999bd905d10 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2608,22 +2608,22 @@ static int nvme_configure_host_options(struct nvme_=
ctrl *ctrl)
  * timeout value is returned and the matching tolerance index (1 or 2) is
  * reported.
  */
-static bool nvme_apst_get_transition_time(u64 total_latency,
+static bool nvme_apst_get_transition_time(struct nvme_ctrl *ctrl, u64 tota=
l_latency,
 		u64 *transition_time, unsigned *last_index)
 {
-	if (total_latency <=3D apst_primary_latency_tol_us) {
+	if (total_latency <=3D ctrl->apst_primary_latency_tol_us) {
 		if (*last_index =3D=3D 1)
 			return false;
 		*last_index =3D 1;
-		*transition_time =3D apst_primary_timeout_ms;
+		*transition_time =3D ctrl->apst_primary_timeout_ms;
 		return true;
 	}
 	if (apst_secondary_timeout_ms &&
-		total_latency <=3D apst_secondary_latency_tol_us) {
+		total_latency <=3D ctrl->apst_secondary_latency_tol_us) {
 		if (*last_index <=3D 2)
 			return false;
 		*last_index =3D 2;
-		*transition_time =3D apst_secondary_timeout_ms;
+		*transition_time =3D ctrl->apst_secondary_timeout_ms;
 		return true;
 	}
 	return false;
@@ -2728,7 +2728,7 @@ int nvme_configure_apst(struct nvme_ctrl *ctrl)
 		 * for higher power states.
 		 */
 		if (apst_primary_timeout_ms && apst_primary_latency_tol_us) {
-			if (!nvme_apst_get_transition_time(total_latency_us,
+			if (!nvme_apst_get_transition_time(ctrl, total_latency_us,
 					&transition_ms, &last_lt_index))
 				continue;
 		} else {
@@ -4856,6 +4856,10 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct de=
vice *dev,
 	ctrl->ka_last_check_time =3D jiffies;
=20
 	mutex_init(&ctrl->apst_lock);
+	ctrl->apst_primary_timeout_ms =3D apst_primary_timeout_ms;
+	ctrl->apst_secondary_timeout_ms =3D apst_secondary_timeout_ms;
+	ctrl->apst_primary_latency_tol_us =3D apst_primary_latency_tol_us;
+	ctrl->apst_secondary_latency_tol_us =3D apst_secondary_latency_tol_us;
=20
 	BUILD_BUG_ON(NVME_DSM_MAX_RANGES * sizeof(struct nvme_dsm_range) >
 			PAGE_SIZE);
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 7f8e10f5bf7a..ed9afc3c6781 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -387,6 +387,10 @@ struct nvme_ctrl {
 	/* Power saving configuration */
 	struct mutex apst_lock;
 	u64 ps_max_latency_us;
+	u64 apst_primary_timeout_ms;
+	u64 apst_secondary_timeout_ms;
+	u64 apst_primary_latency_tol_us;
+	u64 apst_secondary_latency_tol_us;
 	bool apst_enabled;
=20
 	/* PCIe only: */
diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c
index 20146eb4c671..77912e95aff8 100644
--- a/drivers/nvme/host/sysfs.c
+++ b/drivers/nvme/host/sysfs.c
@@ -684,6 +684,39 @@ static DEVICE_ATTR(dhchap_ctrl_secret, S_IRUGO | S_IWU=
SR,
 	nvme_ctrl_dhchap_ctrl_secret_show, nvme_ctrl_dhchap_ctrl_secret_store);
 #endif
=20
+#define nvme_apst_show_and_store_function(field)				\
+static ssize_t field##_show(struct device *dev,		\
+			    struct device_attribute *attr, char *buf)	\
+{									\
+	struct nvme_ctrl *ctrl =3D dev_get_drvdata(dev);			\
+\
+	return sysfs_emit(buf, "%llu\n", ctrl->field);	\
+}									\
+									\
+static ssize_t field##_store(struct device *dev,		\
+			     struct device_attribute *attr,		\
+			     const char *buf, size_t size)		\
+{									\
+	struct nvme_ctrl *ctrl =3D dev_get_drvdata(dev);			\
+	u64 data =3D 0;					\
+	int err;						\
+\
+	err =3D kstrtou64(buf, 0, &data);		\
+	if (err < 0)						\
+		return err;						\
+							\
+	mutex_lock(&ctrl->apst_lock);		\
+	ctrl->field =3D data; 	\
+	mutex_unlock(&ctrl->apst_lock);		\
+	return size;			\
+}									\
+static DEVICE_ATTR_RW(field);
+
+nvme_apst_show_and_store_function(apst_primary_timeout_ms);
+nvme_apst_show_and_store_function(apst_secondary_timeout_ms);
+nvme_apst_show_and_store_function(apst_primary_latency_tol_us);
+nvme_apst_show_and_store_function(apst_secondary_latency_tol_us);
+
 static ssize_t apst_update_store(struct device *dev,
 					      struct device_attribute *attr,
 					      const char *buf, size_t size)
@@ -735,6 +768,11 @@ static struct attribute *nvme_dev_attrs[] =3D {
 	&dev_attr_dhchap_ctrl_secret.attr,
 #endif
 	&dev_attr_adm_passthru_err_log_enabled.attr,
+
+	&dev_attr_apst_primary_timeout_ms.attr,
+	&dev_attr_apst_secondary_timeout_ms.attr,
+	&dev_attr_apst_primary_latency_tol_us.attr,
+	&dev_attr_apst_secondary_latency_tol_us.attr,
 	&dev_attr_apst_update.attr,
 	NULL
 };
--=20
2.25.1