From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (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 ABC613290AA for ; Fri, 21 Aug 2026 20:39:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787344760; cv=none; b=g2LbtKBc4nKZwZxj9qfJtIQ0fh4sx0doT2ojuwyjAGzMuzrm5OMRdMpzbArI1HN0A2rg3by7MjTcdib+mxFA9ZLOknTcx8VKiG8gz6xw+td6cKjdm6z/QitACjRgE1kS4qw895HHeJB5iWsbV0091CKRSDpL3zedNGr/6YLXAEw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787344760; c=relaxed/simple; bh=MnGDtdwZg+D+2eyf5xT5m768hp5F1DB6t6rhwDMYOM8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=XXOOPUQF3/Me7UcNN3yoFXJIuubjma4Zg0io+V1Zt+7qI8LmMAX/qG+VaWeHxzW48bFZNHaKgDQcWgPFcKAuGPf9+hrwRUk2y6m/sfCI2b6CBtQXwvyz+9scHzr7tzf5X3cgd3FX09sY7Fwt8yFCKdpc//nW3KN9ZUAS5k2/wpI= 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=R8fSx631; arc=none smtp.client-ip=209.85.216.52 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="R8fSx631" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-395cf2535acso1048486a91.1 for ; Fri, 21 Aug 2026 13:39:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1787344758; x=1787949558; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=ziO7i9EZKoScdSQc/jJeUszIvAmtfTTEYYX7vopJ1sA=; b=R8fSx631Q6z9g7Rc4Oq8hgFyNlSl92xjhFZuebg2HiGns7EqZyoZyHCjYYjWMRBi92 NYzolCGpA4fb+o4nr5wWpH3X4zwmKupAV7hU4ElkWQMX9vMdFBcj6caJudset7m+C5gY YqWTmq3OgWIA3EX4Y+FcIXGuW0iSERXHfGMA/uqjs6IgdWEnZd/anApaFFalL6MzgkIM igiHhiDZ8JG4oLECGW3fr7AHwb8hAMsb7Qd25UrAn6JhRimuqF7lzMBKfzWWZVUW9u4L B6oPsVMZbUSQPd/fs1gfg0J4cfAZw1ANHF2Qic3P69MrkBmxoOEPyJ/Z/RbI/7ShQyfG nZgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787344758; x=1787949558; h=content-transfer-encoding:mime-version: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=ziO7i9EZKoScdSQc/jJeUszIvAmtfTTEYYX7vopJ1sA=; b=tA/d3Ym6OjtZ9M61VER3KA0CjNg09hvFvM6n5hr4aBvOMw2ZFQ8hUsPEOmgOxvpk1i 43/N+CFabBV8ddxUrZSmaoouzD7pDzmZiquNflAKDa7eLWV3D8yK5fHsw6O6uAjSUmiH I/pohYum0thipoy+pqDOVqISV1nxcp0cwSmWu+Rxu0wbXIgXGTyrtTAvWIf4MXBAtwNY Q9KsqEDLz+DiMMQORsXSvKmEGflFTGkx29YvbH9G+3iWcp78rou6VUhDN0/g1sSWeWiC jkEkAYGc2pEJPdlxD4cFpDKV4AIRTEVJlrmo6tKxzbHrIstIvYxQZU5WjNYYc9jC/C+q mRcg== X-Forwarded-Encrypted: i=1; AHgh+RoalWQKuIpBQwfgVH/7WVZ/OE4z1xOrVaOVTlToSPENK8mNFivbiWQ9f+jDaQzf4l1BAzQBwGGxBDSK+yg=@vger.kernel.org X-Gm-Message-State: AFuF++kS5pbFC9lVKj9kZ/2lw89twWjRkY5b4zcVX7mpLwHii8K8HHbc N5ZP3HnPsDxHsqASAmNcJCDZ1USwN3akmvhNWmkrT4AFZdH2SDUiw4caLI/MY0PUL5g= X-Gm-Gg: AR+sD12ROpy4+ZmhE1jdjgb9LR4GWc10dSohPOk3WX8avXBRrGiP+YYnjZa7h+CLWPJ 8lzGSgCRXGngmGKxqjft6vewxj/paTosZ4xy0w4hSD6cxYzeOcWRD7LnVmmqlvuUnu09JTUM8FY uNfozDu9X87T7GxjrQ95oC5B8KPN3/lFFTxOtiKUxqCSIKXRKLPOMBD0wtcR7OAP1tw67IzHFk/ 7G9CoACsQ9nvfRkJNsi/KV612OxF48wDZ2uk4/Xkwh0M3DQQ6IzAf0o2deV/s6bDvIaXID8efu1 IYIs5dbajO2EBiC0/Q2h09YjH24RvSiVY38xZkc6C0sbIS+Has/znAnPB/kY+LeXLwCech/1SgW Hfw41g/DCG3fHQ/zH51fLm/RskY0YuqyaH5V/xh747R5BuS0rg9HTnAxK6+IdkJzuK9Z5WUTx0P nf1DxciDdEdEto48rsB9QTXjZMlkffPiL7tDQK4ZZqoT/19wlmjtng7ZF3ZVvIO96Ik3C+Beuqf 7UzncFxIUuR X-Received: by 2002:a17:90b:4b91:b0:36b:de66:92c3 with SMTP id 98e67ed59e1d1-395a0634d83mr19134661a91.10.1787344757922; Fri, 21 Aug 2026 13:39:17 -0700 (PDT) Received: from apollo.purestorage.com ([208.88.152.253]) by smtp.googlemail.com with ESMTPSA id 5a478bee46e88-327bf15ff5dsm29417618eec.25.2026.08.21.13.39.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Aug 2026 13:39:17 -0700 (PDT) From: Mohamed Khalfella To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Mohamed Khalfella Subject: [PATCH] Subject: [PATCH] nvme: remove stale namespaces by NSID range during scan Date: Fri, 21 Aug 2026 13:38:54 -0700 Message-ID: <20260821203854.3897938-1-mkhalfella@purestorage.com> X-Mailer: git-send-email 2.54.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit nvme_scan_ns_list() drops the stale namespaces in each gap in the reported NSID list one NSID at a time. Every iteration calls nvme_find_get_ns() to look the namespace up and removes it if it is present. The loop runs once per NSID in the gap rather than once per namespace actually present. NSIDs are 32-bit, so a target with a sparse NSID space can make a single gap spin the loop billions of times with nothing to remove. watchdog: BUG: soft lockup - CPU#4 stuck for 26s! Workqueue: nvme-wq nvme_scan_work [nvme_core] RIP: 0010:__srcu_read_unlock+0xb/0x20 Call Trace: nvme_find_get_ns+0x7d/0xb0 [nvme_core] nvme_scan_ns_list+0xe8/0x280 [nvme_core] nvme_scan_work+0x18a/0x280 [nvme_core] process_one_work+0x197/0x380 worker_thread+0x2fe/0x410 kthread+0xe0/0x100 Rename nvme_remove_invalid_namespaces() to nvme_remove_nsid_range() and give it an open (start, end) NSID range. ctrl->namespaces is sorted by NSID, so the whole gap is dropped in a single walk that stops once end is reached. This bounds the work by the namespaces that are present instead of by the size of the gap. Fixes: 540c801c65eb ("NVMe: Implement namespace list scanning") Signed-off-by: Mohamed Khalfella --- drivers/nvme/host/core.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 5f2744be7388..cc014cdc72ff 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -155,8 +155,6 @@ static const struct class nvme_ns_chr_class = { }; static void nvme_put_subsystem(struct nvme_subsystem *subsys); -static void nvme_remove_invalid_namespaces(struct nvme_ctrl *ctrl, - unsigned nsid); static void nvme_update_keep_alive(struct nvme_ctrl *ctrl, struct nvme_command *cmd); static int nvme_get_log_lsi(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, @@ -4513,15 +4511,16 @@ static void nvme_scan_ns_async(void *data, async_cookie_t cookie) nvme_scan_ns(scan_info->ctrl, nsid); } -static void nvme_remove_invalid_namespaces(struct nvme_ctrl *ctrl, - unsigned nsid) +static void nvme_remove_nsid_range(struct nvme_ctrl *ctrl, u32 start, u32 end) { struct nvme_ns *ns, *next; LIST_HEAD(rm_list); mutex_lock(&ctrl->namespaces_lock); list_for_each_entry_safe(ns, next, &ctrl->namespaces, list) { - if (ns->head->ns_id > nsid) { + if (ns->head->ns_id >= end) + break; + if (ns->head->ns_id > start) { list_del_rcu(&ns->list); synchronize_srcu(&ctrl->srcu); list_add_tail_rcu(&ns->list, &rm_list); @@ -4571,13 +4570,14 @@ static int nvme_scan_ns_list(struct nvme_ctrl *ctrl) goto out; async_schedule_domain(nvme_scan_ns_async, &scan_info, &domain); - while (++prev < nsid) - nvme_ns_remove_by_nsid(ctrl, prev); + if (prev + 1 < nsid) + nvme_remove_nsid_range(ctrl, prev, nsid); + prev = max(prev + 1, nsid); } async_synchronize_full_domain(&domain); } out: - nvme_remove_invalid_namespaces(ctrl, prev); + nvme_remove_nsid_range(ctrl, prev, UINT_MAX); free: async_synchronize_full_domain(&domain); kfree(ns_list); @@ -4597,7 +4597,7 @@ static void nvme_scan_ns_sequential(struct nvme_ctrl *ctrl) for (i = 1; i <= nn; i++) nvme_scan_ns(ctrl, i); - nvme_remove_invalid_namespaces(ctrl, nn); + nvme_remove_nsid_range(ctrl, nn, UINT_MAX); } static void nvme_clear_changed_ns_log(struct nvme_ctrl *ctrl) -- 2.54.0