On Tue, Apr 18, 2023 at 06:49:39PM +0300, Vitaliy Makkoveev wrote:
> rtable_setsource(... , NULL) actually doesn't destroy object pointed by
> `ar_source', so for this call netlock is not required. However this
> optimisation doesn't produce any visible effect, so no objections to 
> call rt_setsource() with netlock held.
> 
> ok?

OK bluhm@

> Index: sys/dev/usb/if_umb.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/if_umb.c,v
> retrieving revision 1.50
> diff -u -p -r1.50 if_umb.c
> --- sys/dev/usb/if_umb.c      31 Mar 2023 23:53:49 -0000      1.50
> +++ sys/dev/usb/if_umb.c      18 Apr 2023 15:45:04 -0000
> @@ -1829,6 +1829,7 @@ umb_add_inet_config(struct umb_softc *sc
>       default_sin.sin_len = sizeof (default_sin);
>  
>       memset(&info, 0, sizeof(info));
> +     NET_LOCK();
>       info.rti_flags = RTF_GATEWAY /* maybe | RTF_STATIC */;
>       info.rti_ifa = ifa_ifwithaddr(sintosa(&ifra.ifra_addr),
>           ifp->if_rdomain);
> @@ -1836,7 +1837,6 @@ umb_add_inet_config(struct umb_softc *sc
>       info.rti_info[RTAX_NETMASK] = sintosa(&default_sin);
>       info.rti_info[RTAX_GATEWAY] = sintosa(&ifra.ifra_dstaddr);
>  
> -     NET_LOCK();
>       rv = rtrequest(RTM_ADD, &info, 0, &rt, ifp->if_rdomain);
>       NET_UNLOCK();
>       if (rv) {
> @@ -1910,6 +1910,7 @@ umb_add_inet6_config(struct umb_softc *s
>       default_sin6.sin6_len = sizeof (default_sin6);
>  
>       memset(&info, 0, sizeof(info));
> +     NET_LOCK();
>       info.rti_flags = RTF_GATEWAY /* maybe | RTF_STATIC */;
>       info.rti_ifa = ifa_ifwithaddr(sin6tosa(&ifra.ifra_addr),
>           ifp->if_rdomain);
> @@ -1917,7 +1918,6 @@ umb_add_inet6_config(struct umb_softc *s
>       info.rti_info[RTAX_NETMASK] = sin6tosa(&default_sin6);
>       info.rti_info[RTAX_GATEWAY] = sin6tosa(&ifra.ifra_dstaddr);
>  
> -     NET_LOCK();
>       rv = rtrequest(RTM_ADD, &info, 0, &rt, ifp->if_rdomain);
>       NET_UNLOCK();
>       if (rv) {
> Index: sys/net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.688
> diff -u -p -r1.688 if.c
> --- sys/net/if.c      8 Apr 2023 13:49:38 -0000       1.688
> +++ sys/net/if.c      18 Apr 2023 15:45:04 -0000
> @@ -1409,8 +1409,9 @@ ifa_ifwithaddr(struct sockaddr *addr, u_
>       struct ifaddr *ifa;
>       u_int rdomain;
>  
> +     NET_ASSERT_LOCKED();
> +
>       rdomain = rtable_l2(rtableid);
> -     KERNEL_LOCK();
>       TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
>               if (ifp->if_rdomain != rdomain)
>                       continue;
> @@ -1420,12 +1421,10 @@ ifa_ifwithaddr(struct sockaddr *addr, u_
>                               continue;
>  
>                       if (equal(addr, ifa->ifa_addr)) {
> -                             KERNEL_UNLOCK();
>                               return (ifa);
>                       }
>               }
>       }
> -     KERNEL_UNLOCK();
>       return (NULL);
>  }
>  
> @@ -1438,8 +1437,9 @@ ifa_ifwithdstaddr(struct sockaddr *addr,
>       struct ifnet *ifp;
>       struct ifaddr *ifa;
>  
> +     NET_ASSERT_LOCKED();
> +
>       rdomain = rtable_l2(rdomain);
> -     KERNEL_LOCK();
>       TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
>               if (ifp->if_rdomain != rdomain)
>                       continue;
> @@ -1449,13 +1449,11 @@ ifa_ifwithdstaddr(struct sockaddr *addr,
>                                   addr->sa_family || ifa->ifa_dstaddr == NULL)
>                                       continue;
>                               if (equal(addr, ifa->ifa_dstaddr)) {
> -                                     KERNEL_UNLOCK();
>                                       return (ifa);
>                               }
>                       }
>               }
>       }
> -     KERNEL_UNLOCK();
>       return (NULL);
>  }
>  
> @@ -3167,12 +3165,14 @@ ifsettso(struct ifnet *ifp, int on)
>  void
>  ifa_add(struct ifnet *ifp, struct ifaddr *ifa)
>  {
> +     NET_ASSERT_LOCKED_EXCLUSIVE();
>       TAILQ_INSERT_TAIL(&ifp->if_addrlist, ifa, ifa_list);
>  }
>  
>  void
>  ifa_del(struct ifnet *ifp, struct ifaddr *ifa)
>  {
> +     NET_ASSERT_LOCKED_EXCLUSIVE();
>       TAILQ_REMOVE(&ifp->if_addrlist, ifa, ifa_list);
>  }
>  
> Index: sys/net/if_var.h
> ===================================================================
> RCS file: /cvs/src/sys/net/if_var.h,v
> retrieving revision 1.123
> diff -u -p -r1.123 if_var.h
> --- sys/net/if_var.h  5 Apr 2023 19:35:23 -0000       1.123
> +++ sys/net/if_var.h  18 Apr 2023 15:45:04 -0000
> @@ -240,7 +240,8 @@ struct ifaddr {
>  #define      ifa_broadaddr   ifa_dstaddr     /* broadcast address interface 
> */
>       struct  sockaddr *ifa_netmask;  /* used to determine subnet */
>       struct  ifnet *ifa_ifp;         /* back-pointer to interface */
> -     TAILQ_ENTRY(ifaddr) ifa_list;   /* list of addresses for interface */
> +     TAILQ_ENTRY(ifaddr) ifa_list;   /* [N] list of addresses for
> +                                         interface */
>       u_int   ifa_flags;              /* interface flags, see below */
>       struct  refcnt ifa_refcnt;      /* number of `rt_ifa` references */
>       int     ifa_metric;             /* cost of going out this interface */
> Index: sys/net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.362
> diff -u -p -r1.362 rtsock.c
> --- sys/net/rtsock.c  18 Apr 2023 09:56:54 -0000      1.362
> +++ sys/net/rtsock.c  18 Apr 2023 15:45:04 -0000
> @@ -853,8 +853,10 @@ route_output(struct mbuf *m, struct sock
>                       error = EINVAL;
>                       goto fail;
>               }
> -             if ((error =
> -                 rt_setsource(tableid, info.rti_info[RTAX_IFA])) != 0)
> +             NET_LOCK();
> +             error = rt_setsource(tableid, info.rti_info[RTAX_IFA]);
> +             NET_UNLOCK();
> +             if (error)
>                       goto fail;
>       } else {
>               error = rtm_output(rtm, &rt, &info, prio, tableid);
> @@ -2350,7 +2352,6 @@ int
>  rt_setsource(unsigned int rtableid, struct sockaddr *src)
>  {
>       struct ifaddr   *ifa;
> -     int             error;
>       /*
>        * If source address is 0.0.0.0 or ::
>        * use automatic source selection
> @@ -2374,20 +2375,14 @@ rt_setsource(unsigned int rtableid, stru
>               return (EAFNOSUPPORT);
>       }
>  
> -     KERNEL_LOCK();
>       /*
>        * Check if source address is assigned to an interface in the
>        * same rdomain
>        */
> -     if ((ifa = ifa_ifwithaddr(src, rtableid)) == NULL) {
> -             KERNEL_UNLOCK();
> +     if ((ifa = ifa_ifwithaddr(src, rtableid)) == NULL)
>               return (EINVAL);
> -     }
>  
> -     error = rtable_setsource(rtableid, src->sa_family, ifa->ifa_addr);
> -     KERNEL_UNLOCK();
> -
> -     return (error);
> +     return rtable_setsource(rtableid, src->sa_family, ifa->ifa_addr);
>  }
>  
>  /*

Reply via email to