On Tue, May 03, 2022 at 11:30:13AM +0200, Claudio Jeker wrote:
> Next stage of rttimer cleanup. Move the callback from the rttimer to the
> rttimer_queue struct. The callback is always the same for a queue so there
> is no need to define it on every call.
> 
> On top of that replace rt_timer_queue_destroy() with
> rt_timer_queue_flush(). With this queues can no longer be removed but that
> is not a problem. My next step is to actually replace
> rt_timer_queue_create() with an initalizer.

OK bluhm@

> Index: net/route.c
> ===================================================================
> RCS file: /cvs/src/sys/net/route.c,v
> retrieving revision 1.408
> diff -u -p -r1.408 route.c
> --- net/route.c       30 Apr 2022 07:20:35 -0000      1.408
> +++ net/route.c       2 May 2022 10:16:58 -0000
> @@ -1365,8 +1365,8 @@ struct mutex                    rttimer_mtx;
>  LIST_HEAD(, rttimer_queue)   rttimer_queue_head;     /* [T] */
>  
>  #define RTTIMER_CALLOUT(r)   {                                       \
> -     if (r->rtt_func != NULL) {                                      \
> -             (*r->rtt_func)(r->rtt_rt, r->rtt_tableid);              \
> +     if (r->rtt_queue->rtq_func != NULL) {                           \
> +             (*r->rtt_queue->rtq_func)(r->rtt_rt, r->rtt_tableid);   \
>       } else {                                                        \
>               struct ifnet *ifp;                                      \
>                                                                       \
> @@ -1403,7 +1403,7 @@ rt_timer_init(void)
>  }
>  
>  struct rttimer_queue *
> -rt_timer_queue_create(int timeout)
> +rt_timer_queue_create(int timeout, void (*func)(struct rtentry *, u_int))
>  {
>       struct rttimer_queue    *rtq;
>  
> @@ -1411,6 +1411,7 @@ rt_timer_queue_create(int timeout)
>  
>       rtq->rtq_timeout = timeout;
>       rtq->rtq_count = 0;
> +     rtq->rtq_func = func;
>       TAILQ_INIT(&rtq->rtq_head);
>  
>       mtx_enter(&rttimer_mtx);
> @@ -1429,7 +1430,7 @@ rt_timer_queue_change(struct rttimer_que
>  }
>  
>  void
> -rt_timer_queue_destroy(struct rttimer_queue *rtq)
> +rt_timer_queue_flush(struct rttimer_queue *rtq)
>  {
>       struct rttimer          *r;
>       TAILQ_HEAD(, rttimer)    rttlist;
> @@ -1445,7 +1446,6 @@ rt_timer_queue_destroy(struct rttimer_qu
>               KASSERT(rtq->rtq_count > 0);
>               rtq->rtq_count--;
>       }
> -     LIST_REMOVE(rtq, rtq_link);
>       mtx_leave(&rttimer_mtx);
>  
>       while ((r = TAILQ_FIRST(&rttlist)) != NULL) {
> @@ -1453,7 +1453,6 @@ rt_timer_queue_destroy(struct rttimer_qu
>               RTTIMER_CALLOUT(r);
>               pool_put(&rttimer_pool, r);
>       }
> -     pool_put(&rttimer_queue_pool, rtq);
>  }
>  
>  unsigned long
> @@ -1486,8 +1485,7 @@ rt_timer_remove_all(struct rtentry *rt)
>  }
>  
>  int
> -rt_timer_add(struct rtentry *rt, void (*func)(struct rtentry *, u_int),
> -     struct rttimer_queue *queue, u_int rtableid)
> +rt_timer_add(struct rtentry *rt, struct rttimer_queue *queue, u_int rtableid)
>  {
>       struct rttimer  *r, *rnew;
>       time_t           current_time;
> @@ -1500,7 +1498,6 @@ rt_timer_add(struct rtentry *rt, void (*
>  
>       rnew->rtt_rt = rt;
>       rnew->rtt_time = current_time;
> -     rnew->rtt_func = func;
>       rnew->rtt_queue = queue;
>       rnew->rtt_tableid = rtableid;
>  
> @@ -1511,7 +1508,7 @@ rt_timer_add(struct rtentry *rt, void (*
>        * we add a new one.
>        */
>       LIST_FOREACH(r, &rt->rt_timer, rtt_link) {
> -             if (r->rtt_func == func) {
> +             if (r->rtt_queue == queue) {
>                       LIST_REMOVE(r, rtt_link);
>                       TAILQ_REMOVE(&r->rtt_queue->rtq_head, r, rtt_next);
>                       KASSERT(r->rtt_queue->rtq_count > 0);
> Index: net/route.h
> ===================================================================
> RCS file: /cvs/src/sys/net/route.h,v
> retrieving revision 1.192
> diff -u -p -r1.192 route.h
> --- net/route.h       30 Apr 2022 07:20:35 -0000      1.192
> +++ net/route.h       30 Apr 2022 08:09:54 -0000
> @@ -410,8 +410,6 @@ struct rttimer {
>       LIST_ENTRY(rttimer)     rtt_link;       /* [T] timers per rtentry */
>       struct rttimer_queue    *rtt_queue;     /* [T] back pointer to queue */
>       struct rtentry          *rtt_rt;        /* [I] back pointer to route */
> -     void                    (*rtt_func)     /* [I] callback */
> -                                 (struct rtentry *, u_int);
>       time_t                  rtt_time;       /* [I] when timer registered */
>       u_int                   rtt_tableid;    /* [I] rtable id of rtt_rt */
>  };
> @@ -419,6 +417,8 @@ struct rttimer {
>  struct rttimer_queue {
>       TAILQ_HEAD(, rttimer)           rtq_head;       /* [T] */
>       LIST_ENTRY(rttimer_queue)       rtq_link;       /* [T] */
> +     void                            (*rtq_func)     /* [I] callback */
> +                                         (struct rtentry *, u_int);
>       unsigned long                   rtq_count;      /* [T] */
>       int                             rtq_timeout;    /* [T] */
>  };
> @@ -459,12 +459,12 @@ struct rtentry *rt_getll(struct rtentry 
>  
>  void                  rt_timer_init(void);
>  int                   rt_timer_add(struct rtentry *,
> -                         void(*)(struct rtentry *, u_int),
>                           struct rttimer_queue *, u_int);
>  void                  rt_timer_remove_all(struct rtentry *);
> -struct rttimer_queue *rt_timer_queue_create(int);
> +struct rttimer_queue *rt_timer_queue_create(int,
> +                         void(*)(struct rtentry *, u_int));
>  void                  rt_timer_queue_change(struct rttimer_queue *, int);
> -void                  rt_timer_queue_destroy(struct rttimer_queue *);
> +void                  rt_timer_queue_flush(struct rttimer_queue *);
>  unsigned long                 rt_timer_queue_count(struct rttimer_queue *);
>  void                  rt_timer_timer(void *);
>  
> Index: netinet/ip_icmp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_icmp.c,v
> retrieving revision 1.189
> diff -u -p -r1.189 ip_icmp.c
> --- netinet/ip_icmp.c 30 Apr 2022 07:20:35 -0000      1.189
> +++ netinet/ip_icmp.c 30 Apr 2022 07:57:32 -0000
> @@ -120,6 +120,7 @@ int       icmp_redirtimeout = 10 * 60;
>  static int icmperrpps_count = 0;
>  static struct timeval icmperrppslim_last;
>  
> +struct rttimer_queue *ip_mtudisc_timeout_q;
>  struct rttimer_queue *icmp_redirect_timeout_q;
>  struct cpumem *icmpcounters;
>  
> @@ -140,7 +141,10 @@ int icmp_sysctl_icmpstat(void *, size_t 
>  void
>  icmp_init(void)
>  {
> -     icmp_redirect_timeout_q = rt_timer_queue_create(icmp_redirtimeout);
> +     ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout,
> +         &icmp_mtudisc_timeout);
> +     icmp_redirect_timeout_q = rt_timer_queue_create(icmp_redirtimeout,
> +         NULL);
>       icmpcounters = counters_alloc(icps_ncounters);
>  }
>  
> @@ -633,7 +637,7 @@ reflect:
>               rtredirect(sintosa(&sdst), sintosa(&sgw),
>                   sintosa(&ssrc), &newrt, m->m_pkthdr.ph_rtableid);
>               if (newrt != NULL && icmp_redirtimeout > 0) {
> -                     rt_timer_add(newrt, NULL, icmp_redirect_timeout_q,
> +                     rt_timer_add(newrt, icmp_redirect_timeout_q,
>                           m->m_pkthdr.ph_rtableid);
>               }
>               rtfree(newrt);
> @@ -974,8 +978,7 @@ icmp_mtudisc_clone(struct in_addr dst, u
>               rt = nrt;
>               rtm_send(rt, RTM_ADD, 0, rtableid);
>       }
> -     error = rt_timer_add(rt, icmp_mtudisc_timeout, ip_mtudisc_timeout_q,
> -         rtableid);
> +     error = rt_timer_add(rt, ip_mtudisc_timeout_q, rtableid);
>       if (error)
>               goto bad;
>  
> Index: netinet/ip_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_input.c,v
> retrieving revision 1.369
> diff -u -p -r1.369 ip_input.c
> --- netinet/ip_input.c        28 Apr 2022 17:27:14 -0000      1.369
> +++ netinet/ip_input.c        30 Apr 2022 08:09:28 -0000
> @@ -94,8 +94,6 @@ int ip_mtudisc = 1;
>  int  ip_mtudisc_timeout = IPMTUDISCTIMEOUT;
>  int  ip_directedbcast = 0;
>  
> -struct rttimer_queue *ip_mtudisc_timeout_q;
> -
>  /* Protects `ipq' and `ip_frags'. */
>  struct mutex ipq_mutex = MUTEX_INITIALIZER(IPL_SOFTNET);
>  
> @@ -200,7 +198,6 @@ ip_init(void)
>                   pr->pr_protocol < IPPROTO_MAX)
>                       ip_protox[pr->pr_protocol] = pr - inetsw;
>       LIST_INIT(&ipq);
> -     ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);
>  
>       /* Fill in list of ports not to allocate dynamically. */
>       memset(&baddynamicports, 0, sizeof(baddynamicports));
> @@ -224,7 +221,8 @@ ip_init(void)
>       ipsec_init();
>  #endif
>  #ifdef MROUTING
> -     ip_mrouterq = rt_timer_queue_create(MCAST_EXPIRE_FREQUENCY);
> +     ip_mrouterq = rt_timer_queue_create(MCAST_EXPIRE_FREQUENCY,
> +         &mfc_expire_route);
>  #endif
>  }
>  
> @@ -1656,11 +1654,8 @@ ip_sysctl(int *name, u_int namelen, void
>       case IPCTL_MTUDISC:
>               NET_LOCK();
>               error = sysctl_int(oldp, oldlenp, newp, newlen, &ip_mtudisc);
> -             if (ip_mtudisc == 0) {
> -                     rt_timer_queue_destroy(ip_mtudisc_timeout_q);
> -                     ip_mtudisc_timeout_q =
> -                         rt_timer_queue_create(ip_mtudisc_timeout);
> -             }
> +             if (ip_mtudisc == 0)
> +                     rt_timer_queue_flush(ip_mtudisc_timeout_q);
>               NET_UNLOCK();
>               return error;
>       case IPCTL_MTUDISCTIMEOUT:
> Index: netinet/ip_mroute.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_mroute.c,v
> retrieving revision 1.133
> diff -u -p -r1.133 ip_mroute.c
> --- netinet/ip_mroute.c       30 Apr 2022 07:20:35 -0000      1.133
> +++ netinet/ip_mroute.c       30 Apr 2022 08:06:25 -0000
> @@ -113,7 +113,6 @@ int get_version(struct mbuf *);
>  int add_vif(struct socket *, struct mbuf *);
>  int del_vif(struct socket *, struct mbuf *);
>  void update_mfc_params(struct mfcctl2 *, int, unsigned int);
> -void mfc_expire_route(struct rtentry *, u_int);
>  int mfc_add(struct mfcctl2 *, struct in_addr *, struct in_addr *,
>      int, unsigned int, int);
>  int add_mfc(struct socket *, struct mbuf *);
> @@ -793,7 +792,7 @@ mfc_expire_route(struct rtentry *rt, u_i
>       /* Not expired, add it back to the queue. */
>       if (mfc->mfc_expire == 0) {
>               mfc->mfc_expire = 1;
> -             rt_timer_add(rt, mfc_expire_route, ip_mrouterq, rtableid);
> +             rt_timer_add(rt, ip_mrouterq, rtableid);
>               return;
>       }
>  
> @@ -827,7 +826,7 @@ mfc_add_route(struct ifnet *ifp, struct 
>  
>       rt->rt_llinfo = (caddr_t)mfc;
>  
> -     rt_timer_add(rt, mfc_expire_route, ip_mrouterq, rtableid);
> +     rt_timer_add(rt, ip_mrouterq, rtableid);
>  
>       mfc->mfc_parent = mfccp->mfcc_parent;
>       mfc->mfc_pkt_cnt = 0;
> Index: netinet/ip_mroute.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_mroute.h,v
> retrieving revision 1.29
> diff -u -p -r1.29 ip_mroute.h
> --- netinet/ip_mroute.h       28 Apr 2022 17:27:14 -0000      1.29
> +++ netinet/ip_mroute.h       30 Apr 2022 08:07:03 -0000
> @@ -176,6 +176,8 @@ struct mrtstat {
>  #define MCAST_EXPIRE_FREQUENCY               30
>  
>  extern struct rttimer_queue *ip_mrouterq;
> +void mfc_expire_route(struct rtentry *, u_int);
> +
>  extern int ip_mrtproto;
>  
>  /*
> Index: netinet6/icmp6.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/icmp6.c,v
> retrieving revision 1.240
> diff -u -p -r1.240 icmp6.c
> --- netinet6/icmp6.c  30 Apr 2022 07:20:35 -0000      1.240
> +++ netinet6/icmp6.c  30 Apr 2022 08:04:20 -0000
> @@ -143,8 +143,10 @@ void
>  icmp6_init(void)
>  {
>       mld6_init();
> -     icmp6_mtudisc_timeout_q = rt_timer_queue_create(ip6_mtudisc_timeout);
> -     icmp6_redirect_timeout_q = rt_timer_queue_create(icmp6_redirtimeout);
> +     icmp6_mtudisc_timeout_q = rt_timer_queue_create(ip6_mtudisc_timeout,
> +         &icmp6_mtudisc_timeout);
> +     icmp6_redirect_timeout_q = rt_timer_queue_create(icmp6_redirtimeout,
> +         NULL);
>       icmp6counters = counters_alloc(icp6s_ncounters);
>  }
>  
> @@ -1404,7 +1406,7 @@ icmp6_redirect_input(struct mbuf *m, int
>               rtredirect(sin6tosa(&sdst), sin6tosa(&sgw), sin6tosa(&ssrc),
>                   &newrt, m->m_pkthdr.ph_rtableid);
>               if (newrt != NULL && icmp6_redirtimeout > 0) {
> -                     rt_timer_add(newrt, NULL, icmp6_redirect_timeout_q,
> +                     rt_timer_add(newrt, icmp6_redirect_timeout_q,
>                           m->m_pkthdr.ph_rtableid);
>               }
>               rtfree(newrt);
> @@ -1828,8 +1830,7 @@ icmp6_mtudisc_clone(struct sockaddr_in6 
>               rt = nrt;
>               rtm_send(rt, RTM_ADD, 0, rtableid);
>       }
> -     error = rt_timer_add(rt, icmp6_mtudisc_timeout, icmp6_mtudisc_timeout_q,
> -         rtableid);
> +     error = rt_timer_add(rt, icmp6_mtudisc_timeout_q, rtableid);
>       if (error)
>               goto bad;
>  
> Index: netinet6/ip6_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_input.c,v
> retrieving revision 1.243
> diff -u -p -r1.243 ip6_input.c
> --- netinet6/ip6_input.c      28 Apr 2022 17:27:14 -0000      1.243
> +++ netinet6/ip6_input.c      30 Apr 2022 08:03:02 -0000
> @@ -162,7 +162,8 @@ ip6_init(void)
>  
>       ip6counters = counters_alloc(ip6s_ncounters);
>  #ifdef MROUTING
> -     ip6_mrouterq = rt_timer_queue_create(MCAST_EXPIRE_TIMEOUT);
> +     ip6_mrouterq = rt_timer_queue_create(MCAST_EXPIRE_TIMEOUT,
> +         &mf6c_expire_route);
>  #endif
>  }
>  
> Index: netinet6/ip6_mroute.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_mroute.c,v
> retrieving revision 1.129
> diff -u -p -r1.129 ip6_mroute.c
> --- netinet6/ip6_mroute.c     30 Apr 2022 07:20:35 -0000      1.129
> +++ netinet6/ip6_mroute.c     30 Apr 2022 08:04:50 -0000
> @@ -176,7 +176,6 @@ struct rtentry *mf6c_find(struct ifnet *
>  struct rtentry *mrt6_mcast_add(struct ifnet *, struct sockaddr *,
>      struct sockaddr *);
>  void mrt6_mcast_del(struct rtentry *, unsigned int);
> -void mf6c_expire_route(struct rtentry *, u_int);
>  
>  /*
>   * Handle MRT setsockopt commands to modify the multicast routing tables.
> @@ -677,7 +676,7 @@ mf6c_add_route(struct ifnet *ifp, struct
>       }
>  
>       rt->rt_llinfo = (caddr_t)mf6c;
> -     rt_timer_add(rt, mf6c_expire_route, ip6_mrouterq, rtableid);
> +     rt_timer_add(rt, ip6_mrouterq, rtableid);
>       mf6c->mf6c_parent = mf6cc->mf6cc_parent;
>       rtfree(rt);
>  
> @@ -1004,7 +1003,7 @@ mf6c_expire_route(struct rtentry *rt, u_
>  
>       if (mf6c->mf6c_expire == 0) {
>               mf6c->mf6c_expire = 1;
> -             rt_timer_add(rt, mf6c_expire_route, ip6_mrouterq, rtableid);
> +             rt_timer_add(rt, ip6_mrouterq, rtableid);
>               return;
>       }
>  
> Index: netinet6/ip6_mroute.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_mroute.h,v
> retrieving revision 1.21
> diff -u -p -r1.21 ip6_mroute.h
> --- netinet6/ip6_mroute.h     28 Apr 2022 17:27:14 -0000      1.21
> +++ netinet6/ip6_mroute.h     30 Apr 2022 08:05:29 -0000
> @@ -195,6 +195,7 @@ struct sioc_mif_req6 {
>  #define      MCAST_EXPIRE_TIMEOUT    30
>  
>  extern struct rttimer_queue *ip6_mrouterq;
> +void mf6c_expire_route(struct rtentry *, u_int);
>  
>  /*
>   * The kernel's multicast-interface structure.

Reply via email to