From owner-dev-commits-src-all@freebsd.org Sun Jan 17 20:32:34 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 161FF4D750B; Sun, 17 Jan 2021 20:32:34 +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 4DJmnG084qz4TL6; Sun, 17 Jan 2021 20:32:34 +0000 (UTC) (envelope-from git@FreeBSD.org) 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 EBC9E279B0; Sun, 17 Jan 2021 20:32:33 +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 10HKWXRF045981; Sun, 17 Jan 2021 20:32:33 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 10HKWXFL045980; Sun, 17 Jan 2021 20:32:33 GMT (envelope-from git) Date: Sun, 17 Jan 2021 20:32:33 GMT Message-Id: <202101172032.10HKWXFL045980@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 9d6567bc30a0 - main - Fix panic on vnet creation if fib algo has been set to fixed value. Make fixed algo property per-VNET instead of global. MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9d6567bc30a0ae3f6660cc55bc97283ba791b112 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Jan 2021 20:32:34 -0000 The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=9d6567bc30a0ae3f6660cc55bc97283ba791b112 commit 9d6567bc30a0ae3f6660cc55bc97283ba791b112 Author: Alexander V. Chernikov AuthorDate: 2021-01-16 22:55:14 +0000 Commit: Alexander V. Chernikov CommitDate: 2021-01-17 20:32:25 +0000 Fix panic on vnet creation if fib algo has been set to fixed value. Make fixed algo property per-VNET instead of global. --- sys/net/route/fib_algo.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/sys/net/route/fib_algo.c b/sys/net/route/fib_algo.c index 5e63535f3926..b84217034e16 100644 --- a/sys/net/route/fib_algo.c +++ b/sys/net/route/fib_algo.c @@ -106,12 +106,14 @@ SYSCTL_NODE(_net_route, OID_AUTO, algo, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "Fib algorithm lookups"); #ifdef INET6 -bool algo_fixed_inet6 = false; +VNET_DEFINE_STATIC(bool, algo_fixed_inet6) = false; +#define V_algo_fixed_inet6 VNET(algo_fixed_inet6) SYSCTL_NODE(_net_route_algo, OID_AUTO, inet6, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "IPv6 longest prefix match lookups"); #endif #ifdef INET -bool algo_fixed_inet = false; +VNET_DEFINE_STATIC(bool, algo_fixed_inet) = false; +#define V_algo_fixed_inet VNET(algo_fixed_inet) SYSCTL_NODE(_net_route_algo, OID_AUTO, inet, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "IPv4 longest prefix match lookups"); #endif @@ -155,6 +157,7 @@ static void destroy_fd_instance_epoch(epoch_context_t ctx); static enum flm_op_result attach_datapath(struct fib_data *fd); static bool is_idx_free(struct fib_data *fd, uint32_t index); static void set_algo_fixed(struct rib_head *rh); +static bool is_algo_fixed(struct rib_head *rh); static uint32_t fib_ref_nhop(struct fib_data *fd, struct nhop_object *nh); static void fib_unref_nhop(struct fib_data *fd, struct nhop_object *nh); @@ -983,7 +986,7 @@ static void rebuild_fd_callout(void *_data) { struct fib_data *fd, *fd_new, *fd_tmp; - struct fib_lookup_module *flm_new; + struct fib_lookup_module *flm_new = NULL; struct epoch_tracker et; enum flm_op_result result; bool need_rebuild = false; @@ -1000,7 +1003,8 @@ rebuild_fd_callout(void *_data) CURVNET_SET(fd->fd_vnet); /* First, check if we're still OK to use this algo */ - flm_new = fib_check_best_algo(fd->fd_rh, fd->fd_flm); + if (!is_algo_fixed(fd->fd_rh)) + flm_new = fib_check_best_algo(fd->fd_rh, fd->fd_flm); if ((flm_new == NULL) && (!need_rebuild)) { /* Keep existing algo, no need to rebuild. */ CURVNET_RESTORE(); @@ -1135,7 +1139,7 @@ set_algo_inet_sysctl_handler(SYSCTL_HANDLER_ARGS) return (set_fib_algo(RT_DEFAULT_FIB, AF_INET, oidp, req)); } SYSCTL_PROC(_net_route_algo_inet, OID_AUTO, algo, - CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0, + CTLFLAG_VNET | CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0, set_algo_inet_sysctl_handler, "A", "Set IPv4 lookup algo"); #endif @@ -1147,7 +1151,7 @@ set_algo_inet6_sysctl_handler(SYSCTL_HANDLER_ARGS) return (set_fib_algo(RT_DEFAULT_FIB, AF_INET6, oidp, req)); } SYSCTL_PROC(_net_route_algo_inet6, OID_AUTO, algo, - CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0, + CTLFLAG_VNET | CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0, set_algo_inet6_sysctl_handler, "A", "Set IPv6 lookup algo"); #endif @@ -1434,12 +1438,12 @@ set_algo_fixed(struct rib_head *rh) switch (rh->rib_family) { #ifdef INET case AF_INET: - algo_fixed_inet = true; + V_algo_fixed_inet = true; break; #endif #ifdef INET6 case AF_INET6: - algo_fixed_inet6 = true; + V_algo_fixed_inet6 = true; break; #endif } @@ -1452,11 +1456,11 @@ is_algo_fixed(struct rib_head *rh) switch (rh->rib_family) { #ifdef INET case AF_INET: - return (algo_fixed_inet); + return (V_algo_fixed_inet); #endif #ifdef INET6 case AF_INET6: - return (algo_fixed_inet6); + return (V_algo_fixed_inet6); #endif } return (false); @@ -1480,11 +1484,6 @@ fib_check_best_algo(struct rib_head *rh, struct fib_lookup_module *orig_flm) fib_get_rtable_info(rh, &rinfo); FIB_MOD_LOCK(); - if (is_algo_fixed(rh)) { - FIB_MOD_UNLOCK(); - return (NULL); - } - TAILQ_FOREACH(flm, &all_algo_list, entries) { if (flm->flm_family != rh->rib_family) continue;