Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: more cleanup for rib_dump_free()
To:
tech@openbsd.org
Date:
Tue, 18 Nov 2025 17:52:00 +0100

Download raw body.

Thread
Introduce two helpers rib_dump_cleanup() and prefix_adjout_dump_cleanup()
which can be called by rib_dump_free() to properly remove the re or prefix
reference held by the context.

This allows to remove two duplicated static inline functions from rde_rib.c
-- 
:wq Claudio

? obj
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
diff -u -p -r1.319 rde.h
--- rde.h	18 Nov 2025 16:39:36 -0000	1.319
+++ rde.h	18 Nov 2025 16:48:33 -0000
@@ -731,6 +731,7 @@ void		 prefix_adjout_withdraw(struct pre
 void		 prefix_adjout_destroy(struct prefix *);
 void		 prefix_adjout_flush_pending(struct rde_peer *);
 int		 prefix_adjout_reaper(struct rde_peer *);
+void		 prefix_adjout_dump_cleanup(struct prefix *);
 void		 prefix_adjout_dump_r(struct rib_context *);
 int		 prefix_adjout_dump_new(struct rde_peer *, uint8_t,
 		    unsigned int, void *, void (*)(struct prefix *, void *),
Index: rde_adjout.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_adjout.c,v
diff -u -p -r1.1 rde_adjout.c
--- rde_adjout.c	18 Nov 2025 16:39:36 -0000	1.1
+++ rde_adjout.c	18 Nov 2025 16:48:34 -0000
@@ -447,6 +447,13 @@ prefix_restart(struct rib_context *ctx)
 }
 
 void
+prefix_adjout_dump_cleanup(struct prefix *p)
+{
+	if (prefix_is_dead(prefix_unlock(p)))
+		prefix_adjout_destroy(p);
+}
+
+void
 prefix_adjout_dump_r(struct rib_context *ctx)
 {
 	struct prefix *p, *next;
Index: rde_rib.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_rib.c,v
diff -u -p -r1.276 rde_rib.c
--- rde_rib.c	18 Nov 2025 16:39:36 -0000	1.276
+++ rde_rib.c	18 Nov 2025 16:48:34 -0000
@@ -77,21 +77,6 @@ re_is_locked(struct rib_entry *re)
 	return (re->lock != 0);
 }
 
-static inline struct prefix *
-prefix_unlock(struct prefix *p)
-{
-	if ((p->flags & PREFIX_FLAG_LOCKED) == 0)
-		fatalx("%s: unlocking unlocked prefix", __func__);
-	p->flags &= ~PREFIX_FLAG_LOCKED;
-	return p;
-}
-
-static inline int
-prefix_is_dead(struct prefix *p)
-{
-	return (p->flags & PREFIX_FLAG_DEAD) != 0;
-}
-
 static inline struct rib_tree *
 rib_tree(struct rib *rib)
 {
@@ -466,14 +451,20 @@ rib_dump_runner(void)
 }
 
 static void
+rib_dump_cleanup(struct rib_entry *re)
+{
+	if (rib_empty(re_unlock(re)))
+		rib_remove(re);
+}
+static void
 rib_dump_free(struct rib_context *ctx)
 {
 	if (ctx->ctx_done)
 		ctx->ctx_done(ctx->ctx_arg, ctx->ctx_aid);
-	if (ctx->ctx_re && rib_empty(re_unlock(ctx->ctx_re)))
-		rib_remove(ctx->ctx_re);
-	if (ctx->ctx_p && prefix_is_dead(prefix_unlock(ctx->ctx_p)))
-		prefix_adjout_destroy(ctx->ctx_p);
+	if (ctx->ctx_re)
+		rib_dump_cleanup(ctx->ctx_re);
+	if (ctx->ctx_p)
+		prefix_adjout_dump_cleanup(ctx->ctx_p);
 	LIST_REMOVE(ctx, entry);
 	free(ctx);
 }