From mboxrd@z Thu Jan 1 00:00:00 1970 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 CD10236894D for ; Sun, 12 Jul 2026 02:25:32 +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=1783823136; cv=none; b=Uz5H01c0cBijC1yOsZvlVGXKeLbEfYSsuhbufIzUu9w5kBCtH0HuB3iTisA0kB9y0lo/GLCU9R1ShUt5pIf6xTpHmqmUPJ0/qWzBZ/qOsUEIzxlTHWVAjf1CBhsG7h+gKL06lHzI2aW0Y3LBgl7Yh/VIk1IsPJPi37JZdp/NcaQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783823136; c=relaxed/simple; bh=Uv2r2XntEQARra70I9Rs7oJUanJSxq+RbDgflNeuqQw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jS2Z/NLiyqeC08dDmr+dVp1YZSwjEk2YPJPoJpwDDEjg4Xyy19KHrKQyC76mqgyXY1mGqYHtT7/DLDM/FYEeIEBjTsCdTd945rpc0LQcxzRiXW/NGj9x3l/Vxw2cDmfDYyJ5aRsVay3tkII7sYd1QrGowB4DlUngLRzLe38Zbcc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=bNckmLvW; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="bNckmLvW" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-ca12086c06eso1753155a12.0 for ; Sat, 11 Jul 2026 19:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1783823132; x=1784427932; 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:content-type; bh=2svGMIPbamdfrr6utGGIH21OI5vt/Yz4GZPo9S8rv5I=; b=bNckmLvWOwS3AU0UaQavh1fk3BjB9B7e/Z7tBYz2J3rnj28OlnopPEvY9MHEQYoNcT J0knOppPYeah/lgKplx+rT904xBAobM5nOiPIi1XCqvSRhtzcvlLqkWXGxQpkRAeP25u Vs81YGD+5VjBkuFeweHIEMmQ/f60/DMULnWs87uEa7eKC1K3ICbNx4j4oNuv+9FLnL5L MIw2RoHxmMlVcjdIFvJO/OFyKy2i9e6odu1X4LkqLlilKj/vMgeAGaJe0vcrn62y4fyU yU4LD53IG+uadcf6i1pvCo/dlsZsIL/Qr5eY9n2bXZSvpVIsY0ukXX/+aUlvHdax5qY4 sfeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783823132; x=1784427932; 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:content-type; bh=2svGMIPbamdfrr6utGGIH21OI5vt/Yz4GZPo9S8rv5I=; b=ld8Q9sXZMQAAeTxLslpKhaUrPe3Xb8xVmb7YjSvxjqTCgzrux3vWthLFNAcTUfhzWY U8c0x1Bb+tkua28EIaF00ZnYPeAupa8dGDyWuxVwncHtZngvWqPKgMxTZlYTFzYD6u23 hPk62rg/RW0ojXE6/Ug5s5H+EG5zlj51L+cfZj0yDD54wQVvCkErScBLckcVBWo4YV5R BkDJ2zWAFH8DBqqSgD5b7mS3mCwpi3zfP2rSNuj1ILCzdSEADu9CPvu9lTaWLQexhAAX lIEvl8sW55Y6ucMjsDDQBuHADryFH5/wcVvpX4xyfhSp4/ls6hoRSOXKey2WinQEVTkp kTVQ== X-Forwarded-Encrypted: i=1; AHgh+Rr/S47upIWWIqvJ9EoP1E5tQStjrK+94iTDbjRUuZy6KsEyyow8X6dDG7kdmEzJ7/W/OXbsXYAgh0aPLqQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5rABapA0f1NK2t2eH9PGposZ5mG6h3cD58wNyABgdQMqQIuzT QcNr/A85coW/mbgYl0wk21i5iSJPSv3vXFkU84uzHNU6Be89e1Udau3rLcz3STatcH4= X-Gm-Gg: AfdE7ckjMwofhr73akERcnjZr2ibdZQjumgwSiCCtjIfHLwXGDs4PAgWf8XOdbx7Pi9 3kfMAXUO+GBer/bJPsBh8iA/hvTdB3qVlJegcR3sraaTDzD73xxqa5HFAiuq0kHHxbqep3iiylT 7Q2Re9mzwPBUOWTeil7mO4GnwNRfugEMNWe/xJbUpbTrO+hEn34LzL5Cxf7lcWvenMMz3wbpTXo yWUF1z13R8oRnx20+rV5V+FC7DFcJosx5vZFF+i08UpwJP4+mQZwG1LpTMj697kkomA8GOPWaLO yHGO3dEMO23KvWCv3A5u+sx9arXdmbLHUK+pOq6Ybht9hfG3rDAFC8M2l+Xs/AEmQpGUoTJVaJ3 bY+ia7X7t5st3s22hRYFDjTao8TZrD0n/OQbyfBH5BTc6vTeFHI0PR9oJzpcvm1Lw4N7OaacckC M0ZeMp X-Received: by 2002:a05:6a21:d83:b0:3bf:6c08:fb97 with SMTP id adf61e73a8af0-3c110a1b5b6mr4347640637.57.1783823132125; Sat, 11 Jul 2026 19:25:32 -0700 (PDT) Received: from ceto.lan ([2607:fb90:9c20:2264::1c31]) by smtp.googlemail.com with ESMTPSA id 5a478bee46e88-3117462f5c7sm60704693eec.0.2026.07.11.19.25.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 19:25:31 -0700 (PDT) From: Mohamed Khalfella To: Justin Tee , Naresh Gottumukkala , Paul Ely , Chaitanya Kulkarni , Christoph Hellwig , Jens Axboe , Keith Busch , Sagi Grimberg , James Smart , Hannes Reinecke , Randy Jennings , Dhaval Giani Cc: Aaron Dailey , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Mohamed Khalfella Subject: [PATCH v5 09/16] nvme: Implement cross-controller reset completion Date: Sat, 11 Jul 2026 19:23:30 -0700 Message-ID: <20260712022437.3743117-10-mkhalfella@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260712022437.3743117-1-mkhalfella@purestorage.com> References: <20260712022437.3743117-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: 8bit An nvme source controller that issues CCR command expects to receive an NVME_AER_NOTICE_CCR_COMPLETED when pending CCR succeeds or fails. Add ctrl->ccr_work to read NVME_LOG_CCR logpage and wakeup threads waiting on CCR completion. Signed-off-by: Mohamed Khalfella --- drivers/nvme/host/core.c | 50 +++++++++++++++++++++++++++++++++++++++- drivers/nvme/host/nvme.h | 1 + 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index a1deffc3cc00..18de3805eff8 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1943,7 +1943,8 @@ EXPORT_SYMBOL_GPL(nvme_set_queue_count); #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) static void nvme_enable_aen(struct nvme_ctrl *ctrl) { @@ -4974,6 +4975,48 @@ static void nvme_get_fw_slot_info(struct nvme_ctrl *ctrl) kfree(log); } +static void nvme_ccr_work(struct work_struct *work) +{ + struct nvme_ctrl *ctrl = container_of(work, struct nvme_ctrl, ccr_work); + struct nvme_ccr_entry *ccr; + struct nvme_ccr_log_entry *entry; + struct nvme_ccr_log *log; + int num_entries, ret, i; + unsigned long flags; + + log = kmalloc_obj(*log); + if (!log) + return; + + ret = nvme_get_log(ctrl, 0, NVME_LOG_CCR, 0x01, + 0x00, log, sizeof(*log), 0); + if (ret) + goto out; + + spin_lock_irqsave(&ctrl->lock, flags); + num_entries = min(le16_to_cpu(log->ne), NVMF_CCR_PER_PAGE); + for (i = 0; i < num_entries; i++) { + entry = &log->entries[i]; + if (entry->ccrs == NVME_CCR_STATUS_IN_PROGRESS) + continue; + + list_for_each_entry(ccr, &ctrl->ccr_list, list) { + struct nvme_ctrl *ictrl = ccr->ictrl; + + if (ictrl->cntlid != le16_to_cpu(entry->icid) || + ictrl->ciu != entry->ciu) + continue; + + /* Complete matching entry */ + ccr->ccrs = 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 = container_of(work, @@ -5050,6 +5093,9 @@ static bool nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result) case NVME_AER_NOTICE_DISC_CHANGED: ctrl->aen_result = 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); } @@ -5238,6 +5284,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); } @@ -5363,6 +5410,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev, ctrl->quirks = quirks; ctrl->numa_node = 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 90b989302e21..578fedda9946 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -422,6 +422,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; -- 2.54.0