From: Claudio Jeker Subject: bgpd: add usec counter for the adjout processing in the main event loop To: tech@openbsd.org Date: Sun, 28 Dec 2025 21:41:12 +0100 We already track some times of the main event loop. This add another one for the adj-rib-out handling via peer_process_updates(). -- :wq Claudio Index: bgpctl/output.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/output.c,v diff -u -p -r1.66 output.c --- bgpctl/output.c 27 Dec 2025 14:51:38 -0000 1.66 +++ bgpctl/output.c 28 Dec 2025 20:38:44 -0000 @@ -1127,6 +1127,7 @@ show_rib_mem(struct rde_memstats *stats) stats->rde_event_loop_usec, stats->rde_event_loop_count); printf("%10lld usec spent on io\n", stats->rde_event_io_usec); printf("%10lld usec spent on peers\n", stats->rde_event_peer_usec); + printf("%10lld usec spent on adj-out\n", stats->rde_event_adjout_usec); printf("%10lld usec spent on rib dumps\n", stats->rde_event_ribdump_usec); printf("%10lld usec spent on nexthops\n", Index: bgpctl/output_json.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/output_json.c,v diff -u -p -r1.57 output_json.c --- bgpctl/output_json.c 27 Dec 2025 14:51:38 -0000 1.57 +++ bgpctl/output_json.c 28 Dec 2025 20:38:44 -0000 @@ -953,6 +953,7 @@ json_rib_mem(struct rde_memstats *stats) json_do_uint("loop_usec", stats->rde_event_loop_usec); json_do_uint("io_usec", stats->rde_event_io_usec); json_do_uint("peer_usec", stats->rde_event_peer_usec); + json_do_uint("adjout_usec", stats->rde_event_adjout_usec); json_do_uint("ribdump_usec", stats->rde_event_ribdump_usec); json_do_uint("nexthop_usec", stats->rde_event_nexthop_usec); json_do_uint("update_usec", stats->rde_event_update_usec); Index: bgpctl/output_ometric.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/output_ometric.c,v diff -u -p -r1.21 output_ometric.c --- bgpctl/output_ometric.c 27 Dec 2025 14:51:38 -0000 1.21 +++ bgpctl/output_ometric.c 28 Dec 2025 20:38:44 -0000 @@ -351,6 +351,9 @@ ometric_rib_mem(struct rde_memstats *sta (double)stats->rde_event_peer_usec / (1000.0 * 1000.0) , OKV("stage"), OKV("peer"), NULL); ometric_set_float_with_labels(rde_evloop_time, + (double)stats->rde_event_adjout_usec / (1000.0 * 1000.0) , + OKV("stage"), OKV("adjout"), NULL); + ometric_set_float_with_labels(rde_evloop_time, (double)stats->rde_event_ribdump_usec / (1000.0 * 1000.0) , OKV("stage"), OKV("ribdumps"), NULL); ometric_set_float_with_labels(rde_evloop_time, Index: bgpd/bgpd.h =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v diff -u -p -r1.528 bgpd.h --- bgpd/bgpd.h 24 Dec 2025 07:59:55 -0000 1.528 +++ bgpd/bgpd.h 28 Dec 2025 20:38:44 -0000 @@ -1424,6 +1424,7 @@ struct rde_memstats { long long rde_event_loop_usec; long long rde_event_io_usec; long long rde_event_peer_usec; + long long rde_event_adjout_usec; long long rde_event_ribdump_usec; long long rde_event_nexthop_usec; long long rde_event_update_usec; Index: bgpd/rde.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v diff -u -p -r1.679 rde.c --- bgpd/rde.c 28 Dec 2025 17:52:44 -0000 1.679 +++ bgpd/rde.c 28 Dec 2025 20:38:44 -0000 @@ -164,7 +164,8 @@ rde_main(int debug, int verbose) struct passwd *pw; struct pollfd *pfd = NULL; struct rde_mrt_ctx *mctx, *xmctx; - monotime_t loop_start, io_end, peer_end, dump_end, nh_end; + monotime_t loop_start, io_end, peer_end, adjout_end, + dump_end, nh_end; void *newp; u_int pfd_elms = 0, i, j; int timeout; @@ -326,17 +327,22 @@ rde_main(int debug, int verbose) monotime_to_usec(monotime_sub(io_end, loop_start)); peer_foreach(rde_dispatch_imsg_peer, NULL); - peer_foreach(peer_process_updates, NULL); peer_end = getmonotime(); rdemem.rde_event_peer_usec += monotime_to_usec(monotime_sub(peer_end, io_end)); + peer_foreach(peer_process_updates, NULL); + + adjout_end = getmonotime(); + rdemem.rde_event_adjout_usec += + monotime_to_usec(monotime_sub(adjout_end, peer_end)); + rib_dump_runner(); dump_end = getmonotime(); rdemem.rde_event_ribdump_usec += - monotime_to_usec(monotime_sub(dump_end, peer_end)); + monotime_to_usec(monotime_sub(dump_end, adjout_end)); nexthop_runner();