Module Name: src Committed By: riastradh Date: Fri Dec 31 14:25:59 UTC 2021
Modified Files: src/sys/net: if.c Log Message: sys/net: Assert IFNET_LOCKED in if_ioctl, if_init, and if_stop. Exception: Not for SIOCADDMULTI/SIOCDELMULTI, for which it is the driver's responsibility to take internal locks. Typically this is already done via struct ethercom::ec_lock. To generate a diff of this commit: cvs rdiff -u -r1.498 -r1.499 src/sys/net/if.c 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/if.c diff -u src/sys/net/if.c:1.498 src/sys/net/if.c:1.499 --- src/sys/net/if.c:1.498 Fri Dec 31 14:24:50 2021 +++ src/sys/net/if.c Fri Dec 31 14:25:58 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.498 2021/12/31 14:24:50 riastradh Exp $ */ +/* $NetBSD: if.c,v 1.499 2021/12/31 14:25:58 riastradh Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc. @@ -90,7 +90,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.498 2021/12/31 14:24:50 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.499 2021/12/31 14:25:58 riastradh Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -2733,13 +2733,25 @@ ifpromisc(struct ifnet *ifp, int pswitch * Apply an ioctl command to the interface. Returns 0 on success, * nonzero errno(3) number on failure. * - * May sleep. Caller must hold ifp->if_ioctl_lock. + * For SIOCADDMULTI/SIOCDELMULTI, caller need not hold locks -- it + * is the driver's responsibility to take any internal locks. + * (Kernel logic should generally invoke these only through + * if_mcast_op.) + * + * For all other ioctls, caller must hold ifp->if_ioctl_lock, + * a.k.a. IFNET_LOCK. May sleep. */ int if_ioctl(struct ifnet *ifp, u_long cmd, void *data) { - KASSERT(1 || IFNET_LOCKED(ifp)); /* XXX not yet */ + switch (cmd) { + case SIOCADDMULTI: + case SIOCDELMULTI: + break; + default: + KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname); + } return (*ifp->if_ioctl)(ifp, cmd, data); } @@ -2758,7 +2770,7 @@ int if_init(struct ifnet *ifp) { - KASSERT(1 || IFNET_LOCKED(ifp)); /* XXX not yet */ + KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname); return (*ifp->if_init)(ifp); } @@ -2777,7 +2789,7 @@ void if_stop(struct ifnet *ifp, int disable) { - KASSERT(1 || IFNET_LOCKED(ifp)); /* XXX not yet */ + KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname); (*ifp->if_stop)(ifp, disable); } @@ -3864,11 +3876,6 @@ if_mcast_op(ifnet_t *ifp, const unsigned int rc; struct ifreq ifr; - /* - * XXX NOMPSAFE - this calls if_ioctl without holding IFNET_LOCK() - * in some cases - e.g. when called from vlan/netinet/netinet6 code - * directly rather than via doifoictl() - */ ifreq_setaddr(cmd, &ifr, sa); rc = if_ioctl(ifp, cmd, &ifr);