Module Name: src Committed By: yamaguchi Date: Tue Nov 28 05:28:37 UTC 2023
Modified Files: src/sys/net/lagg: if_lagg.c if_laggproto.c if_laggproto.h Log Message: lagg(4): Fix missing IFNET_LOCK acquirement To generate a diff of this commit: cvs rdiff -u -r1.54 -r1.55 src/sys/net/lagg/if_lagg.c cvs rdiff -u -r1.7 -r1.8 src/sys/net/lagg/if_laggproto.c cvs rdiff -u -r1.19 -r1.20 src/sys/net/lagg/if_laggproto.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/lagg/if_lagg.c diff -u src/sys/net/lagg/if_lagg.c:1.54 src/sys/net/lagg/if_lagg.c:1.55 --- src/sys/net/lagg/if_lagg.c:1.54 Wed Nov 22 03:49:13 2023 +++ src/sys/net/lagg/if_lagg.c Tue Nov 28 05:28:37 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: if_lagg.c,v 1.54 2023/11/22 03:49:13 yamaguchi Exp $ */ +/* $NetBSD: if_lagg.c,v 1.55 2023/11/28 05:28:37 yamaguchi Exp $ */ /* * Copyright (c) 2005, 2006 Reyk Floeter <r...@openbsd.org> @@ -20,7 +20,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.54 2023/11/22 03:49:13 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.55 2023/11/28 05:28:37 yamaguchi Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -114,7 +114,7 @@ static const struct lagg_proto lagg_prot .pr_startport = lagg_common_startport, .pr_stopport = lagg_common_stopport, .pr_portstat = lagg_fail_portstat, - .pr_linkstate = lagg_common_linkstate, + .pr_linkstate = lagg_common_linkstate_ifnet_locked, .pr_ioctl = lagg_fail_ioctl, }, [LAGG_PROTO_LOADBALANCE] = { @@ -128,7 +128,7 @@ static const struct lagg_proto lagg_prot .pr_startport = lagg_lb_startport, .pr_stopport = lagg_lb_stopport, .pr_portstat = lagg_lb_portstat, - .pr_linkstate = lagg_common_linkstate, + .pr_linkstate = lagg_common_linkstate_ifnet_locked, }, }; Index: src/sys/net/lagg/if_laggproto.c diff -u src/sys/net/lagg/if_laggproto.c:1.7 src/sys/net/lagg/if_laggproto.c:1.8 --- src/sys/net/lagg/if_laggproto.c:1.7 Wed Nov 22 03:49:13 2023 +++ src/sys/net/lagg/if_laggproto.c Tue Nov 28 05:28:37 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: if_laggproto.c,v 1.7 2023/11/22 03:49:13 yamaguchi Exp $ */ +/* $NetBSD: if_laggproto.c,v 1.8 2023/11/28 05:28:37 yamaguchi Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause-NetBSD @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_laggproto.c,v 1.7 2023/11/22 03:49:13 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_laggproto.c,v 1.8 2023/11/28 05:28:37 yamaguchi Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -114,6 +114,8 @@ static struct lagg_port * static void lagg_fail_linkspeed_work(struct lagg_work *, void *); static void lagg_lb_linkspeed_work(struct lagg_work*, void *); +static void lagg_common_linkstate(struct lagg_proto_softc *, + struct lagg_port *); static inline struct lagg_portmap * lagg_portmap_active(struct lagg_portmaps *maps) @@ -364,9 +366,19 @@ lagg_common_stopport(struct lagg_proto_s pport->lpp_active = false; } } +static void +lagg_common_linkstate(struct lagg_proto_softc *psc, struct lagg_port *lp) +{ + + IFNET_ASSERT_UNLOCKED(lp->lp_ifp); + + IFNET_LOCK(lp->lp_ifp); + lagg_common_linkstate_ifnet_locked(psc, lp); + IFNET_UNLOCK(lp->lp_ifp); +} void -lagg_common_linkstate(struct lagg_proto_softc *psc, struct lagg_port *lp) +lagg_common_linkstate_ifnet_locked(struct lagg_proto_softc *psc, struct lagg_port *lp) { struct lagg_proto_port *pport; struct ifnet *ifp, *ifp_port; @@ -379,6 +391,8 @@ lagg_common_linkstate(struct lagg_proto_ is_active = lagg_portactive(lp); ifp_port = lp->lp_ifp; + KASSERT(IFNET_LOCKED(ifp_port)); + LAGG_PROTO_LOCK(psc); if (!pport->lpp_running || pport->lpp_active == is_active) { Index: src/sys/net/lagg/if_laggproto.h diff -u src/sys/net/lagg/if_laggproto.h:1.19 src/sys/net/lagg/if_laggproto.h:1.20 --- src/sys/net/lagg/if_laggproto.h:1.19 Wed Nov 22 03:49:13 2023 +++ src/sys/net/lagg/if_laggproto.h Tue Nov 28 05:28:37 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: if_laggproto.h,v 1.19 2023/11/22 03:49:13 yamaguchi Exp $ */ +/* $NetBSD: if_laggproto.h,v 1.20 2023/11/28 05:28:37 yamaguchi Exp $ */ /* * Copyright (c) 2021 Internet Initiative Japan Inc. @@ -298,7 +298,7 @@ void lagg_common_startport(struct lagg_ struct lagg_port *); void lagg_common_stopport(struct lagg_proto_softc *, struct lagg_port *); -void lagg_common_linkstate(struct lagg_proto_softc *, +void lagg_common_linkstate_ifnet_locked(struct lagg_proto_softc *, struct lagg_port *); int lagg_none_attach(struct lagg_softc *,