svn commit: r357013 - head/sys/net
Gleb Smirnoff
glebius at FreeBSD.org
Thu Jan 23 01:49:23 UTC 2020
Author: glebius
Date: Thu Jan 23 01:49:22 2020
New Revision: 357013
URL: https://svnweb.freebsd.org/changeset/base/357013
Log:
Since now drivers that support pfil run their interrupts in the network
epoch, stop entering it in pfil_run_hooks(). Assert the epoch there.
Modified:
head/sys/net/pfil.c
Modified: head/sys/net/pfil.c
==============================================================================
--- head/sys/net/pfil.c Thu Jan 23 01:47:43 2020 (r357012)
+++ head/sys/net/pfil.c Thu Jan 23 01:49:22 2020 (r357013)
@@ -69,10 +69,6 @@ MTX_SYSINIT(pfil_mtxinit, &pfil_lock, "pfil(9) lock",
#define PFIL_UNLOCK() mtx_unlock(&pfil_lock)
#define PFIL_LOCK_ASSERT() mtx_assert(&pfil_lock, MA_OWNED)
-#define PFIL_EPOCH net_epoch_preempt
-#define PFIL_EPOCH_ENTER(et) epoch_enter_preempt(net_epoch_preempt, &(et))
-#define PFIL_EPOCH_EXIT(et) epoch_exit_preempt(net_epoch_preempt, &(et))
-
struct pfil_hook {
pfil_func_t hook_func;
void *hook_ruleset;
@@ -168,12 +164,13 @@ int
pfil_run_hooks(struct pfil_head *head, pfil_packet_t p, struct ifnet *ifp,
int flags, struct inpcb *inp)
{
- struct epoch_tracker et;
pfil_chain_t *pch;
struct pfil_link *link;
pfil_return_t rv;
bool realloc = false;
+ NET_EPOCH_ASSERT();
+
if (PFIL_DIR(flags) == PFIL_IN)
pch = &head->head_in;
else if (__predict_true(PFIL_DIR(flags) == PFIL_OUT))
@@ -182,7 +179,6 @@ pfil_run_hooks(struct pfil_head *head, pfil_packet_t p
panic("%s: bogus flags %d", __func__, flags);
rv = PFIL_PASS;
- PFIL_EPOCH_ENTER(et);
CK_STAILQ_FOREACH(link, pch, link_chain) {
if ((flags & PFIL_MEMPTR) && !(link->link_flags & PFIL_MEMPTR))
rv = pfil_fake_mbuf(link->link_func, &p, ifp, flags,
@@ -197,7 +193,6 @@ pfil_run_hooks(struct pfil_head *head, pfil_packet_t p
realloc = true;
}
}
- PFIL_EPOCH_EXIT(et);
if (realloc && rv == PFIL_PASS)
rv = PFIL_REALLOCED;
return (rv);
@@ -313,9 +308,9 @@ pfil_unlink(struct pfil_link_args *pa, pfil_head_t hea
PFIL_UNLOCK();
if (in != NULL)
- epoch_call(PFIL_EPOCH, pfil_link_free, &in->link_epoch_ctx);
+ NET_EPOCH_CALL(pfil_link_free, &in->link_epoch_ctx);
if (out != NULL)
- epoch_call(PFIL_EPOCH, pfil_link_free, &out->link_epoch_ctx);
+ NET_EPOCH_CALL(pfil_link_free, &out->link_epoch_ctx);
if (in == NULL && out == NULL)
return (ENOENT);
@@ -443,15 +438,13 @@ retry:
if (in != NULL) {
head->head_nhooksin--;
hook->hook_links--;
- epoch_call(PFIL_EPOCH, pfil_link_free,
- &in->link_epoch_ctx);
+ NET_EPOCH_CALL(pfil_link_free, &in->link_epoch_ctx);
}
out = pfil_link_remove(&head->head_out, hook);
if (out != NULL) {
head->head_nhooksout--;
hook->hook_links--;
- epoch_call(PFIL_EPOCH, pfil_link_free,
- &out->link_epoch_ctx);
+ NET_EPOCH_CALL(pfil_link_free, &out->link_epoch_ctx);
}
if (in != NULL || out != NULL)
/* What if some stupid admin put same filter twice? */
More information about the svn-src-all
mailing list