Module Name: src Committed By: ozaki-r Date: Thu Jun 16 03:03:33 UTC 2016
Modified Files: src/sys/net: if.c if_ethersubr.c if_llatbl.c src/sys/net/npf: npf_ext_log.c src/sys/netinet6: mld6.c Log Message: Use if_get_byindex instead of if_byindex for MP-safe To generate a diff of this commit: cvs rdiff -u -r1.339 -r1.340 src/sys/net/if.c cvs rdiff -u -r1.222 -r1.223 src/sys/net/if_ethersubr.c cvs rdiff -u -r1.13 -r1.14 src/sys/net/if_llatbl.c cvs rdiff -u -r1.8 -r1.9 src/sys/net/npf/npf_ext_log.c cvs rdiff -u -r1.66 -r1.67 src/sys/netinet6/mld6.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.339 src/sys/net/if.c:1.340 --- src/sys/net/if.c:1.339 Thu Jun 16 02:38:40 2016 +++ src/sys/net/if.c Thu Jun 16 03:03:33 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.339 2016/06/16 02:38:40 ozaki-r Exp $ */ +/* $NetBSD: if.c,v 1.340 2016/06/16 03:03:33 ozaki-r 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.339 2016/06/16 02:38:40 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.340 2016/06/16 03:03:33 ozaki-r Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -3097,28 +3097,38 @@ if_sdl_sysctl(SYSCTLFN_ARGS) { struct ifnet *ifp; const struct sockaddr_dl *sdl; + struct psref psref; + int error = 0; + int bound; if (namelen != 1) return EINVAL; - ifp = if_byindex(name[0]); - if (ifp == NULL) - return ENODEV; + bound = curlwp_bind(); + ifp = if_get_byindex(name[0], &psref); + if (ifp == NULL) { + error = ENODEV; + goto out; + } sdl = ifp->if_sadl; if (sdl == NULL) { *oldlenp = 0; - return 0; + goto out; } if (oldp == NULL) { *oldlenp = sdl->sdl_alen; - return 0; + goto out; } if (*oldlenp >= sdl->sdl_alen) *oldlenp = sdl->sdl_alen; - return sysctl_copyout(l, &sdl->sdl_data[sdl->sdl_nlen], oldp, *oldlenp); + error = sysctl_copyout(l, &sdl->sdl_data[sdl->sdl_nlen], oldp, *oldlenp); +out: + if_put(ifp, &psref); + curlwp_bindx(bound); + return error; } SYSCTL_SETUP(sysctl_net_sdl_setup, "sysctl net.sdl subtree setup") Index: src/sys/net/if_ethersubr.c diff -u src/sys/net/if_ethersubr.c:1.222 src/sys/net/if_ethersubr.c:1.223 --- src/sys/net/if_ethersubr.c:1.222 Thu Apr 28 00:16:56 2016 +++ src/sys/net/if_ethersubr.c Thu Jun 16 03:03:33 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ethersubr.c,v 1.222 2016/04/28 00:16:56 ozaki-r Exp $ */ +/* $NetBSD: if_ethersubr.c,v 1.223 2016/06/16 03:03:33 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.222 2016/04/28 00:16:56 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.223 2016/06/16 03:03:33 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1475,24 +1475,31 @@ ether_multicast_sysctl(SYSCTLFN_ARGS) struct ether_multi_sysctl addr; struct ifnet *ifp; struct ethercom *ec; - int error; + int error = 0; size_t written; + struct psref psref; + int bound; if (namelen != 1) return EINVAL; - ifp = if_byindex(name[0]); - if (ifp == NULL) - return ENODEV; + bound = curlwp_bind(); + ifp = if_get_byindex(name[0], &psref); + if (ifp == NULL) { + error = ENODEV; + goto out; + } if (ifp->if_type != IFT_ETHER) { + if_put(ifp, &psref); *oldlenp = 0; - return 0; + goto out; } ec = (struct ethercom *)ifp; if (oldp == NULL) { + if_put(ifp, &psref); *oldlenp = ec->ec_multicnt * sizeof(addr); - return 0; + goto out; } memset(&addr, 0, sizeof(addr)); @@ -1511,8 +1518,11 @@ ether_multicast_sysctl(SYSCTLFN_ARGS) written += sizeof(addr); oldp = (char *)oldp + sizeof(addr); } + if_put(ifp, &psref); *oldlenp = written; +out: + curlwp_bindx(bound); return error; } Index: src/sys/net/if_llatbl.c diff -u src/sys/net/if_llatbl.c:1.13 src/sys/net/if_llatbl.c:1.14 --- src/sys/net/if_llatbl.c:1.13 Wed Apr 6 08:45:46 2016 +++ src/sys/net/if_llatbl.c Thu Jun 16 03:03:33 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_llatbl.c,v 1.13 2016/04/06 08:45:46 ozaki-r Exp $ */ +/* $NetBSD: if_llatbl.c,v 1.14 2016/06/16 03:03:33 ozaki-r Exp $ */ /* * Copyright (c) 2004 Luigi Rizzo, Alessandro Cerri. All rights reserved. * Copyright (c) 2004-2008 Qing Li. All rights reserved. @@ -592,14 +592,18 @@ lla_rt_output(const u_char rtm_type, con struct llentry *lle; u_int laflags; int error; + struct psref psref; + int bound; KASSERTMSG(dl != NULL && dl->sdl_family == AF_LINK, "invalid dl"); + bound = curlwp_bind(); if (sdl_index != 0) - ifp = if_byindex(sdl_index); + ifp = if_get_byindex(sdl_index, &psref); else - ifp = if_byindex(dl->sdl_index); + ifp = if_get_byindex(dl->sdl_index, &psref); if (ifp == NULL) { + curlwp_bindx(bound); log(LOG_INFO, "%s: invalid ifp (sdl_index %d)\n", __func__, sdl_index != 0 ? sdl_index : dl->sdl_index); return EINVAL; @@ -628,7 +632,8 @@ lla_rt_output(const u_char rtm_type, con (lle->la_flags & LLE_STATIC || lle->la_expire == 0)) { LLE_RUNLOCK(lle); IF_AFDATA_WUNLOCK(ifp); - return EEXIST; + error = EEXIST; + goto out; } if (lle != NULL) LLE_RUNLOCK(lle); @@ -636,7 +641,8 @@ lla_rt_output(const u_char rtm_type, con lle = lla_create(llt, 0, dst); if (lle == NULL) { IF_AFDATA_WUNLOCK(ifp); - return (ENOMEM); + error = ENOMEM; + goto out; } KASSERT(ifp->if_addrlen <= sizeof(lle->ll_addr)); @@ -680,12 +686,16 @@ lla_rt_output(const u_char rtm_type, con IF_AFDATA_WLOCK(ifp); error = lla_delete(llt, 0, dst); IF_AFDATA_WUNLOCK(ifp); - return (error == 0 ? 0 : ENOENT); + error = (error == 0 ? 0 : ENOENT); + break; default: error = EINVAL; } +out: + if_put(ifp, &psref); + curlwp_bindx(bound); return (error); } Index: src/sys/net/npf/npf_ext_log.c diff -u src/sys/net/npf/npf_ext_log.c:1.8 src/sys/net/npf/npf_ext_log.c:1.9 --- src/sys/net/npf/npf_ext_log.c:1.8 Sun Jul 20 00:37:41 2014 +++ src/sys/net/npf/npf_ext_log.c Thu Jun 16 03:03:33 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ext_log.c,v 1.8 2014/07/20 00:37:41 rmind Exp $ */ +/* $NetBSD: npf_ext_log.c,v 1.9 2016/06/16 03:03:33 ozaki-r Exp $ */ /*- * Copyright (c) 2010-2012 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_ext_log.c,v 1.8 2014/07/20 00:37:41 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ext_log.c,v 1.9 2016/06/16 03:03:33 ozaki-r Exp $"); #include <sys/types.h> #include <sys/module.h> @@ -85,6 +85,7 @@ npf_log(npf_cache_t *npc, void *meta, in const npf_ext_log_t *log = meta; ifnet_t *ifp; int family; + struct psref psref; /* Set the address family. */ if (npf_iscached(npc, NPC_IP4)) { @@ -98,7 +99,7 @@ npf_log(npf_cache_t *npc, void *meta, in KERNEL_LOCK(1, NULL); /* Find a pseudo-interface to log. */ - ifp = if_byindex(log->if_idx); + ifp = if_get_byindex(log->if_idx, &psref); if (ifp == NULL) { /* No interface. */ KERNEL_UNLOCK_ONE(NULL); @@ -109,6 +110,7 @@ npf_log(npf_cache_t *npc, void *meta, in ifp->if_opackets++; ifp->if_obytes += m->m_pkthdr.len; bpf_mtap_af(ifp, family, m); + if_put(ifp, &psref); KERNEL_UNLOCK_ONE(NULL); return true; Index: src/sys/netinet6/mld6.c diff -u src/sys/netinet6/mld6.c:1.66 src/sys/netinet6/mld6.c:1.67 --- src/sys/netinet6/mld6.c:1.66 Fri Jun 10 13:31:44 2016 +++ src/sys/netinet6/mld6.c Thu Jun 16 03:03:33 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: mld6.c,v 1.66 2016/06/10 13:31:44 ozaki-r Exp $ */ +/* $NetBSD: mld6.c,v 1.67 2016/06/16 03:03:33 ozaki-r Exp $ */ /* $KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $ */ /* @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.66 2016/06/10 13:31:44 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.67 2016/06/16 03:03:33 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -982,13 +982,18 @@ in6_multicast_sysctl(SYSCTLFN_ARGS) uint32_t tmp; int error; size_t written; + struct psref psref; + int bound; if (namelen != 1) return EINVAL; - ifp = if_byindex(name[0]); - if (ifp == NULL) + bound = curlwp_bind(); + ifp = if_get_byindex(name[0], &psref); + if (ifp == NULL) { + curlwp_bindx(bound); return ENODEV; + } if (oldp == NULL) { *oldlenp = 0; @@ -1003,6 +1008,8 @@ in6_multicast_sysctl(SYSCTLFN_ARGS) sizeof(uint32_t); } } + if_put(ifp, &psref); + curlwp_bindx(bound); return 0; } @@ -1039,6 +1046,8 @@ in6_multicast_sysctl(SYSCTLFN_ARGS) } } done: + if_put(ifp, &psref); + curlwp_bindx(bound); *oldlenp = written; return error; }