From nobody Tue Dec 2 00:02:41 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (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 BC13F30C353 for ; Wed, 26 Nov 2025 02:13:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764123209; cv=none; b=tw2ZHD/Ob2eiqAIBVt9y8PH6A0+HKZ+ClwMz1I72e3qb0gf8QnVWKCnLxLElIYusOgnefnwgbp9oVk/AcXRPA6dgw8KLCVNHXl9s7sxHIO0WWwrSmAhQZ2cWHICjakT3SzHbHv4xffrrAhJ7WiljbrCUhhcKAJNoSHWYO2iNgNA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764123209; c=relaxed/simple; bh=raOeNl2i6OnBrbh8eY6JByTnAnDmQNOmi6Ih/+dKDK8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qmJZX4NjtVfRHcROb+HZZZAVEySjd+X0Y9cDyhz5sMqM1T4MenV5+RtX3xD30ODmeKIYqCD05Dp3kGT2amgUNaeQoVnhK/H+rmxh5f0T0L9ZA43P3jLOJxo74T8U0t/G6yBc+FdqgMZnz6Ij7CjQI6VDACp5FnKDGwZn1QiDiK4= 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=VUCBqMO4; arc=none smtp.client-ip=209.85.215.181 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="VUCBqMO4" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-bd1b0e2c1eeso4763296a12.0 for ; Tue, 25 Nov 2025 18:13:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1764123207; x=1764728007; 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=Fup6CIzZoN1mUgXTOLLZWG3yGagOqWK2m84nC1cywRc=; b=VUCBqMO49cvMSwEwh+nIz7L106Yi320E7mDDO2bcLOV90B6vrLPCK51i5KawyUkxoz IUHgkFR0sNn3BaFzUwLGnJcbVNC12VQcrgrtaDVR18qqb0QWNgl2zU3K5XwCxWDhkBiA /gAZRCHIdqpxkhgWINwBVPuC/Vp37MxOdxdespw4/OHbQYDK/w6OdUNCKcD4AExjaMct 7E/7guQFysOlK5q6LznuKYhARqaRVWGE47InXP30JWABMpMtVnvO68PQrxZf2ymZqau3 5z50JEByroMIThA/ggVYyvq0JKf/x+pEp2S4kiJEHxgj5SxZY4Uj4DEdbdTnaq0XV7z6 Ig9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764123207; x=1764728007; 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=Fup6CIzZoN1mUgXTOLLZWG3yGagOqWK2m84nC1cywRc=; b=j3/97HvqxNlWY8P5/PRGDP/E58r0rTgun98PewFT4RiTzSHwyhlVpVZbNCHLFjzxh9 Llju5QplZWZV5rYlG1C/o8w0b/zH8gCZwWLeQaQJAKjmotOZo62IMLgEoaMw2EOgR2RK ydEOzirfesfThMkcBEyNDv+KTraYYtuoSa63BVznsX64a60AU8z+4xj856vvuJvMhxAM 5c9t0oWCA9huu6dIgTURMhdcEcbv6DRQPTMQLXWBKRisbhAxva7pD4ygfyYQRzlb+QPt QS7aYjY3K06krXmvBi2/Ta+Em8hths/NvdNvLkzhpH/mEDLiKCFfYPzPafvwGuSfxmlJ ob7g== X-Forwarded-Encrypted: i=1; AJvYcCWdgtlHVyvvi/YMj9/JvD/5qsjDFC4nLtPq7spl7xjcXLKcAdUgNwxdFS8Oa0K8urFNPOB1yJlMTtFdTAw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+J7qjCFkM6qk+OhHFWl2D+3W76kGFisyZ2obQXosFHsjlZ85r 28wwPhadEWqCZKjwc4DFZEJTBDJbFCL5haXLHk7JYX60tzXKUjgqqYyBHgLbiHd4cLU= X-Gm-Gg: ASbGncso8tcLiyQAeVrW/eb4ttHaYyX59/dFggWC3mTQIY87MkkjD9DtvlX6oIObGRl W1B/jezjJxz1nbH9Uzk/ucjonZjsGRmgVZINMzT2mZaEwnz8ddBNCfgioEkHEUD3p8+Tj+t5mTD LYvCv+t0IePw3phW8AmymaQLUG29d8Z8hBRlknSe8c5PHPrM8sDOJqv2U3qWBGKws6G5ZL8RN15 COclUzi+uEtsKZdPWLb2sCQlW6z9lGNdzVVftUEBugdrxxws1EkSUsVvusyZXYc32ArE4ImD2o/ nbPKEvxFsBQyXS9KZai7jr+0/Vutly4UKF8viOc3OORfnpwNY/MUBAHltXNTzI064a4rqbYgBwt PaYN6ql4rGcU6K/l+LIDHUn9LdlQAjghXLkm+SP4CY3K1+Gm1vfdgYZa7i2oxO57ztdHr0YdSP3 V4W1wxa+WXNJknw2CUwnTAMJT+MK1q5ZnZmg== X-Google-Smtp-Source: AGHT+IEGtCJVxQEDpFf3Jd3BrTA4e27R/LfD8qTutalpA0yqSHCpemiGQYzP9RyUO13yMxhultiV+Q== X-Received: by 2002:a05:7022:670f:b0:11a:4016:4491 with SMTP id a92af1059eb24-11c9d84c6f8mr12170250c88.24.1764123206595; Tue, 25 Nov 2025 18:13:26 -0800 (PST) Received: from apollo.purestorage.com ([208.88.152.253]) by smtp.googlemail.com with ESMTPSA id a92af1059eb24-11cc631c236sm17922979c88.7.2025.11.25.18.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Nov 2025 18:13:26 -0800 (PST) From: Mohamed Khalfella To: Chaitanya Kulkarni , Christoph Hellwig , Jens Axboe , Keith Busch , Sagi Grimberg Cc: Aaron Dailey , Randy Jennings , John Meneghini , Hannes Reinecke , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Mohamed Khalfella Subject: [RFC PATCH 06/14] nvme: Rapid Path Failure Recovery read controller identify fields Date: Tue, 25 Nov 2025 18:11:53 -0800 Message-ID: <20251126021250.2583630-7-mkhalfella@purestorage.com> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251126021250.2583630-1-mkhalfella@purestorage.com> References: <20251126021250.2583630-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" TP2028 Rapid path failure added new fileds to controller identify response. Read CIU (Controller Instance Uniquifier), CIRN (Controller Instance Random Number), and CCRL (Cross-Controller Reset Limit) from controller identify response. Expose CIU and CIRN as sysfs attributes so the values can be used directrly by user if needed. TP4129 KATO Corrections and Clarifications defined CQT (Command Quiesce Time) which is used along with KATO (Keep Alive Timeout) to set an upper limite for attempting Cross-Controller Recovery. Signed-off-by: Mohamed Khalfella --- drivers/nvme/host/core.c | 5 +++++ drivers/nvme/host/nvme.h | 11 +++++++++++ drivers/nvme/host/sysfs.c | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index fa4181d7de73..aa007a7b9606 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -3572,12 +3572,17 @@ static int nvme_init_identify(struct nvme_ctrl *ctr= l) ctrl->crdt[1] =3D le16_to_cpu(id->crdt2); ctrl->crdt[2] =3D le16_to_cpu(id->crdt3); =20 + ctrl->ciu =3D id->ciu; + ctrl->cirn =3D le64_to_cpu(id->cirn); + atomic_set(&ctrl->ccr_limit, id->ccrl); + ctrl->oacs =3D le16_to_cpu(id->oacs); ctrl->oncs =3D le16_to_cpu(id->oncs); ctrl->mtfa =3D le16_to_cpu(id->mtfa); ctrl->oaes =3D le32_to_cpu(id->oaes); ctrl->wctemp =3D le16_to_cpu(id->wctemp); ctrl->cctemp =3D le16_to_cpu(id->cctemp); + ctrl->cqt =3D le16_to_cpu(id->cqt); =20 atomic_set(&ctrl->abort_limit, id->acl + 1); ctrl->vwc =3D id->vwc; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 102fae6a231c..5195a9abfadf 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -326,13 +326,17 @@ struct nvme_ctrl { u32 max_zone_append; #endif u16 crdt[3]; + u16 cqt; u16 oncs; u8 dmrl; + u8 ciu; u32 dmrsl; + u64 cirn; u16 oacs; u16 sqsize; u32 max_namespaces; atomic_t abort_limit; + atomic_t ccr_limit; u8 vwc; u32 vs; u32 sgls; @@ -1218,4 +1222,11 @@ static inline bool nvme_multi_css(struct nvme_ctrl *= ctrl) return (ctrl->ctrl_config & NVME_CC_CSS_MASK) =3D=3D NVME_CC_CSS_CSI; } =20 +static inline unsigned long nvme_recovery_timeout_ms(struct nvme_ctrl *ctr= l) +{ + if (ctrl->ctratt & NVME_CTRL_ATTR_TBKAS) + return 3 * ctrl->kato * 1000 + ctrl->cqt; + return 2 * ctrl->kato * 1000 + ctrl->cqt; +} + #endif /* _NVME_H */ diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c index 29430949ce2f..ae36249ad61e 100644 --- a/drivers/nvme/host/sysfs.c +++ b/drivers/nvme/host/sysfs.c @@ -388,6 +388,27 @@ nvme_show_int_function(queue_count); nvme_show_int_function(sqsize); nvme_show_int_function(kato); =20 +static ssize_t nvme_sysfs_uniquifier_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct nvme_ctrl *ctrl =3D dev_get_drvdata(dev); + + return sysfs_emit(buf, "%02x\n", ctrl->ciu); +} +static DEVICE_ATTR(uniquifier, S_IRUGO, nvme_sysfs_uniquifier_show, NULL); + +static ssize_t nvme_sysfs_random_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct nvme_ctrl *ctrl =3D dev_get_drvdata(dev); + + return sysfs_emit(buf, "%016llx\n", ctrl->cirn); +} +static DEVICE_ATTR(random, S_IRUGO, nvme_sysfs_random_show, NULL); + + static ssize_t nvme_sysfs_delete(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -734,6 +755,8 @@ static struct attribute *nvme_dev_attrs[] =3D { &dev_attr_numa_node.attr, &dev_attr_queue_count.attr, &dev_attr_sqsize.attr, + &dev_attr_uniquifier.attr, + &dev_attr_random.attr, &dev_attr_hostnqn.attr, &dev_attr_hostid.attr, &dev_attr_ctrl_loss_tmo.attr, --=20 2.51.2