From nobody Tue Dec 2 00:05:23 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (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 F381D30CD99 for ; Wed, 26 Nov 2025 02:13:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764123211; cv=none; b=mG+9t9cXGPl7gByN0a9vIdqbe2hpUlCfC7VL0iRhaP2rUzhlFmBi/BTum1DAhf6nvNn1KkJTV6uPperteDYbLKlF+Dvh7aweg+NtRXGwLoTuneZ9MoVYBYMYy0yI1ljsRCUk3FvJfdmV/K0tTZKssrMvhYKAK4fSx7Cd4CNts18= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764123211; c=relaxed/simple; bh=3f/b6hnGZfy4uyNY5Qu4l8NTfQAlJ5kTJMlI0Hbk3xc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JEuBiCKLK5Wxh/g7XUutxpMsoVT4KNgzykrkvSbcKLGiSa6D4a6twtTOql3+mMDBNLIJ4bH7FazmOpLHgfAoPmfl+VEgCwMAfLA8JjaEqephlxlxsE7Ku1Okrn6LRYeE6ILw1dmmNV5NOsEKFi45vuhMaR7yXtSvcCVwCCWrM5o= 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=F4OxSaOg; arc=none smtp.client-ip=209.85.210.171 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="F4OxSaOg" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-7bab7c997eeso6858808b3a.0 for ; Tue, 25 Nov 2025 18:13:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1764123209; x=1764728009; 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=exbjro8ZxYsk67jB8sE9mQJiuAHlrcOp4NnBqCERfJk=; b=F4OxSaOgMNzPDUTUL9S+chRtFShBRlV/S7Uw673Y2QXXHslvbGvIYUkscwFKHZTDUW KZ+khK2aCyUNYhrKZ4hDy49gGCZYlP9HRZ32gYkz5i/D/xh35YwJxXq7HkALxM+cbWD3 2huXnM988Uuv9R8j1dHgYjZO7lus9Ehy96iLzrwDWgzodKTJSOkhVU7Ed6Aw1fQnALk4 8e9VNCau19xqnQI6L5xqDoCcLOIE8jZ6MFYUSppkLRqHwiTHbzgu/FGcI/v72QEAdaSh 7OUZX9kptNHYrmMX1FpoWJ0oJZ+EuW03I7hN9NqNGKBwLXw0a7PM3XWcyVbuDs9iM905 36sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764123209; x=1764728009; 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=exbjro8ZxYsk67jB8sE9mQJiuAHlrcOp4NnBqCERfJk=; b=dyQW79clV/DjaqBPVzK+xKCrdKXnB+KfrDg5C+kDkDmjdsSUJ3ia0QFgPC+/IH7J5W DIn0xaPfjzCNvyiGKZDwvFiXNDYgznEQ+G1lK1ZYwRtZ0NihxbZFeMtVYPPF64RoPnQK taa3BYbLoqQmotrWvhpOBkzvPnmtaQW93CsMkuMfRcmNC8qHLGnBOSFPaXi+crFEKHsE Usm2o1aEEdblEXWTtF9r6+Sk/YUj7zPbqs2Hdysh8WYav0AY5Sk+4TEN82CnKThc75ff hjK+68uF27nVoc5Dlet+9qrhlGnHqN0c/hC7iZzB4guV8+sXDZq6c+ogVSz+PWIQ2RdL eaow== X-Forwarded-Encrypted: i=1; AJvYcCV0kyRtS0/TqsFUH1Iy5arrTOTA0FGYw081CRDwbcesGAq4vSswvzBNDhOql3jN3LgOUcKNt3eek8GdPRU=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9xynLE2CKueUGoxXbkfwy/rZkCWwZlzJJIhKCBSRGgE/f1Bvh 9rtdGEJvg9sjy/8opUNMdejsnkFJpMXRVKVtG04r/TuVALWp66LNeOjwnZJkllFLvb8= X-Gm-Gg: ASbGncvF2O0CzYI2WUNA/vd30ROcpiwFpTJEDdZotF5j8Ory0chu159bl+i2mErzBS1 38X4lWBqjhplhXx9N4TvXFKPASOHKs9KVOlPeo5VgDOCTAhniuTJw+blkJewI+0wPf/4WqoccWh UchV9PdyjHDy7+IuG95zFOyRhdqqadZBNThhTI5i+abZQ5u0jTw2lfVBbaLsi+UkpJZZwsOSdzE 1gRdfcOe30vACyPUOs5CZfFix5Viu4pWb3HIdFNbJauZsUt/vLazrQyUPWWFPnRdWjZ7PSCstch WLRIOy9KEh0lA/BRoE6sAYkQ2n3QTzfYZEa543ewujFAVLZ5B1euFNb/8PqAUx8U8RGBnHEH8kh NNWESHad8Qlvns25sD8UJ/ffX1h97rHNY7CozTj2jipW52teKj/PnM8DXwjDHv3eiEdYUNlOs0C kQg757pREWItH6LOjWs7oGujHwp2msjIvmYxrIPRu1FvOG X-Google-Smtp-Source: AGHT+IE7adP0QSTlX5R/fE1HuvFPh7U731vSvH+n5NFHCnbsls7zofkCi5K19Xzrg3IFSrz0CdjnZQ== X-Received: by 2002:a05:701b:2803:b0:11b:2138:476a with SMTP id a92af1059eb24-11c9d8539eamr9245799c88.27.1764123208925; Tue, 25 Nov 2025 18:13:28 -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.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Nov 2025 18:13:28 -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 09/14] nvme: Implement cross-controller reset completion Date: Tue, 25 Nov 2025 18:11:56 -0800 Message-ID: <20251126021250.2583630-10-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" An nvme source controller that issues CCR command expects to receive an NVME_AER_NOTICE_CCR_COMPLETED when pending CCR succeeds or fails. Add sctrl->ccr_work to read NVME_LOG_CCR logpage and wakeup any thread waiting on CCR completion. Signed-off-by: Mohamed Khalfella --- drivers/nvme/host/core.c | 49 +++++++++++++++++++++++++++++++++++++++- drivers/nvme/host/nvme.h | 1 + 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index f38b70ca9cee..467754e77a2d 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1894,7 +1894,8 @@ EXPORT_SYMBOL_GPL(nvme_set_queue_count); =20 #define NVME_AEN_SUPPORTED \ (NVME_AEN_CFG_NS_ATTR | NVME_AEN_CFG_FW_ACT | \ - NVME_AEN_CFG_ANA_CHANGE | NVME_AEN_CFG_DISC_CHANGE) + NVME_AEN_CFG_ANA_CHANGE | NVME_AEN_CFG_CCR_COMPLETE | \ + NVME_AEN_CFG_DISC_CHANGE) =20 static void nvme_enable_aen(struct nvme_ctrl *ctrl) { @@ -4860,6 +4861,47 @@ static void nvme_get_fw_slot_info(struct nvme_ctrl *= ctrl) kfree(log); } =20 +static void nvme_ccr_work(struct work_struct *work) +{ + struct nvme_ctrl *ctrl =3D container_of(work, struct nvme_ctrl, ccr_work); + struct nvme_ccr_entry *ccr; + struct nvme_ccr_log_entry *entry; + struct nvme_ccr_log *log; + unsigned long flags; + int ret, i; + + log =3D kmalloc(sizeof(*log), GFP_KERNEL); + if (!log) + return; + + ret =3D nvme_get_log(ctrl, 0, NVME_LOG_CCR, 0x01, + 0x00, log, sizeof(*log), 0); + if (ret) + goto out; + + spin_lock_irqsave(&ctrl->lock, flags); + for (i =3D 0; i < le16_to_cpu(log->ne); i++) { + entry =3D &log->entries[i]; + if (entry->ccrs =3D=3D 0) /* skip in progress entries */ + continue; + + list_for_each_entry(ccr, &ctrl->ccrs, list) { + struct nvme_ctrl *ictrl =3D ccr->ictrl; + + if (ictrl->cntlid !=3D le16_to_cpu(entry->icid) || + ictrl->ciu !=3D entry->ciu) + continue; + + /* Complete matching entry */ + ccr->ccrs =3D entry->ccrs; + complete(&ccr->complete); + } + } + spin_unlock_irqrestore(&ctrl->lock, flags); +out: + kfree(log); +} + static void nvme_fw_act_work(struct work_struct *work) { struct nvme_ctrl *ctrl =3D container_of(work, @@ -4936,6 +4978,9 @@ static bool nvme_handle_aen_notice(struct nvme_ctrl *= ctrl, u32 result) case NVME_AER_NOTICE_DISC_CHANGED: ctrl->aen_result =3D result; break; + case NVME_AER_NOTICE_CCR_COMPLETED: + queue_work(nvme_wq, &ctrl->ccr_work); + break; default: dev_warn(ctrl->device, "async event result %08x\n", result); } @@ -5126,6 +5171,7 @@ void nvme_stop_ctrl(struct nvme_ctrl *ctrl) nvme_stop_failfast_work(ctrl); flush_work(&ctrl->async_event_work); cancel_work_sync(&ctrl->fw_act_work); + cancel_work_sync(&ctrl->ccr_work); if (ctrl->ops->stop_ctrl) ctrl->ops->stop_ctrl(ctrl); } @@ -5247,6 +5293,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct dev= ice *dev, ctrl->quirks =3D quirks; ctrl->numa_node =3D NUMA_NO_NODE; INIT_WORK(&ctrl->scan_work, nvme_scan_work); + INIT_WORK(&ctrl->ccr_work, nvme_ccr_work); INIT_WORK(&ctrl->async_event_work, nvme_async_event_work); INIT_WORK(&ctrl->fw_act_work, nvme_fw_act_work); INIT_WORK(&ctrl->delete_work, nvme_delete_ctrl_work); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 1f8937fce9a7..3f5a0722304d 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -366,6 +366,7 @@ struct nvme_ctrl { struct nvme_effects_log *effects; struct xarray cels; struct work_struct scan_work; + struct work_struct ccr_work; struct work_struct async_event_work; struct delayed_work ka_work; struct delayed_work failfast_work; --=20 2.51.2