From nobody Fri Jan 31 20:49:41 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Yl7LH2tLnz5n4Wb; Fri, 31 Jan 2025 20:49:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Yl7LG51Hdz3VLg; Fri, 31 Jan 2025 20:49:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738356582; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=PBuy/YSmajqg1mChf6aftLYy/SwcpnGpBObVAIVdVTg=; b=pEM2xo48wJJ+E3eQ5PICUsWniVrx3Ve3rP2M6NrUEbued5vH0ssibI8gl3bCyk7ZB0+Bfd BwtD+w4m6YvWvNEVdahbkqmy8jGYxg86ETWEazvmowQxpDvfg3hacCEZNsgof4PYHQe8ai vDex4cqMTqtshYKLCUDF9Ssr6lJsAvai7oaQUq4B53vVP3zuiBXCUGF+R/OPvJM2lUjYRw MxjMH2jBosYLmrOPFAOFLAQUWotffQG0qsjdNkBxPRqJp7Nr1V1FL4FyPjfdBnOimKuwHa cm5/SQps6Ml2XMnI+Fxo19yAZ+GmAvZ+fiMnT/Qnvdxb+TYG4AtNJXAUQYsNvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738356582; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=PBuy/YSmajqg1mChf6aftLYy/SwcpnGpBObVAIVdVTg=; b=RlHZVfF+SWt5XWFF1ebR9hlVg8onvS/8Pm7AUri3TgG2ao9PWxr3uMNzJNkoR3ejLpLnOt fOs7gF63W9cmqnHEORnDBaBCMhMgLurSuB3HIJXQfqz+L5T4GGLvhFI8CTLZnCNwgr+MRQ bzjpiqICXGTWdNFip0OeaswhQUEPDg4zBS3FsSvFYEPmXzlmg5JApmoFrAbjPJwo215Xmb lc3ptfh1sZXjqx9qGMSAGOXKnj+eEjB6vJWyDQkKgOrHjl5t/UMczvXbkdM3ba1tTVUg62 H9EZhRR0klUOwEYYvAd9VjuA4CTYaSBtv/qPJawZkumRi89X0ej5YMi+cGhzPQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738356582; a=rsa-sha256; cv=none; b=UhaRpSLC/oZNTMwtJn6wJeLUn70/H4UMgnyRAxl4hYbe5glgR30BKwppJY9+nCRtqmB+eq p+t05xp+Y/9XUzxK6cYVnqjUIF3pt46fiYCBXuh4n59MCuceCDUGFu/K9mOx81MoSksMXo PvJUqGgzgix9M9yOIOu29nZklqEzwQl8waEfVLfiTgwO1MN5Rayo4YQljywm4HI+FwrRVV Ir3BUe9Xvstpdhle99H//QtQ3bbAGS29HkdT48mfK21T8nHCCyt7sB1Qw3bRI2Hx6oTfAa WJVqA9/m75F3F9Fb7G6Py/uYN0larP1m5DwycwD945vCkdah6nQb88R3/CDQwA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Yl7LF6ncPzb46; Fri, 31 Jan 2025 20:49:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50VKnfNV063394; Fri, 31 Jan 2025 20:49:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50VKnfDD063391; Fri, 31 Jan 2025 20:49:41 GMT (envelope-from git) Date: Fri, 31 Jan 2025 20:49:41 GMT Message-Id: <202501312049.50VKnfDD063391@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: ad9dc97e4dce - main - nvmecontrol devlist: Handle disconnected Fabrics hosts List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ad9dc97e4dce478452edc4877020adf37ff5790c Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=ad9dc97e4dce478452edc4877020adf37ff5790c commit ad9dc97e4dce478452edc4877020adf37ff5790c Author: John Baldwin AuthorDate: 2025-01-31 20:48:21 +0000 Commit: John Baldwin CommitDate: 2025-01-31 20:48:21 +0000 nvmecontrol devlist: Handle disconnected Fabrics hosts If a Fabrics host is disconnected, use the cached controller data instead of reading the cdata via a pass-through command. In addition, annotate disconnected hosts including the amount of time since the connection was lost. Reviewed by: chuck Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D48220 --- sbin/nvmecontrol/devlist.c | 63 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/sbin/nvmecontrol/devlist.c b/sbin/nvmecontrol/devlist.c index d2386e7ea800..31445a2ef920 100644 --- a/sbin/nvmecontrol/devlist.c +++ b/sbin/nvmecontrol/devlist.c @@ -27,11 +27,14 @@ */ #include +#include +#include #include #include #include #include +#include #include #include #include @@ -39,6 +42,7 @@ #include #include #include +#include #include #include "nvmecontrol.h" @@ -113,12 +117,62 @@ scan_namespace(int fd, int ctrlr, uint32_t nsid) } static bool -scan_controller(int ctrlr) +print_controller_info(const char *name, int fd) { + static struct timespec now; struct nvme_controller_data cdata; + struct timespec last_disconnect, delta; + uint8_t mn[64]; + nvlist_t *nvl; + const nvlist_t *nvl_ts; + bool connected; + + /* + * If the controller doesn't support connection status, assume + * it is connected. + */ + if (nvmf_connection_status(fd, &nvl) != 0) { + connected = true; + nvl = NULL; + } else { + connected = nvlist_get_bool(nvl, "connected"); + } + + if (connected) { + if (read_controller_data(fd, &cdata) != 0) { + nvlist_destroy(nvl); + return (false); + } + } else { + if (ioctl(fd, NVME_GET_CONTROLLER_DATA, &cdata) == -1) { + nvlist_destroy(nvl); + return (false); + } + } + + nvme_strvis(mn, cdata.mn, sizeof(mn), NVME_MODEL_NUMBER_LENGTH); + printf("%6s: %s", name, mn); + if (!connected) { + if (now.tv_sec == 0) + clock_gettime(CLOCK_REALTIME, &now); + + nvl_ts = nvlist_get_nvlist(nvl, "last_disconnect"); + last_disconnect.tv_sec = nvlist_get_number(nvl_ts, "tv_sec"); + last_disconnect.tv_nsec = nvlist_get_number(nvl_ts, "tv_nsec"); + timespecsub(&now, &last_disconnect, &delta); + printf(" (disconnected for %ju seconds)", + (uintmax_t)delta.tv_sec); + } + printf("\n"); + nvlist_destroy(nvl); + return (connected); +} + +static bool +scan_controller(int ctrlr) +{ struct nvme_ns_list nslist; char name[64]; - uint8_t mn[64]; uint32_t nsid; int fd, ret; @@ -132,14 +186,11 @@ scan_controller(int ctrlr) } else if (ret != 0) return (false); - if (read_controller_data(fd, &cdata) != 0) { + if (!print_controller_info(name, fd)) { close(fd); return (true); } - nvme_strvis(mn, cdata.mn, sizeof(mn), NVME_MODEL_NUMBER_LENGTH); - printf("%6s: %s\n", name, mn); - nsid = 0; for (;;) { if (read_active_namespaces(fd, nsid, &nslist) != 0)