Hello,
diff below is the first step to make pfioctl() _without_ NET_LOCK().
Currently pf_if.c seems to be the only blocker which prevents us
from removing all NET_LOCK()/NET_UNLOCK() calls we have in pf(4).
diff below passed very basic smoke test. OK to commit?
thanks and
regards
sashan
--------8<---------------8<---------------8<------------------8<--------
diff --git a/sys/net/pf_if.c b/sys/net/pf_if.c
index e23c14e6769..e86d85aa2c4 100644
--- a/sys/net/pf_if.c
+++ b/sys/net/pf_if.c
@@ -53,10 +53,17 @@
#include <net/pfvar.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+
#ifdef INET6
#include <netinet/ip6.h>
+#include <netinet/icmp6.h>
#endif /* INET6 */
+#include <net/pfvar_priv.h>
+
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
#define islower(c) ((c) >= 'a' && (c) <= 'z')
#define isalpha(c) (isupper(c)||islower(c))
@@ -296,6 +303,7 @@ pfi_attach_ifnet(struct ifnet *ifp)
struct pfi_kif *kif;
struct task *t;
+ PF_LOCK();
pfi_initialize();
pfi_update++;
if ((kif = pfi_kif_get(ifp->if_xname, NULL)) == NULL)
@@ -310,6 +318,7 @@ pfi_attach_ifnet(struct ifnet *ifp)
kif->pfik_ah_cookie = t;
pfi_kif_update(kif);
+ PF_UNLOCK();
}
void
@@ -321,6 +330,7 @@ pfi_detach_ifnet(struct ifnet *ifp)
if ((kif = (struct pfi_kif *)ifp->if_pf_kif) == NULL)
return;
+ PF_LOCK();
pfi_update++;
t = kif->pfik_ah_cookie;
kif->pfik_ah_cookie = NULL;
@@ -332,6 +342,7 @@ pfi_detach_ifnet(struct ifnet *ifp)
kif->pfik_ifp = NULL;
ifp->if_pf_kif = NULL;
pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ PF_UNLOCK();
}
void
@@ -339,6 +350,7 @@ pfi_attach_ifgroup(struct ifg_group *ifg)
{
struct pfi_kif *kif;
+ PF_LOCK();
pfi_initialize();
pfi_update++;
if ((kif = pfi_kif_get(ifg->ifg_group, NULL)) == NULL)
@@ -346,6 +358,7 @@ pfi_attach_ifgroup(struct ifg_group *ifg)
kif->pfik_group = ifg;
ifg->ifg_pf_kif = (caddr_t)kif;
+ PF_UNLOCK();
}
void
@@ -356,11 +369,13 @@ pfi_detach_ifgroup(struct ifg_group *ifg)
if ((kif = (struct pfi_kif *)ifg->ifg_pf_kif) == NULL)
return;
+ PF_LOCK();
pfi_update++;
kif->pfik_group = NULL;
ifg->ifg_pf_kif = NULL;
pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ PF_UNLOCK();
}
void
@@ -378,15 +393,19 @@ pfi_group_change(const char *group)
void
pfi_group_delmember(const char *group)
{
+ PF_LOCK();
pfi_group_change(group);
pfi_xcommit();
+ PF_UNLOCK();
}
void
pfi_group_addmember(const char *group)
{
+ PF_LOCK();
pfi_group_change(group);
pfi_xcommit();
+ PF_UNLOCK();
}
int
@@ -686,8 +705,10 @@ pfi_kifaddr_update(void *v)
NET_ASSERT_LOCKED();
+ PF_LOCK();
pfi_update++;
pfi_kif_update(kif);
+ PF_UNLOCK();
}
int