From nobody Thu Apr 2 23:54:49 2026 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4019B2877FC for ; Sat, 14 Feb 2026 04:28:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771043327; cv=none; b=RyHnXs5vyCCx/zcoQFNdHPSVbFVvv8FlCry9U28e1Jfk1+yHb9q+CX0xOj+wlogueLtGzg8cnArLcW11CiYJyNJK+GlGmcRzMOQFfpu5beVHYNiAlohr5rmIiIIVFgWpaDFkbJkAW6/WEE2FwKW1O3eJJH3vvPn57PxMmhNBuUw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771043327; c=relaxed/simple; bh=HJYmALZM51O5F13S+sWSXtruVH1L8A6zHC17zV2Yl+w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iLPk5ApkkFT/4iDtR1mz0l/sQnay2wLEUrlyr1bFdaCQ+DkFvUZ2DJf3OgOo2a6+nZPH6vkKdHgprMsvYFYM6vMic1ygTxQJhPRFw9PjS3HG2j6NaKFQnJ4zJGntAYyTXoo32iCI0gUSVBNmnPwp1+dMwa5lUY6R1oeBMxP6JWQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=Tewz4tfw; arc=none smtp.client-ip=74.125.82.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="Tewz4tfw" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-1270be4d125so3698366c88.1 for ; Fri, 13 Feb 2026 20:28:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1771043314; x=1771648114; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=60jyQ1ZIQG8Pf4xFK6xEZaP994isrxae0+XCbgekpxA=; b=Tewz4tfwHu/3OXDCnFm+++uj1PW7fmp8DdvDzwd/PDAH3glbsJG1SGoaI8OA7+1oze qlhvofAzkAasWkMl1aVLAyhs1dVxn83fc3vDqVqggKBeYhIPk4FBz3gnAjLbuceLEN+X 1a2gITp5bxZF0r3BGBKBZw51si1s3Q6bOKeJLSAr+k2E87d6fJszSpz2ZFs/Wn5XqBDq VUUmLItowQxuX8wBabGcRvD4e8IeiYgWnTIHloZ9mXMjkkoPGXh9OwCOop8SCKSSQnwe 70qUaRdNcZ2/ziSp69BzciS1JpBnNZ3kbX5aaF5SVVvJGepESD/vFlBibGDf5IAsrkHM cQEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771043314; x=1771648114; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=60jyQ1ZIQG8Pf4xFK6xEZaP994isrxae0+XCbgekpxA=; b=VbhY4zTSh8WaB8GJafdvQxMsx1EW6zVi2JLUP4VrAPsZSdTPI7srQuUim1td5xhnZq IEeyRK4gHKxfbPeM7wtvHWMjO6O8nxHRTWtPj+ioVdkNHcDaT3VbWss9cOSmF2be2S6/ 2zafR0/EGOWTaRb9sW9fklXbpTZamgcHxB08W3oQsf3SCck+olvNZfjsAIEXV4T0O5su TrVhEx1lngevGM7RACVyEDkBgL03kLXQcgioHzezWwBkHjlTs3LHEQShfujB3t+q1zjd bhszuPVuOVESAnM/UOdSiidmXmOMnGXy17oR6ccQQKyggCa0txIKXrLB7q6HcUl6x/Xd oEDg== X-Forwarded-Encrypted: i=1; AJvYcCWC24TQoxo8yWncMdo1krVnMr73Tt2MNaZXc0KAic9MKcbHlLjJNh4jNilRnKafIM6IRbv6MhKiL8ozcRc=@vger.kernel.org X-Gm-Message-State: AOJu0Yyuf24WuCcmx0f9Ub80k/vDmhLgWPSVNY+kgMb9IUcWm2T765F8 uVIkQMoDFIRp5uguYuu4rvazM5mVIH7TjUFQVP3tNtFcdQUZD6rUasdOrUafueImfsM= X-Gm-Gg: AZuq6aI/D4anlF4vDWgZjkeLV3Ly1XanOVF99xETVdzi+mXjWyD1K7ZoVqx6/YeYFXH NTz+CMTMWFCY0v7IvT3RdIYmQ5gP0Z7SS2whcidhN35kfWO1VdmMWN+TTI6wbapWG1MMHkAYtYN yyIoacZP1rt/a6rSSZqfBUJdvbO27rUbcxTnWLVsGCygn6XkSJ0MOlNdbzS2LG/PstjrytyOzq+ aeK9x0XjbqOyc4BU2GU+/qDve3GupDBL0ETaZOkj3TpB6CThmKxl57KONjRZElwsdH9KnG9Le/A nQCh/Bi2J6ozRsJCtcFucTODY9N+IDKq2D7UpQaI4pwVUQdnPjvMKgiJNh3c1Nj5OBG6kndEqn5 6Xr/haJuyoQbZ3F9jj4btRuFS19zMMqA+0aG1/UD2SI8Flv6hnyiI6zxEdAsKbEaBCaUxitHwaU nRKU6buNZo0Gw+pVah04AF/uchC2BEgqI+LKuIaS150Topvg== X-Received: by 2002:a05:7022:793:b0:124:9acd:32d1 with SMTP id a92af1059eb24-12741b6348bmr821445c88.9.1771043314205; Fri, 13 Feb 2026 20:28:34 -0800 (PST) Received: from apollo.purestorage.com ([208.88.152.253]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-12742cbc900sm1021042c88.14.2026.02.13.20.28.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Feb 2026 20:28:33 -0800 (PST) From: Mohamed Khalfella To: Justin Tee , Naresh Gottumukkala , Paul Ely , Chaitanya Kulkarni , Christoph Hellwig , Jens Axboe , Keith Busch , Sagi Grimberg , James Smart , Hannes Reinecke Cc: Aaron Dailey , Randy Jennings , Dhaval Giani , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Mohamed Khalfella Subject: [PATCH v3 16/21] nvmet: Add support for CQT to nvme target Date: Fri, 13 Feb 2026 20:25:17 -0800 Message-ID: <20260214042753.4073668-17-mkhalfella@purestorage.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260214042753.4073668-1-mkhalfella@purestorage.com> References: <20260214042753.4073668-1-mkhalfella@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" TP4129 KATO Corrections and Clarifications defined CQT (Command Quiesce Time) which is used along with KATO (Keep Alive Timeout) to set an upper time limit for attempting Cross-Controller Recovery. CQT is added as a subsystem attribute that defaults to 0 to maintain the current behavior. Signed-off-by: Mohamed Khalfella --- drivers/nvme/target/admin-cmd.c | 1 + drivers/nvme/target/configfs.c | 31 +++++++++++++++++++++++++++++++ drivers/nvme/target/core.c | 3 +++ drivers/nvme/target/nvmet.h | 2 ++ include/linux/nvme.h | 5 ++++- 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cm= d.c index 925a81979278..5077a9ddba44 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -743,6 +743,7 @@ static void nvmet_execute_identify_ctrl(struct nvmet_re= q *req) id->cntlid =3D cpu_to_le16(ctrl->cntlid); id->ver =3D cpu_to_le32(ctrl->subsys->ver); if (!nvmet_is_disc_subsys(ctrl->subsys)) { + id->cqt =3D cpu_to_le16(ctrl->cqt); id->ciu =3D ctrl->ciu; id->cirn =3D cpu_to_le64(ctrl->cirn); id->ccrl =3D NVMF_CCR_LIMIT; diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index 127dae51fec1..c9b7a2eeeee5 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -1637,6 +1637,36 @@ static ssize_t nvmet_subsys_attr_pi_enable_store(str= uct config_item *item, CONFIGFS_ATTR(nvmet_subsys_, attr_pi_enable); #endif =20 +static ssize_t nvmet_subsys_attr_cqt_show(struct config_item *item, + char *page) +{ + return snprintf(page, PAGE_SIZE, "%u\n", to_subsys(item)->cqt); +} + +static ssize_t nvmet_subsys_attr_cqt_store(struct config_item *item, + const char *page, size_t cnt) +{ + struct nvmet_subsys *subsys =3D to_subsys(item); + struct nvmet_ctrl *ctrl; + u16 cqt; + + if (sscanf(page, "%hu\n", &cqt) !=3D 1) + return -EINVAL; + + down_write(&nvmet_config_sem); + if (subsys->cqt =3D=3D cqt) + goto out; + + subsys->cqt =3D cqt; + /* Force reconnect */ + list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry) + ctrl->ops->delete_ctrl(ctrl); +out: + up_write(&nvmet_config_sem); + return cnt; +} +CONFIGFS_ATTR(nvmet_subsys_, attr_cqt); + static ssize_t nvmet_subsys_attr_qid_max_show(struct config_item *item, char *page) { @@ -1677,6 +1707,7 @@ static struct configfs_attribute *nvmet_subsys_attrs[= ] =3D { &nvmet_subsys_attr_attr_vendor_id, &nvmet_subsys_attr_attr_subsys_vendor_id, &nvmet_subsys_attr_attr_model, + &nvmet_subsys_attr_attr_cqt, &nvmet_subsys_attr_attr_qid_max, &nvmet_subsys_attr_attr_ieee_oui, &nvmet_subsys_attr_attr_firmware, diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index a9f8a2242703..886083bb7a83 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1718,6 +1718,7 @@ struct nvmet_ctrl *nvmet_alloc_ctrl(struct nvmet_allo= c_ctrl_args *args) ctrl->cntlid =3D ret; =20 if (!nvmet_is_disc_subsys(ctrl->subsys)) { + ctrl->cqt =3D subsys->cqt; ctrl->ciu =3D get_random_u8() ? : 1; ctrl->cirn =3D get_random_u64(); } @@ -1958,10 +1959,12 @@ struct nvmet_subsys *nvmet_subsys_alloc(const char = *subsysnqn, =20 switch (type) { case NVME_NQN_NVME: + subsys->cqt =3D NVMF_CQT_MS; subsys->max_qid =3D NVMET_NR_QUEUES; break; case NVME_NQN_DISC: case NVME_NQN_CURR: + subsys->cqt =3D 0; subsys->max_qid =3D 0; break; default: diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index 0ed41a3d0562..00528feeb3cd 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -265,6 +265,7 @@ struct nvmet_ctrl { =20 uuid_t hostid; u16 cntlid; + u16 cqt; u8 ciu; u32 kato; u64 cirn; @@ -342,6 +343,7 @@ struct nvmet_subsys { #ifdef CONFIG_NVME_TARGET_DEBUGFS struct dentry *debugfs_dir; #endif + u16 cqt; u16 max_qid; =20 u64 ver; diff --git a/include/linux/nvme.h b/include/linux/nvme.h index fc33ae48d149..f6d66dadc5b1 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -21,6 +21,7 @@ #define NVMF_TRADDR_SIZE 256 #define NVMF_TSAS_SIZE 256 =20 +#define NVMF_CQT_MS 0 #define NVMF_CCR_LIMIT 4 #define NVMF_CCR_PER_PAGE 511 =20 @@ -368,7 +369,9 @@ struct nvme_id_ctrl { __u8 anacap; __le32 anagrpmax; __le32 nanagrpid; - __u8 rsvd352[160]; + __u8 rsvd352[34]; + __le16 cqt; + __u8 rsvd388[124]; __u8 sqes; __u8 cqes; __le16 maxcmd; --=20 2.52.0