From nobody Fri Jan 31 20:49:40 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 4Yl7LF24xLz5n4Th; Fri, 31 Jan 2025 20:49:41 +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 4Yl7LD6W6gz3VYS; Fri, 31 Jan 2025 20:49:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738356580; 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=+etr/kE2Hz8l4fPeVXrkbtEmqp1vjkDGyR4wgr62T3w=; b=hx7Mxt0Af1VvqSKzooBbQApVSFztowxVMNozpeqHCtq4qylHSILFUeAPLNUlJd9DH3CCX6 9JbrK/I6yNULRZbpBjoUcZzJeA/zph9WXVXEO9RGJJMRUhrUc+URHVxQH6psRLdBEw0Ie5 4xlJQTNrirN72rl1PXGhMMioXzhykTt8ehVZ8MTydV/bJ7WS72I/SzHoanGZsiFOpCEHcT loJCNnNg/a+y9eWnNolBUKXzbv+EM6UBxoosL0/kyXLdYwxZwbEjsIpuyqi+2etgLb+2fH mmuCAHzyg04NF2zQAblVUueH3I8r7RWW4UK5LKZH6505oBllVF/K+C9Zw07vbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738356580; 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=+etr/kE2Hz8l4fPeVXrkbtEmqp1vjkDGyR4wgr62T3w=; b=ZXReBB9t8G9AwJBv1W9ptXRZ8yhUcjRireS0M0UubpVFOtQyzUpDkKUXNmRWve0vJrJYDn ql97KMztSWGpQS71h+daQUwYuucBtB6cTt3/GqZXJ31wKaF3qcpTMFDYE4vkQjOxJFXBFD agDsinovr+uHaYxJqYEThOMoD5wnITKUfFn8etlDsENjmCdbVfYPciIiyLDwdUSsHYPOdc ZjizEKBz9OR9Zr3hudow3fsoCL4WJp/QhxsjP/eY88QZaE+70XWpbX06gWBiQMlMc1H6US PNE2pbXtSMgBIpq1kx1oM6+9Okesc48TJYWUGkZsBifXZdmBJ2UWu/fDL2ca8Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738356580; a=rsa-sha256; cv=none; b=C0YPDmoqoTBMkB4iQJ5xkzn8QVITGBAdDK8NmBlvWgG/1/vq24qIsfMJrS/YapsvhkVYH8 VIISHaBd+U3/I8wSqSCxS/uN/gqeoCQcgN+G2WISdtcIPp/aV1sTb6ERkPf9EqpNejWhQN +olwbhrvDITasoWoRgOF2EF1oX6sO8g4Jr2NH9psNOUQWhaCsE/CZNxBpf0SGbePdmXDBh gfN3iabgOG1ajFcYHLnNX2uEEr6SYJOuBC109CX73BVNKvdLNVd70zoHQ6AhvjdzAkq1+u YRTLxdjcqxvdMuL+86dvYwhBldLopB4fhVmeKQLNywdHvxDV3GtIH+uaRlxaMQ== 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 4Yl7LD65D9zZ59; Fri, 31 Jan 2025 20:49:40 +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 50VKneuR063360; Fri, 31 Jan 2025 20:49:40 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50VKneVQ063357; Fri, 31 Jan 2025 20:49:40 GMT (envelope-from git) Date: Fri, 31 Jan 2025 20:49:40 GMT Message-Id: <202501312049.50VKneVQ063357@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: 38e1083940a2 - main - nvmf: Add NVMF_CONNECTION_STATUS ioctl 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: 38e1083940a274783cc9e8ebd845e35df6d0a1ff Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=38e1083940a274783cc9e8ebd845e35df6d0a1ff commit 38e1083940a274783cc9e8ebd845e35df6d0a1ff Author: John Baldwin AuthorDate: 2025-01-31 20:47:58 +0000 Commit: John Baldwin CommitDate: 2025-01-31 20:47:58 +0000 nvmf: Add NVMF_CONNECTION_STATUS ioctl This returns an nvlist indicating if a Fabrics host is connected and the time of the most recent disconnection. Reviewed by: imp Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D48219 --- lib/libnvmf/libnvmf.h | 5 +++++ lib/libnvmf/nvmf_host.c | 7 +++++++ sys/dev/nvmf/host/nvmf.c | 25 +++++++++++++++++++++++++ sys/dev/nvmf/host/nvmf_var.h | 2 ++ sys/dev/nvmf/nvmf.h | 10 ++++++++++ 5 files changed, 49 insertions(+) diff --git a/lib/libnvmf/libnvmf.h b/lib/libnvmf/libnvmf.h index f34ccdb177e7..9840e190a24f 100644 --- a/lib/libnvmf/libnvmf.h +++ b/lib/libnvmf/libnvmf.h @@ -372,4 +372,9 @@ int nvmf_reconnect_host(int fd, const struct nvme_discovery_log_entry *dle, const char *hostnqn, struct nvmf_qpair *admin_qp, u_int num_queues, struct nvmf_qpair **io_queues, const struct nvme_controller_data *cdata); +/* + * Fetch connection status from an existing kernel host. + */ +int nvmf_connection_status(int fd, nvlist_t **nvlp); + #endif /* !__LIBNVMF_H__ */ diff --git a/lib/libnvmf/nvmf_host.c b/lib/libnvmf/nvmf_host.c index e194522870d1..89cdd5c6bb70 100644 --- a/lib/libnvmf/nvmf_host.c +++ b/lib/libnvmf/nvmf_host.c @@ -5,6 +5,7 @@ * Written by: John Baldwin */ +#include #include #include #include @@ -1001,3 +1002,9 @@ out: (void)nvmf_free_qpair(admin_qp); return (error); } + +int +nvmf_connection_status(int fd, nvlist_t **nvlp) +{ + return (nvmf_read_ioc_nv(fd, NVMF_CONNECTION_STATUS, nvlp)); +} diff --git a/sys/dev/nvmf/host/nvmf.c b/sys/dev/nvmf/host/nvmf.c index befe93dbbbc0..dbdd4568bdf1 100644 --- a/sys/dev/nvmf/host/nvmf.c +++ b/sys/dev/nvmf/host/nvmf.c @@ -654,6 +654,7 @@ nvmf_disconnect_task(void *arg, int pending __unused) return; } + nanotime(&sc->last_disconnect); callout_drain(&sc->ka_tx_timer); callout_drain(&sc->ka_rx_timer); sc->ka_traffic = false; @@ -1085,6 +1086,27 @@ nvmf_reconnect_params(struct nvmf_softc *sc, struct nvmf_ioc_nv *nv) return (error); } +static int +nvmf_connection_status(struct nvmf_softc *sc, struct nvmf_ioc_nv *nv) +{ + nvlist_t *nvl, *nvl_ts; + int error; + + nvl = nvlist_create(0); + nvl_ts = nvlist_create(0); + + sx_slock(&sc->connection_lock); + nvlist_add_bool(nvl, "connected", sc->admin != NULL); + nvlist_add_number(nvl_ts, "tv_sec", sc->last_disconnect.tv_sec); + nvlist_add_number(nvl_ts, "tv_nsec", sc->last_disconnect.tv_nsec); + sx_sunlock(&sc->connection_lock); + nvlist_move_nvlist(nvl, "last_disconnect", nvl_ts); + + error = nvmf_pack_ioc_nvlist(nvl, nv); + nvlist_destroy(nvl); + return (error); +} + static int nvmf_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag, struct thread *td) @@ -1116,6 +1138,9 @@ nvmf_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag, case NVMF_RECONNECT_HOST: nv = (struct nvmf_ioc_nv *)arg; return (nvmf_reconnect_host(sc, nv)); + case NVMF_CONNECTION_STATUS: + nv = (struct nvmf_ioc_nv *)arg; + return (nvmf_connection_status(sc, nv)); default: return (ENOTTY); } diff --git a/sys/dev/nvmf/host/nvmf_var.h b/sys/dev/nvmf/host/nvmf_var.h index 470f76527e46..e45a31f413a4 100644 --- a/sys/dev/nvmf/host/nvmf_var.h +++ b/sys/dev/nvmf/host/nvmf_var.h @@ -86,6 +86,8 @@ struct nvmf_softc { nvlist_t *rparams; + struct timespec last_disconnect; + eventhandler_tag shutdown_pre_sync_eh; eventhandler_tag shutdown_post_sync_eh; }; diff --git a/sys/dev/nvmf/nvmf.h b/sys/dev/nvmf/nvmf.h index 79facfd4ede2..d4e7b1511e9d 100644 --- a/sys/dev/nvmf/nvmf.h +++ b/sys/dev/nvmf/nvmf.h @@ -90,6 +90,15 @@ struct nvmf_ioc_nv { * bool data_digests */ +/* + * The fields in the nvlist for NVMF_CONNECTION_STATUS are: + * + * bool connected + * timespec nvlist last_disconnect + * number tv_sec + * number tv_nsec + */ + /* * The fields in the nvlist for handing off a controller qpair are: * @@ -107,5 +116,6 @@ struct nvmf_ioc_nv { /* Operations on /dev/nvmeX */ #define NVMF_RECONNECT_PARAMS _IOWR('n', 203, struct nvmf_ioc_nv) #define NVMF_RECONNECT_HOST _IOW('n', 204, struct nvmf_ioc_nv) +#define NVMF_CONNECTION_STATUS _IOWR('n', 205, struct nvmf_ioc_nv) #endif /* !__NVMF_H__ */