Re: mp-safe carp_iamatch6()

2017-11-22 Thread Hrvoje Popovski
On 22.11.2017. 15:48, Martin Pieuchot wrote:
> Hrvoje Popovski reported the following panic when testing my diff to
> unlock protocol inputs function:
> 
>  panic() at panic+0x128
>  __assert(814d1114,800022755d80,809ce000,800022755e20)
>  carp_ourether(ff0003c0c290,809ce000) at carp_ourether
>  nd6_ns_input(20,0,809c9800) at nd6_ns_input+0x4cf
>  icmp6_input(18,81a95af0,1,3a) at icmp6_input+0x3d4
>  
> ip_deliver(800022756020,80002275602c,80019080,817ee880)
>  ip6intr() at ip6intr+0x7b
> 
> The problem comes from carp_iamatch6() which is not yet MP-safe.  Since
> it is now identical to carp_iamatch(), let's use this one instead.


Hi,

with this diff i can't trigger panic as before.

Thank you ...



Re: mp-safe carp_iamatch6()

2017-11-22 Thread Alexander Bluhm
On Wed, Nov 22, 2017 at 03:48:43PM +0100, Martin Pieuchot wrote:
> Hrvoje Popovski reported the following panic when testing my diff to
> unlock protocol inputs function:
> 
>  panic() at panic+0x128
>  __assert(814d1114,800022755d80,809ce000,800022755e20)
>  carp_ourether(ff0003c0c290,809ce000) at carp_ourether
>  nd6_ns_input(20,0,809c9800) at nd6_ns_input+0x4cf
>  icmp6_input(18,81a95af0,1,3a) at icmp6_input+0x3d4
>  
> ip_deliver(800022756020,80002275602c,80019080,817ee880)
>  ip6intr() at ip6intr+0x7b
> 
> The problem comes from carp_iamatch6() which is not yet MP-safe.  Since
> it is now identical to carp_iamatch(), let's use this one instead.
> 
> ok?

OK bluhm@

> Index: netinet/ip_carp.h
> ===
> RCS file: /cvs/src/sys/netinet/ip_carp.h,v
> retrieving revision 1.43
> diff -u -p -r1.43 ip_carp.h
> --- netinet/ip_carp.h 30 May 2017 12:09:27 -  1.43
> +++ netinet/ip_carp.h 22 Nov 2017 14:42:37 -
> @@ -199,7 +199,6 @@ void   carp_carpdev_state(void *);
>  void  carp_group_demote_adj(struct ifnet *, int, char *);
>  int   carp6_proto_input(struct mbuf **, int *, int, int);
>  int   carp_iamatch(struct ifnet *);
> -int   carp_iamatch6(struct ifnet *);
>  struct ifnet *carp_ourether(void *, u_int8_t *);
>  int   carp_output(struct ifnet *, struct mbuf *, struct sockaddr *,
>struct rtentry *);
> Index: netinet/ip_carp.c
> ===
> RCS file: /cvs/src/sys/netinet/ip_carp.c,v
> retrieving revision 1.319
> diff -u -p -r1.319 ip_carp.c
> --- netinet/ip_carp.c 21 Nov 2017 09:08:55 -  1.319
> +++ netinet/ip_carp.c 22 Nov 2017 14:42:37 -
> @@ -1352,22 +1352,6 @@ carp_iamatch(struct ifnet *ifp)
>   return (match);
>  }
>  
> -#ifdef INET6
> -int
> -carp_iamatch6(struct ifnet *ifp)
> -{
> - struct carp_softc *sc = ifp->if_softc;
> - struct carp_vhost_entry *vhe = SRPL_FIRST_LOCKED(&sc->carp_vhosts);
> -
> - KERNEL_ASSERT_LOCKED(); /* touching carp_vhosts */
> -
> - if (vhe->state == MASTER)
> - return (1);
> -
> - return (0);
> -}
> -#endif /* INET6 */
> -
>  struct ifnet *
>  carp_ourether(void *v, u_int8_t *ena)
>  {
> Index: netinet6/in6.c
> ===
> RCS file: /cvs/src/sys/netinet6/in6.c,v
> retrieving revision 1.218
> diff -u -p -r1.218 in6.c
> --- netinet6/in6.c4 Nov 2017 13:11:54 -   1.218
> +++ netinet6/in6.c22 Nov 2017 14:43:08 -
> @@ -1287,7 +1287,7 @@ in6_ifawithscope(struct ifnet *oifp, str
>* Never use a carp address of an interface which is not
>* the master.
>*/
> - if (ifp->if_type == IFT_CARP && !carp_iamatch6(ifp))
> + if (ifp->if_type == IFT_CARP && !carp_iamatch(ifp))
>   continue;
>  #endif
>  
> Index: netinet6/nd6_nbr.c
> ===
> RCS file: /cvs/src/sys/netinet6/nd6_nbr.c,v
> retrieving revision 1.121
> diff -u -p -r1.121 nd6_nbr.c
> --- netinet6/nd6_nbr.c11 Aug 2017 21:24:20 -  1.121
> +++ netinet6/nd6_nbr.c22 Nov 2017 14:42:36 -
> @@ -218,7 +218,7 @@ nd6_ns_input(struct mbuf *m, int off, in
>   /* (1) and (3) check. */
>   ifa = &in6ifa_ifpwithaddr(ifp, &taddr6)->ia_ifa;
>  #if NCARP > 0
> - if (ifp->if_type == IFT_CARP && ifa && !carp_iamatch6(ifp))
> + if (ifp->if_type == IFT_CARP && ifa && !carp_iamatch(ifp))
>   ifa = NULL;
>  #endif
>  
> @@ -668,7 +668,7 @@ nd6_na_input(struct mbuf *m, int off, in
>* Ignore NAs silently for carp addresses if we're not
>* the CARP master.
>*/
> - if (ifp->if_type == IFT_CARP && !carp_iamatch6(ifp))
> + if (ifp->if_type == IFT_CARP && !carp_iamatch(ifp))
>   goto freeit;
>  #endif
>   log(LOG_ERR,
> @@ -1014,7 +1014,7 @@ nd6_na_output(struct ifnet *ifp, struct 
>  
>  #if NCARP > 0
>   /* Do not send NAs for carp addresses if we're not the CARP master. */
> - if (ifp->if_type == IFT_CARP && !carp_iamatch6(ifp))
> + if (ifp->if_type == IFT_CARP && !carp_iamatch(ifp))
>   goto bad;
>  #endif
>  



mp-safe carp_iamatch6()

2017-11-22 Thread Martin Pieuchot
Hrvoje Popovski reported the following panic when testing my diff to
unlock protocol inputs function:

 panic() at panic+0x128
 __assert(814d1114,800022755d80,809ce000,800022755e20)
 carp_ourether(ff0003c0c290,809ce000) at carp_ourether
 nd6_ns_input(20,0,809c9800) at nd6_ns_input+0x4cf
 icmp6_input(18,81a95af0,1,3a) at icmp6_input+0x3d4
 ip_deliver(800022756020,80002275602c,80019080,817ee880)
 ip6intr() at ip6intr+0x7b

The problem comes from carp_iamatch6() which is not yet MP-safe.  Since
it is now identical to carp_iamatch(), let's use this one instead.

ok?

Index: netinet/ip_carp.h
===
RCS file: /cvs/src/sys/netinet/ip_carp.h,v
retrieving revision 1.43
diff -u -p -r1.43 ip_carp.h
--- netinet/ip_carp.h   30 May 2017 12:09:27 -  1.43
+++ netinet/ip_carp.h   22 Nov 2017 14:42:37 -
@@ -199,7 +199,6 @@ void carp_carpdev_state(void *);
 voidcarp_group_demote_adj(struct ifnet *, int, char *);
 int carp6_proto_input(struct mbuf **, int *, int, int);
 int carp_iamatch(struct ifnet *);
-int carp_iamatch6(struct ifnet *);
 struct ifnet   *carp_ourether(void *, u_int8_t *);
 int carp_output(struct ifnet *, struct mbuf *, struct sockaddr *,
 struct rtentry *);
Index: netinet/ip_carp.c
===
RCS file: /cvs/src/sys/netinet/ip_carp.c,v
retrieving revision 1.319
diff -u -p -r1.319 ip_carp.c
--- netinet/ip_carp.c   21 Nov 2017 09:08:55 -  1.319
+++ netinet/ip_carp.c   22 Nov 2017 14:42:37 -
@@ -1352,22 +1352,6 @@ carp_iamatch(struct ifnet *ifp)
return (match);
 }
 
-#ifdef INET6
-int
-carp_iamatch6(struct ifnet *ifp)
-{
-   struct carp_softc *sc = ifp->if_softc;
-   struct carp_vhost_entry *vhe = SRPL_FIRST_LOCKED(&sc->carp_vhosts);
-
-   KERNEL_ASSERT_LOCKED(); /* touching carp_vhosts */
-
-   if (vhe->state == MASTER)
-   return (1);
-
-   return (0);
-}
-#endif /* INET6 */
-
 struct ifnet *
 carp_ourether(void *v, u_int8_t *ena)
 {
Index: netinet6/in6.c
===
RCS file: /cvs/src/sys/netinet6/in6.c,v
retrieving revision 1.218
diff -u -p -r1.218 in6.c
--- netinet6/in6.c  4 Nov 2017 13:11:54 -   1.218
+++ netinet6/in6.c  22 Nov 2017 14:43:08 -
@@ -1287,7 +1287,7 @@ in6_ifawithscope(struct ifnet *oifp, str
 * Never use a carp address of an interface which is not
 * the master.
 */
-   if (ifp->if_type == IFT_CARP && !carp_iamatch6(ifp))
+   if (ifp->if_type == IFT_CARP && !carp_iamatch(ifp))
continue;
 #endif
 
Index: netinet6/nd6_nbr.c
===
RCS file: /cvs/src/sys/netinet6/nd6_nbr.c,v
retrieving revision 1.121
diff -u -p -r1.121 nd6_nbr.c
--- netinet6/nd6_nbr.c  11 Aug 2017 21:24:20 -  1.121
+++ netinet6/nd6_nbr.c  22 Nov 2017 14:42:36 -
@@ -218,7 +218,7 @@ nd6_ns_input(struct mbuf *m, int off, in
/* (1) and (3) check. */
ifa = &in6ifa_ifpwithaddr(ifp, &taddr6)->ia_ifa;
 #if NCARP > 0
-   if (ifp->if_type == IFT_CARP && ifa && !carp_iamatch6(ifp))
+   if (ifp->if_type == IFT_CARP && ifa && !carp_iamatch(ifp))
ifa = NULL;
 #endif
 
@@ -668,7 +668,7 @@ nd6_na_input(struct mbuf *m, int off, in
 * Ignore NAs silently for carp addresses if we're not
 * the CARP master.
 */
-   if (ifp->if_type == IFT_CARP && !carp_iamatch6(ifp))
+   if (ifp->if_type == IFT_CARP && !carp_iamatch(ifp))
goto freeit;
 #endif
log(LOG_ERR,
@@ -1014,7 +1014,7 @@ nd6_na_output(struct ifnet *ifp, struct 
 
 #if NCARP > 0
/* Do not send NAs for carp addresses if we're not the CARP master. */
-   if (ifp->if_type == IFT_CARP && !carp_iamatch6(ifp))
+   if (ifp->if_type == IFT_CARP && !carp_iamatch(ifp))
goto bad;
 #endif