On Mon, Nov 28, 2016 at 03:28:40PM +0100, Martin Pieuchot wrote:
> These chunks depend on the if_attach() bits I sent in the previous
> email. As soon as if_attach() always raise the ipl level to IPL_SOFTNET
> pfi_attach_ifnet() doesn't need to do it.
>
> The rest is already safe since hooks are already called at IPL_SOFTNET.
I found these paths without splsoftnet()
carpattach -> if_creategroup -> pfi_attach_ifgroup
setroot -> if_addgroup -> pfi_group_change
encattach -> enc_clone_create -> if_addgroup -> pfi_group_change
loopattach -> loop_clone_create -> if_addgroup -> pfi_group_change
I guess they are not relevant as they happen during boot.
> ok?
OK bluhm@
>
> Index: net/pf_if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf_if.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 pf_if.c
> --- net/pf_if.c 16 Nov 2016 08:46:05 -0000 1.87
> +++ net/pf_if.c 28 Nov 2016 14:16:03 -0000
> @@ -223,10 +223,8 @@ void
> pfi_attach_ifnet(struct ifnet *ifp)
> {
> struct pfi_kif *kif;
> - int s;
>
> pfi_initialize();
> - s = splsoftnet();
> pfi_update++;
> if ((kif = pfi_kif_get(ifp->if_xname)) == NULL)
> panic("pfi_kif_get failed");
> @@ -240,20 +238,16 @@ pfi_attach_ifnet(struct ifnet *ifp)
> ifp->if_xname);
>
> pfi_kif_update(kif);
> -
> - splx(s);
> }
>
> void
> pfi_detach_ifnet(struct ifnet *ifp)
> {
> - int s;
> struct pfi_kif *kif;
>
> if ((kif = (struct pfi_kif *)ifp->if_pf_kif) == NULL)
> return;
>
> - s = splsoftnet();
> pfi_update++;
> hook_disestablish(ifp->if_addrhooks, kif->pfik_ah_cookie);
> pfi_kif_update(kif);
> @@ -261,60 +255,47 @@ pfi_detach_ifnet(struct ifnet *ifp)
> kif->pfik_ifp = NULL;
> ifp->if_pf_kif = NULL;
> pfi_kif_unref(kif, PFI_KIF_REF_NONE);
> -
> - splx(s);
> }
>
> void
> pfi_attach_ifgroup(struct ifg_group *ifg)
> {
> struct pfi_kif *kif;
> - int s;
>
> pfi_initialize();
> - s = splsoftnet();
> pfi_update++;
> if ((kif = pfi_kif_get(ifg->ifg_group)) == NULL)
> panic("pfi_kif_get failed");
>
> kif->pfik_group = ifg;
> ifg->ifg_pf_kif = (caddr_t)kif;
> -
> - splx(s);
> }
>
> void
> pfi_detach_ifgroup(struct ifg_group *ifg)
> {
> - int s;
> struct pfi_kif *kif;
>
> if ((kif = (struct pfi_kif *)ifg->ifg_pf_kif) == NULL)
> return;
>
> - s = splsoftnet();
> pfi_update++;
>
> kif->pfik_group = NULL;
> ifg->ifg_pf_kif = NULL;
> pfi_kif_unref(kif, PFI_KIF_REF_NONE);
> - splx(s);
> }
>
> void
> pfi_group_change(const char *group)
> {
> struct pfi_kif *kif;
> - int s;
>
> - s = splsoftnet();
> pfi_update++;
> if ((kif = pfi_kif_get(group)) == NULL)
> panic("pfi_kif_get failed");
>
> pfi_kif_update(kif);
> -
> - splx(s);
> }
>
> int
> @@ -611,13 +592,12 @@ pfi_dynaddr_copyout(struct pf_addr_wrap
> void
> pfi_kifaddr_update(void *v)
> {
> - int s;
> struct pfi_kif *kif = (struct pfi_kif *)v;
>
> - s = splsoftnet();
> + splsoftassert(IPL_SOFTNET);
> +
> pfi_update++;
> pfi_kif_update(kif);
> - splx(s);
> }
>
> int