Thu Aug 27 18:50:25 2020 UTC ()
npf: Make sure to initialize portmap_lock only once.
PR kern/55586
(riastradh)
diff -r1.43 -r1.44 src/sys/net/npf/npf.c
diff -r1.81 -r1.82 src/sys/net/npf/npf_impl.h
diff -r1.5 -r1.6 src/sys/net/npf/npf_portmap.c
diff -r1.18 -r1.19 src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c
--- src/sys/net/npf/npf.c 2020/05/30 14:16:56 1.43
+++ src/sys/net/npf/npf.c 2020/08/27 18:50:25 1.44
@@ -33,7 +33,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.43 2020/05/30 14:16:56 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.44 2020/08/27 18:50:25 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -52,16 +52,20 @@
__dso_public int
npfk_sysinit(unsigned nworkers)
{
+
npf_bpf_sysinit();
npf_tableset_sysinit();
npf_nat_sysinit();
+ npf_portmap_sysinit();
return npf_worker_sysinit(nworkers);
}
__dso_public void
npfk_sysfini(void)
{
+
npf_worker_sysfini();
+ npf_portmap_sysfini();
npf_nat_sysfini();
npf_tableset_sysfini();
npf_bpf_sysfini();
--- src/sys/net/npf/npf_impl.h 2020/05/30 14:16:56 1.81
+++ src/sys/net/npf/npf_impl.h 2020/08/27 18:50:25 1.82
@@ -472,6 +472,9 @@
int npf_state_tcp_timeout(npf_t *, const npf_state_t *);
/* Portmap. */
+void npf_portmap_sysinit(void);
+void npf_portmap_sysfini(void);
+
void npf_portmap_init(npf_t *);
void npf_portmap_fini(npf_t *);
--- src/sys/net/npf/npf_portmap.c 2020/05/30 14:16:56 1.5
+++ src/sys/net/npf/npf_portmap.c 2020/08/27 18:50:25 1.6
@@ -35,7 +35,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_portmap.c,v 1.5 2020/05/30 14:16:56 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_portmap.c,v 1.6 2020/08/27 18:50:25 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -109,6 +109,22 @@
static kmutex_t portmap_lock;
void
+npf_portmap_sysinit(void)
+{
+
+ mutex_init(&portmap_lock, MUTEX_DEFAULT, IPL_SOFTNET);
+ __insn_barrier();
+}
+
+void
+npf_portmap_sysfini(void)
+{
+
+ mutex_destroy(&portmap_lock);
+ __insn_barrier();
+}
+
+void
npf_portmap_init(npf_t *npf)
{
npf_portmap_t *pm = npf_portmap_create(
@@ -127,16 +143,16 @@
.min = 1024, .max = 65535
}
};
+
npf_param_register(npf, param_map, __arraycount(param_map));
- mutex_init(&portmap_lock, MUTEX_DEFAULT, IPL_SOFTNET);
npf->portmap = pm;
}
void
npf_portmap_fini(npf_t *npf)
{
+
npf_portmap_destroy(npf->portmap);
- mutex_destroy(&portmap_lock);
npf->portmap = NULL; // diagnostic
}
--- src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c 2020/05/30 21:00:31 1.18
+++ src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c 2020/08/27 18:50:25 1.19
@@ -71,7 +71,6 @@
npf_worker_sysfini();
}
#endif
- npfk_sysinit(0);
npf = npfk_create(0, &npftest_mbufops, &npftest_ifops, NULL);
npfk_thread_register(npf);
npf_setkernctx(npf);
@@ -88,9 +87,9 @@
npf_test_fini(void)
{
npf_t *npf = npf_getkernctx();
+
npfk_thread_unregister(npf);
npfk_destroy(npf);
- npfk_sysfini();
}
int