PR/49373: Ryota Ozaki: Running if_clone_create and if_clone_destroy in
parallel causes panic XXX: Pullup 7.
This commit is contained in:
parent
4d99909a7f
commit
a5d8dd44b5
12
sys/net/if.c
12
sys/net/if.c
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: if.c,v 1.291 2014/09/09 20:16:12 rmind Exp $ */
|
/* $NetBSD: if.c,v 1.292 2014/11/07 12:57:42 christos Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
|
* Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
|
||||||
|
@ -90,7 +90,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.291 2014/09/09 20:16:12 rmind Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.292 2014/11/07 12:57:42 christos Exp $");
|
||||||
|
|
||||||
#include "opt_inet.h"
|
#include "opt_inet.h"
|
||||||
|
|
||||||
|
@ -164,6 +164,7 @@ static u_int if_index = 1;
|
||||||
static size_t if_indexlim = 0;
|
static size_t if_indexlim = 0;
|
||||||
static uint64_t index_gen;
|
static uint64_t index_gen;
|
||||||
static kmutex_t index_gen_mtx;
|
static kmutex_t index_gen_mtx;
|
||||||
|
static kmutex_t if_clone_mtx;
|
||||||
|
|
||||||
static struct ifaddr ** ifnet_addrs = NULL;
|
static struct ifaddr ** ifnet_addrs = NULL;
|
||||||
|
|
||||||
|
@ -252,6 +253,7 @@ void
|
||||||
ifinit1(void)
|
ifinit1(void)
|
||||||
{
|
{
|
||||||
mutex_init(&index_gen_mtx, MUTEX_DEFAULT, IPL_NONE);
|
mutex_init(&index_gen_mtx, MUTEX_DEFAULT, IPL_NONE);
|
||||||
|
mutex_init(&if_clone_mtx, MUTEX_DEFAULT, IPL_NONE);
|
||||||
TAILQ_INIT(&ifnet_list);
|
TAILQ_INIT(&ifnet_list);
|
||||||
if_indexlim = 8;
|
if_indexlim = 8;
|
||||||
|
|
||||||
|
@ -1850,6 +1852,7 @@ doifioctl(struct socket *so, u_long cmd, void *data, struct lwp *l)
|
||||||
struct ifreq ifrb;
|
struct ifreq ifrb;
|
||||||
struct oifreq *oifr = NULL;
|
struct oifreq *oifr = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
int r;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
#ifdef COMPAT_OIFREQ
|
#ifdef COMPAT_OIFREQ
|
||||||
|
@ -1891,9 +1894,12 @@ doifioctl(struct socket *so, u_long cmd, void *data, struct lwp *l)
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
return (cmd == SIOCIFCREATE) ?
|
mutex_enter(&if_clone_mtx);
|
||||||
|
r = (cmd == SIOCIFCREATE) ?
|
||||||
if_clone_create(ifr->ifr_name) :
|
if_clone_create(ifr->ifr_name) :
|
||||||
if_clone_destroy(ifr->ifr_name);
|
if_clone_destroy(ifr->ifr_name);
|
||||||
|
mutex_exit(&if_clone_mtx);
|
||||||
|
return r;
|
||||||
|
|
||||||
case SIOCIFGCLONERS:
|
case SIOCIFGCLONERS:
|
||||||
return if_clone_list((struct if_clonereq *)data);
|
return if_clone_list((struct if_clonereq *)data);
|
||||||
|
|
Loading…
Reference in New Issue