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.