diff options
Diffstat (limited to 'net/bird3/files/patch-12-BGP-tx-bucket-storage')
-rw-r--r-- | net/bird3/files/patch-12-BGP-tx-bucket-storage | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/net/bird3/files/patch-12-BGP-tx-bucket-storage b/net/bird3/files/patch-12-BGP-tx-bucket-storage new file mode 100644 index 000000000000..513824f86769 --- /dev/null +++ b/net/bird3/files/patch-12-BGP-tx-bucket-storage @@ -0,0 +1,84 @@ +From fdb5c4920b45139fb3c37e1144643c0f756364b6 Mon Sep 17 00:00:00 2001 +From: Maria Matejka <mq@ucw.cz> +Date: Tue, 24 Dec 2024 13:22:56 +0100 +Subject: [PATCH] BGP: TX bucket storage moved to Stonehenge + +--- + proto/bgp/attrs.c | 11 +++++++---- + proto/bgp/bgp.h | 4 ++-- + 2 files changed, 9 insertions(+), 6 deletions(-) + +diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c +index a2feaef53..725c469ff 100644 +--- proto/bgp/attrs.c ++++ proto/bgp/attrs.c +@@ -1734,13 +1734,16 @@ bgp_get_bucket(struct bgp_ptx_private *c, ea_list *new) + uint size = sizeof(struct bgp_bucket) + ea_size; + + /* Allocate the bucket */ +- b = mb_alloc(c->pool, size); ++ sth_block blk = sth_alloc(c->sth, size); ++ b = blk.block; + *b = (struct bgp_bucket) { }; + init_list(&b->prefixes); + b->hash = hash; + + /* Copy the ea_list */ + ea_list_copy(b->eattrs, new, ea_size); ++ if (blk.large) ++ b->eattrs->flags |= EALF_HUGE; + + /* Insert the bucket to bucket hash */ + HASH_INSERT2(c->bucket_hash, RBH, c->pool, b); +@@ -1764,7 +1767,7 @@ static void + bgp_free_bucket(struct bgp_ptx_private *c, struct bgp_bucket *b) + { + HASH_REMOVE2(c->bucket_hash, RBH, c->pool, b); +- mb_free(b); ++ sth_free((sth_block) { b, !!(b->eattrs->flags & EALF_HUGE) }); + } + + int +@@ -2086,6 +2089,7 @@ bgp_init_pending_tx(struct bgp_channel *c) + + bpp->lock = dom; + bpp->pool = p; ++ bpp->sth = sth_new(p); + bpp->c = c; + + bgp_init_bucket_table(bpp); +@@ -2160,8 +2164,7 @@ bgp_free_pending_tx(struct bgp_channel *bc) + HASH_WALK_END; + + HASH_FREE(c->bucket_hash); +- sl_delete(c->bucket_slab); +- c->bucket_slab = NULL; ++ sth_delete(c->sth); + + rp_free(c->pool); + +diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h +index 202e78ba3..dac6e84ea 100644 +--- proto/bgp/bgp.h ++++ proto/bgp/bgp.h +@@ -452,7 +452,8 @@ struct bgp_ptx_private { + struct { BGP_PTX_PUBLIC; }; + struct bgp_ptx_private **locked_at; + +- pool *pool; /* Resource pool for TX related allocations */ ++ pool *pool; /* Pool for infrequent long-term blocks */ ++ stonehenge *sth; /* Bucket allocator */ + + HASH(struct bgp_bucket) bucket_hash; /* Hash table of route buckets */ + struct bgp_bucket *withdraw_bucket; /* Withdrawn routes */ +@@ -461,7 +462,6 @@ struct bgp_ptx_private { + HASH(struct bgp_prefix) prefix_hash; /* Hash table of pending prefices */ + + slab *prefix_slab; /* Slab holding prefix nodes */ +- slab *bucket_slab; /* Slab holding buckets to send */ + + char bmp; /* This is a fake ptx for BMP encoding */ + }; +-- +GitLab + |