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

Reply via email to