On Tue, Apr 19, 2022 at 04:57:27PM +0200, Alexander Bluhm wrote:
> On Tue, Apr 19, 2022 at 08:46:06AM +0200, Claudio Jeker wrote:
> > On Tue, Apr 19, 2022 at 12:07:49AM +0200, Alexander Bluhm wrote:
> > > Hi,
> > > 
> > > Instead of using a MP unsafe global variable, just call rt_timer_init()
> > > from route_init().
> > > 
> > > ok?
> > 
> > Wouldn't it be better to move this into rtable_init?
> > route_init() is called by domaininit() as the last init function
> > (routedomain is the last domain in domains[].
> 
> I see the problem.  ip_init() and icmp6_init() create the queue
> before route_init() has been initialized.
> 
> Calling rt_timer_init() from rtable_init() fixes it.
> 
> ok?

Sure. OK claudio
 
> bluhm
> 
> Index: net/route.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/net/route.c,v
> retrieving revision 1.402
> diff -u -p -r1.402 route.c
> --- net/route.c       22 Feb 2022 01:15:02 -0000      1.402
> +++ net/route.c       19 Apr 2022 14:48:26 -0000
> @@ -151,7 +151,6 @@ int                       ifatrash;       /* ifas not in 
> ifp list 
>  struct pool          rtentry_pool;   /* pool for rtentry structures */
>  struct pool          rttimer_pool;   /* pool for rttimer structures */
>  
> -void rt_timer_init(void);
>  int  rt_setgwroute(struct rtentry *, u_int);
>  void rt_putgwroute(struct rtentry *);
>  int  rtflushclone1(struct rtentry *, void *, u_int);
> @@ -1362,7 +1361,6 @@ rt_ifa_purge_walker(struct rtentry *rt, 
>   */
>  
>  LIST_HEAD(, rttimer_queue)   rttimer_queue_head;
> -static int                   rt_init_done = 0;
>  
>  #define RTTIMER_CALLOUT(r)   {                                       \
>       if (r->rtt_func != NULL) {                                      \
> @@ -1389,25 +1387,18 @@ rt_timer_init(void)
>  {
>       static struct timeout   rt_timer_timeout;
>  
> -     if (rt_init_done)
> -             panic("rt_timer_init: already initialized");
> -
>       pool_init(&rttimer_pool, sizeof(struct rttimer), 0, IPL_SOFTNET, 0,
>           "rttmr", NULL);
>  
>       LIST_INIT(&rttimer_queue_head);
>       timeout_set_proc(&rt_timer_timeout, rt_timer_timer, &rt_timer_timeout);
>       timeout_add_sec(&rt_timer_timeout, 1);
> -     rt_init_done = 1;
>  }
>  
>  struct rttimer_queue *
>  rt_timer_queue_create(u_int timeout)
>  {
>       struct rttimer_queue    *rtq;
> -
> -     if (rt_init_done == 0)
> -             rt_timer_init();
>  
>       if ((rtq = malloc(sizeof(*rtq), M_RTABLE, M_NOWAIT|M_ZERO)) == NULL)
>               return (NULL);
> Index: net/route.h
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/net/route.h,v
> retrieving revision 1.187
> diff -u -p -r1.187 route.h
> --- net/route.h       12 Nov 2021 15:49:41 -0000      1.187
> +++ net/route.h       19 Apr 2022 14:47:26 -0000
> @@ -451,6 +451,7 @@ void       rtm_proposal(struct ifnet *, struc
>  int   rt_setgate(struct rtentry *, struct sockaddr *, u_int);
>  struct rtentry *rt_getll(struct rtentry *);
>  
> +void                  rt_timer_init(void);
>  int                   rt_timer_add(struct rtentry *,
>                            void(*)(struct rtentry *, struct rttimer *),
>                            struct rttimer_queue *, u_int);
> Index: net/rtable.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/net/rtable.c,v
> retrieving revision 1.76
> diff -u -p -r1.76 rtable.c
> --- net/rtable.c      2 Jan 2022 22:36:04 -0000       1.76
> +++ net/rtable.c      19 Apr 2022 14:48:46 -0000
> @@ -184,6 +184,8 @@ rtable_init(void)
>  
>       if (rtable_add(0) != 0)
>               panic("unable to create default routing table");
> +
> +     rt_timer_init();
>  }
>  
>  int
> 

-- 
:wq Claudio

Reply via email to