]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: avoid heap fragmentation in bgp_clear_route_table
authorJorge Boncompte [DTI2] <jorge@dti2.net>
Mon, 7 May 2012 15:17:33 +0000 (15:17 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Mon, 14 Jan 2013 13:43:51 +0000 (14:43 +0100)
In bgp_clear_route_table, moved cleanup code before the allocation
of the work queue items. This returns the memory to the system
allocator before allocating new and might therefore help avoiding
heap fragmentation.

* bgp_route.c: (bgp_clear_route_table) moved code blocks.

Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Reviewed-by: Leonid Rosenboim <Leonid.Rosenboim@windriver.com>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
bgpd/bgp_route.c

index 9251d2c22fb85be6c11ac2e7c77e71c8c45b39ed..6155bc16523b98d6e6d130f5b223597ecdd8c1b9 100644 (file)
@@ -2842,6 +2842,21 @@ bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
        * this may actually be achievable. It doesn't seem to be a huge
        * problem at this time,
        */
+      for (ain = rn->adj_in; ain; ain = ain->next)
+        if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
+          {
+            bgp_adj_in_remove (rn, ain);
+            bgp_unlock_node (rn);
+            break;
+          }
+      for (aout = rn->adj_out; aout; aout = aout->next)
+        if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
+          {
+            bgp_adj_out_remove (rn, aout, peer, afi, safi);
+            bgp_unlock_node (rn);
+            break;
+          }
+
       for (ri = rn->info; ri; ri = ri->next)
         if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
           {
@@ -2857,21 +2872,6 @@ bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
             work_queue_add (peer->clear_node_queue, cnq);
             break;
           }
-
-      for (ain = rn->adj_in; ain; ain = ain->next)
-        if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
-          {
-            bgp_adj_in_remove (rn, ain);
-            bgp_unlock_node (rn);
-            break;
-          }
-      for (aout = rn->adj_out; aout; aout = aout->next)
-        if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
-          {
-            bgp_adj_out_remove (rn, aout, peer, afi, safi);
-            bgp_unlock_node (rn);
-            break;
-          }
     }
   return;
 }