aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/ip_encap.c
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2019-10-07 22:40:05 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2019-10-07 22:40:05 +0000
commitb8a6e03fac922677455d8e0977831506cf8212e8 (patch)
tree28fc099c8daca3278068766b2863e110876865ce /sys/netinet/ip_encap.c
parent746c7ae563142eaae423b0e6c0077ef2013c2435 (diff)
downloadsrc-b8a6e03fac922677455d8e0977831506cf8212e8.tar.gz
src-b8a6e03fac922677455d8e0977831506cf8212e8.zip
Widen NET_EPOCH coverage.
When epoch(9) was introduced to network stack, it was basically dropped in place of existing locking, which was mutexes and rwlocks. For the sake of performance mutex covered areas were as small as possible, so became epoch covered areas. However, epoch doesn't introduce any contention, it just delays memory reclaim. So, there is no point to minimise epoch covered areas in sense of performance. Meanwhile entering/exiting epoch also has non-zero CPU usage, so doing this less often is a win. Not the least is also code maintainability. In the new paradigm we can assume that at any stage of processing a packet, we are inside network epoch. This makes coding both input and output path way easier. On output path we already enter epoch quite early - in the ip_output(), in the ip6_output(). This patch does the same for the input path. All ISR processing, network related callouts, other ways of packet injection to the network stack shall be performed in net_epoch. Any leaf function that walks network configuration now asserts epoch. Tricky part is configuration code paths - ioctls, sysctls. They also call into leaf functions, so some need to be changed. This patch would introduce more epoch recursions (see EPOCH_TRACE) than we had before. They will be cleaned up separately, as several of them aren't trivial. Note, that unlike a lock recursion the epoch recursion is safe and just wastes a bit of resources. Reviewed by: gallatin, hselasky, cy, adrian, kristof Differential Revision: https://reviews.freebsd.org/D19111
Notes
Notes: svn path=/head/; revision=353292
Diffstat (limited to 'sys/netinet/ip_encap.c')
-rw-r--r--sys/netinet/ip_encap.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/sys/netinet/ip_encap.c b/sys/netinet/ip_encap.c
index ebcce2958a32..15ba528e7e0c 100644
--- a/sys/netinet/ip_encap.c
+++ b/sys/netinet/ip_encap.c
@@ -125,11 +125,9 @@ MTX_SYSINIT(srcaddrmtx, &srcaddrmtx, "srcaddrmtx", MTX_DEF);
#define ENCAP_WLOCK() mtx_lock(&encapmtx)
#define ENCAP_WUNLOCK() mtx_unlock(&encapmtx)
#define ENCAP_RLOCK_TRACKER struct epoch_tracker encap_et
-#define ENCAP_RLOCK() \
- epoch_enter_preempt(net_epoch_preempt, &encap_et)
-#define ENCAP_RUNLOCK() \
- epoch_exit_preempt(net_epoch_preempt, &encap_et)
-#define ENCAP_WAIT() epoch_wait_preempt(net_epoch_preempt)
+#define ENCAP_RLOCK() NET_EPOCH_ENTER(encap_et)
+#define ENCAP_RUNLOCK() NET_EPOCH_EXIT(encap_et)
+#define ENCAP_WAIT() NET_EPOCH_WAIT()
#define SRCADDR_WLOCK() mtx_lock(&srcaddrmtx)
#define SRCADDR_WUNLOCK() mtx_unlock(&srcaddrmtx)