From nobody Sat Mar 4 09:12:43 2023 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 4PTJyh39vhz3vn6V; Sat, 4 Mar 2023 09:12:44 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4PTJyh22nNz3xsP; Sat, 4 Mar 2023 09:12:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1677921164; 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=R6L0nxI0+pLs3BjOZX47eGHGzUlBMcH1W4S5Gi//tVg=; b=nEp/FF7Tks4JJhHGLiMu0cmKPbSHErQjbuJFzy+2mCDvlSvih9envtkEE640bRAZnRAnWW 9lLBN4EzJkG0cC3hkBwL4tugVNdm416ljNDjIZjRmHsmDtlLNqExbm3MgxMWXmCM/XEw/n 2VxKklim2QtV1Kn2mPSp0I1vC74PtBa+uDaCnrCCURDj8nBN+porTTjeWBWZJkxMCFlUI2 aUw1AYfFf/BNXS8xuO2Qo3e9pX58RVDcRdw3S1YM0PjccONY4pCy/ZpVYyIlGuZnBZNlwI 1gWD4WEYupcamriYdF+l7Rw+oezjY+4BvIBzynCYoi+4AdPqDrrJSWx104R9/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1677921164; 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=R6L0nxI0+pLs3BjOZX47eGHGzUlBMcH1W4S5Gi//tVg=; b=jCevqbPBAlExaaB9O8tYorDn6NetbeUVX4wL3tc8E5L2azmC5c5Q4YOC8ZKDecAx+WTjlK PaUW54EMxhxyIffVjL/1ZAkQlk/lKG8SfpHsgPXpeUnvpyN6l6ILUzRj5kdpj6No3Jzx5q r+FpM6VKdzCfHw0IZHWoWZJiPAJZVGPekriEz4HApS4BLIdjRqor3F59m86zTE0WasFoo3 6qVkKGzGjpqFLLai7JYpfGPSsE3bPT4WyMlxzfrMsG5FXI8OFZD544QM+IB8ZVEGLU91pn NA/Tmb7uhXlTHD0326txsnv9eLuA82CE7r1nfyW6ZsQ3w+FBPNc0C0dbbBp0BQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1677921164; a=rsa-sha256; cv=none; b=RrVRg8WwZGyc51EDP7XZ3KscsGj0JCyEyaAKnU4RdRx/o9NY+wwkFDXnW0QxaJwVRiWUe8 jle7fOCYy8hSg+CWTHFWxrNM3oo2/gB0TDR2shwxB/vYI2Q19K7PcwwXWFdqvyxkscju83 E9/Br17b8Lpe/VaNRVqD5+J7SbUkkwEpj2k/69qdWkimVq6lX0LgZCn/dpZlqIQAjmOQec Q49me8SdD3IvL53EtdcL6kFwSyYnKCHeLpyY5y8BLN4KpADRPY70wq8WroS6b/xAHV79gF NP7pj9xUwxAbHki4SjqChhGQXwfj3FuAlY5kU8m/XFAm5Ha9S8ofyrB2MTaKNw== 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 4PTJyh0f66zZGW; Sat, 4 Mar 2023 09:12:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 3249ChoI078834; Sat, 4 Mar 2023 09:12:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 3249ChQo078833; Sat, 4 Mar 2023 09:12:43 GMT (envelope-from git) Date: Sat, 4 Mar 2023 09:12:43 GMT Message-Id: <202303040912.3249ChQo078833@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dmitry Chagin Subject: git: 5d5b633dde2a - main - linsysfs(4): Refactor to avoid referencing an unstable interfaces 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5d5b633dde2a12548daa3188fca27c04b51586bf Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=5d5b633dde2a12548daa3188fca27c04b51586bf commit 5d5b633dde2a12548daa3188fca27c04b51586bf Author: Dmitry Chagin AuthorDate: 2023-03-04 09:11:38 +0000 Commit: Dmitry Chagin CommitDate: 2023-03-04 09:11:38 +0000 linsysfs(4): Refactor to avoid referencing an unstable interfaces Enter the net epoch when traversing a list of interfaces. For that split the ifname_linux_to_bsd() function on two counterparts, where the ifname_linux_to_ifp() intended to use in epoch, while the ifname_linux_to_bsd() intended to be a self-contained. Until the linux_ioctl_coket() function is refactored, the ifname_linux_to_bsd() temporarily returns interface outside of the net epoch. Reviewed by: melifaro Differential Revision: https://reviews.freebsd.org/D38790 --- sys/compat/linsysfs/linsysfs.c | 103 ++++++++++++++++++++++++++-------------- sys/compat/linux/linux.c | 33 ++++++++----- sys/compat/linux/linux_common.h | 1 + 3 files changed, 90 insertions(+), 47 deletions(-) diff --git a/sys/compat/linsysfs/linsysfs.c b/sys/compat/linsysfs/linsysfs.c index 0c0744a054a0..3b1bdfc280fc 100644 --- a/sys/compat/linsysfs/linsysfs.c +++ b/sys/compat/linsysfs/linsysfs.c @@ -72,18 +72,23 @@ atoi(const char *str) static int linsysfs_ifnet_addr(PFS_FILL_ARGS) { + struct epoch_tracker et; struct l_sockaddr lsa; struct ifnet *ifp; - - ifp = ifname_linux_to_bsd(td, pn->pn_parent->pn_name, NULL); - if (ifp == NULL) - return (ENOENT); - if (linux_ifhwaddr(ifp, &lsa) != 0) - return (ENOENT); - sbuf_printf(sb, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", - lsa.sa_data[0], lsa.sa_data[1], lsa.sa_data[2], - lsa.sa_data[3], lsa.sa_data[4], lsa.sa_data[5]); - return (0); + int error; + + CURVNET_SET(TD_TO_VNET(td)); + NET_EPOCH_ENTER(et); + ifp = ifname_linux_to_ifp(td, pn->pn_parent->pn_name); + if (ifp != NULL && (error = linux_ifhwaddr(ifp, &lsa)) == 0) + error = sbuf_printf(sb, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + lsa.sa_data[0], lsa.sa_data[1], lsa.sa_data[2], + lsa.sa_data[3], lsa.sa_data[4], lsa.sa_data[5]); + else + error = ENOENT; + NET_EPOCH_EXIT(et); + CURVNET_RESTORE(); + return (error == -1 ? ERANGE : error); } static int @@ -97,37 +102,58 @@ linsysfs_ifnet_addrlen(PFS_FILL_ARGS) static int linsysfs_ifnet_flags(PFS_FILL_ARGS) { + struct epoch_tracker et; struct ifnet *ifp; - - ifp = ifname_linux_to_bsd(td, pn->pn_parent->pn_name, NULL); - if (ifp == NULL) - return (ENOENT); - sbuf_printf(sb, "0x%x\n", linux_ifflags(ifp)); - return (0); + int error; + + CURVNET_SET(TD_TO_VNET(td)); + NET_EPOCH_ENTER(et); + ifp = ifname_linux_to_ifp(td, pn->pn_parent->pn_name); + if (ifp != NULL) + error = sbuf_printf(sb, "0x%x\n", linux_ifflags(ifp)); + else + error = ENOENT; + NET_EPOCH_EXIT(et); + CURVNET_RESTORE(); + return (error == -1 ? ERANGE : error); } static int linsysfs_ifnet_ifindex(PFS_FILL_ARGS) { + struct epoch_tracker et; struct ifnet *ifp; - - ifp = ifname_linux_to_bsd(td, pn->pn_parent->pn_name, NULL); - if (ifp == NULL) - return (ENOENT); - sbuf_printf(sb, "%u\n", if_getindex(ifp)); - return (0); + int error; + + CURVNET_SET(TD_TO_VNET(td)); + NET_EPOCH_ENTER(et); + ifp = ifname_linux_to_ifp(td, pn->pn_parent->pn_name); + if (ifp != NULL) + error = sbuf_printf(sb, "%u\n", if_getindex(ifp)); + else + error = ENOENT; + NET_EPOCH_EXIT(et); + CURVNET_RESTORE(); + return (error == -1 ? ERANGE : error); } static int linsysfs_ifnet_mtu(PFS_FILL_ARGS) { + struct epoch_tracker et; struct ifnet *ifp; - - ifp = ifname_linux_to_bsd(td, pn->pn_parent->pn_name, NULL); - if (ifp == NULL) - return (ENOENT); - sbuf_printf(sb, "%u\n", if_getmtu(ifp)); - return (0); + int error; + + CURVNET_SET(TD_TO_VNET(td)); + NET_EPOCH_ENTER(et); + ifp = ifname_linux_to_ifp(td, pn->pn_parent->pn_name); + if (ifp != NULL) + error = sbuf_printf(sb, "%u\n", if_getmtu(ifp)); + else + error = ENOENT; + NET_EPOCH_EXIT(et); + CURVNET_RESTORE(); + return (error == -1 ? ERANGE : error); } static int @@ -142,16 +168,21 @@ linsysfs_ifnet_tx_queue_len(PFS_FILL_ARGS) static int linsysfs_ifnet_type(PFS_FILL_ARGS) { + struct epoch_tracker et; struct l_sockaddr lsa; struct ifnet *ifp; - - ifp = ifname_linux_to_bsd(td, pn->pn_parent->pn_name, NULL); - if (ifp == NULL) - return (ENOENT); - if (linux_ifhwaddr(ifp, &lsa) != 0) - return (ENOENT); - sbuf_printf(sb, "%d\n", lsa.sa_family); - return (0); + int error; + + CURVNET_SET(TD_TO_VNET(td)); + NET_EPOCH_ENTER(et); + ifp = ifname_linux_to_ifp(td, pn->pn_parent->pn_name); + if (ifp != NULL && (error = linux_ifhwaddr(ifp, &lsa)) == 0) + error = sbuf_printf(sb, "%d\n", lsa.sa_family); + else + error = ENOENT; + NET_EPOCH_EXIT(et); + CURVNET_RESTORE(); + return (error == -1 ? ERANGE : error); } static void diff --git a/sys/compat/linux/linux.c b/sys/compat/linux/linux.c index 135bc10e2dc1..f31a4b5e4f5c 100644 --- a/sys/compat/linux/linux.c +++ b/sys/compat/linux/linux.c @@ -342,7 +342,7 @@ ifname_bsd_to_linux_ifp(struct ifnet *ifp, char *lxname, size_t len) * bsdname and lxname need to be least IFNAMSIZ bytes long, but * can point to the same buffer. */ -struct ifname_linux_to_bsd_cb_s { +struct ifname_linux_to_ifp_cb_s { bool is_lo; bool is_eth; int ethno; @@ -352,9 +352,9 @@ struct ifname_linux_to_bsd_cb_s { }; static int -ifname_linux_to_bsd_cb(if_t ifp, void *arg) +ifname_linux_to_ifp_cb(if_t ifp, void *arg) { - struct ifname_linux_to_bsd_cb_s *cbs = arg; + struct ifname_linux_to_ifp_cb_s *cbs = arg; NET_EPOCH_ASSERT(); @@ -379,17 +379,18 @@ out: } struct ifnet * -ifname_linux_to_bsd(struct thread *td, const char *lxname, char *bsdname) +ifname_linux_to_ifp(struct thread *td, const char *lxname) { - struct ifname_linux_to_bsd_cb_s arg = { + struct ifname_linux_to_ifp_cb_s arg = { .ethno = 0, .lxname = lxname, .ifp = NULL, }; - struct epoch_tracker et; - int len, ret; + int len; char *ep; + NET_EPOCH_ASSERT(); + for (len = 0; len < LINUX_IFNAMSIZ; ++len) if (!isalpha(lxname[len]) || lxname[len] == '\0') break; @@ -406,14 +407,24 @@ ifname_linux_to_bsd(struct thread *td, const char *lxname, char *bsdname) return (NULL); arg.is_eth = (len == 3 && strncmp(lxname, "eth", len) == 0); + if_foreach(ifname_linux_to_ifp_cb, &arg); + return (arg.ifp); +} + +struct ifnet * +ifname_linux_to_bsd(struct thread *td, const char *lxname, char *bsdname) +{ + struct epoch_tracker et; + struct ifnet *ifp; + CURVNET_SET(TD_TO_VNET(td)); NET_EPOCH_ENTER(et); - ret = if_foreach(ifname_linux_to_bsd_cb, &arg); + ifp = ifname_linux_to_ifp(td, lxname); + if (ifp != NULL && bsdname != NULL) + strlcpy(bsdname, if_name(ifp), IFNAMSIZ); NET_EPOCH_EXIT(et); CURVNET_RESTORE(); - if (ret > 0 && arg.ifp != NULL && bsdname != NULL) - strlcpy(bsdname, if_name(arg.ifp), IFNAMSIZ); - return (arg.ifp); + return (ifp); } unsigned short diff --git a/sys/compat/linux/linux_common.h b/sys/compat/linux/linux_common.h index c25c4abf18ae..4b693ccaf868 100644 --- a/sys/compat/linux/linux_common.h +++ b/sys/compat/linux/linux_common.h @@ -33,6 +33,7 @@ int ifname_bsd_to_linux_ifp(struct ifnet *, char *, size_t); int ifname_bsd_to_linux_idx(u_int, char *, size_t); int ifname_bsd_to_linux_name(const char *, char *, size_t); +struct ifnet *ifname_linux_to_ifp(struct thread *, const char *); struct ifnet *ifname_linux_to_bsd(struct thread *td, const char *lxname, char *bsdname);