[PATCH 3/4] BGP: Move postponed socket reloop logic from start to start_locked to achieve locking requirements

Matteo Perin matteo.perin at canonical.com
Fri Dec 5 14:52:31 CET 2025


The dynamic BGP postponed socket handling was moved from bgp_init() to bgp_start_locked()
to ensure both domains are properly locked during the rmove() operation.

In bgp_init(), the protocol birdloop does not exist yet, but in bgp_start_locked() it is
possible to safely enter both the socket original birdloop and the protocol birdloop to satisfy
dual-lock requirement and avoid DG_IS_LOCKED failed assertions.

Signed-off-by: Matteo Perin <matteo.perin at canonical.com>
---
 proto/bgp/bgp.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index d3d61eaf..ad6dd334 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -2648,6 +2648,22 @@ bgp_start_locked(void *_p)
 
   DBG("BGP: Got lock\n");
 
+  /* Move postponed socket to protocol's birdloop if present */
+  if (p->postponed_sk)
+  {
+    sock *sk = p->postponed_sk;
+    struct birdloop *sk_loop = sk->loop;
+    
+    if (sk_loop && (sk_loop != p->p.loop))
+      birdloop_enter(sk_loop);
+
+    rmove(sk, p->p.pool);
+    sk_reloop(sk, p->p.loop);
+
+    if (sk_loop && (sk_loop != p->p.loop))
+      birdloop_leave(sk_loop);
+  }
+
   if (cf->multihop || bgp_is_dynamic(p))
   {
     /* Multi-hop sessions do not use neighbor entries */
@@ -2770,15 +2786,6 @@ bgp_start(struct proto *P)
       channel_graceful_restart_lock(&c->c);
   }
 
-  /* Now it's the last chance to move the postponed socket to this BGP,
-   * as bgp_start is the only hook running from main loop. */
-  if (p->postponed_sk)
-    BGP_LISTEN_LOCKED(bl)
-    {
-      rmove(p->postponed_sk, p->p.pool);
-      sk_reloop(p->postponed_sk, p->p.loop);
-    }
-
   /*
    * Before attempting to create the connection, we need to lock the port,
    * so that we are the only instance attempting to talk with that neighbor.
-- 
2.43.0



More information about the Bird-users mailing list