mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-03 07:31:54 +00:00
Revert "BGP: Export uses common attribute cache"
This reverts commit d01a7c2bda
.
It seems that the performance penalty in global ea cache is actually
very high so returning back to local attribute caches in every BGP.
This commit is contained in:
parent
a9534186f1
commit
a4a7e09478
@ -1574,10 +1574,10 @@ bgp_finish_attrs(struct bgp_parse_state *s, ea_list **to)
|
|||||||
* Route bucket hash table
|
* Route bucket hash table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RBH_KEY(b) b->attrs
|
#define RBH_KEY(b) b->eattrs, b->hash
|
||||||
#define RBH_NEXT(b) b->next
|
#define RBH_NEXT(b) b->next
|
||||||
#define RBH_EQ(a1,a2) a1 == a2
|
#define RBH_EQ(a1,h1,a2,h2) h1 == h2 && ea_same(a1, a2)
|
||||||
#define RBH_FN(a) ea_get_storage(a)->hash_key
|
#define RBH_FN(a,h) h
|
||||||
|
|
||||||
#define RBH_REHASH bgp_rbh_rehash
|
#define RBH_REHASH bgp_rbh_rehash
|
||||||
#define RBH_PARAMS /8, *2, 2, 2, 12, 20
|
#define RBH_PARAMS /8, *2, 2, 2, 12, 20
|
||||||
@ -1589,7 +1589,6 @@ static void
|
|||||||
bgp_init_bucket_table(struct bgp_ptx_private *c)
|
bgp_init_bucket_table(struct bgp_ptx_private *c)
|
||||||
{
|
{
|
||||||
HASH_INIT(c->bucket_hash, c->pool, 8);
|
HASH_INIT(c->bucket_hash, c->pool, 8);
|
||||||
c->bucket_slab = sl_new(c->pool, sizeof(struct bgp_bucket));
|
|
||||||
|
|
||||||
init_list(&c->bucket_queue);
|
init_list(&c->bucket_queue);
|
||||||
c->withdraw_bucket = NULL;
|
c->withdraw_bucket = NULL;
|
||||||
@ -1599,21 +1598,24 @@ static struct bgp_bucket *
|
|||||||
bgp_get_bucket(struct bgp_ptx_private *c, ea_list *new)
|
bgp_get_bucket(struct bgp_ptx_private *c, ea_list *new)
|
||||||
{
|
{
|
||||||
/* Hash and lookup */
|
/* Hash and lookup */
|
||||||
ea_list *ns = ea_lookup(new, 0, EALS_CUSTOM);
|
u32 hash = ea_hash(new);
|
||||||
struct bgp_bucket *b = HASH_FIND(c->bucket_hash, RBH, ns);
|
struct bgp_bucket *b = HASH_FIND(c->bucket_hash, RBH, new, hash);
|
||||||
|
|
||||||
if (b)
|
if (b)
|
||||||
{
|
|
||||||
ea_free(ns);
|
|
||||||
return b;
|
return b;
|
||||||
}
|
|
||||||
|
/* Scan the list for total size */
|
||||||
|
uint ea_size = BIRD_CPU_ALIGN(ea_list_size(new));
|
||||||
|
uint size = sizeof(struct bgp_bucket) + ea_size;
|
||||||
|
|
||||||
/* Allocate the bucket */
|
/* Allocate the bucket */
|
||||||
b = sl_alloc(c->bucket_slab);
|
b = mb_alloc(c->pool, size);
|
||||||
*b = (struct bgp_bucket) {
|
*b = (struct bgp_bucket) { };
|
||||||
.attrs = ns,
|
|
||||||
};
|
|
||||||
init_list(&b->prefixes);
|
init_list(&b->prefixes);
|
||||||
|
b->hash = hash;
|
||||||
|
|
||||||
|
/* Copy the ea_list */
|
||||||
|
ea_list_copy(b->eattrs, new, ea_size);
|
||||||
|
|
||||||
/* Insert the bucket to bucket hash */
|
/* Insert the bucket to bucket hash */
|
||||||
HASH_INSERT2(c->bucket_hash, RBH, c->pool, b);
|
HASH_INSERT2(c->bucket_hash, RBH, c->pool, b);
|
||||||
@ -1637,8 +1639,7 @@ static void
|
|||||||
bgp_free_bucket(struct bgp_ptx_private *c, struct bgp_bucket *b)
|
bgp_free_bucket(struct bgp_ptx_private *c, struct bgp_bucket *b)
|
||||||
{
|
{
|
||||||
HASH_REMOVE2(c->bucket_hash, RBH, c->pool, b);
|
HASH_REMOVE2(c->bucket_hash, RBH, c->pool, b);
|
||||||
ea_free(b->attrs);
|
mb_free(b);
|
||||||
sl_free(b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -1917,7 +1918,7 @@ bgp_out_feed_net(struct rt_exporter *e, struct rcu_unwinder *u, u32 index, _Bool
|
|||||||
{
|
{
|
||||||
if (px->cur)
|
if (px->cur)
|
||||||
feed->block[pos++] = (rte) {
|
feed->block[pos++] = (rte) {
|
||||||
.attrs = px->cur->attrs ? ea_ref_tmp(px->cur->attrs) : NULL,
|
.attrs = (px->cur == c->withdraw_bucket) ? NULL : ea_free_later(ea_lookup_slow(px->cur->eattrs, 0, EALS_CUSTOM)),
|
||||||
.net = ni->addr,
|
.net = ni->addr,
|
||||||
.src = px->src,
|
.src = px->src,
|
||||||
.lastmod = px->lastmod,
|
.lastmod = px->lastmod,
|
||||||
@ -1926,7 +1927,7 @@ bgp_out_feed_net(struct rt_exporter *e, struct rcu_unwinder *u, u32 index, _Bool
|
|||||||
|
|
||||||
if (px->last)
|
if (px->last)
|
||||||
feed->block[pos++] = (rte) {
|
feed->block[pos++] = (rte) {
|
||||||
.attrs = px->last->attrs ? ea_ref_tmp(px->last->attrs) : NULL,
|
.attrs = (px->last == c->withdraw_bucket) ? NULL : ea_free_later(ea_lookup_slow(px->last->eattrs, 0, EALS_CUSTOM)),
|
||||||
.net = ni->addr,
|
.net = ni->addr,
|
||||||
.src = px->src,
|
.src = px->src,
|
||||||
.lastmod = px->lastmod,
|
.lastmod = px->lastmod,
|
||||||
|
@ -467,9 +467,10 @@ struct bgp_bucket {
|
|||||||
node send_node; /* Node in send queue */
|
node send_node; /* Node in send queue */
|
||||||
struct bgp_bucket *next; /* Node in bucket hash table */
|
struct bgp_bucket *next; /* Node in bucket hash table */
|
||||||
list prefixes; /* Prefixes to send in this bucket (struct bgp_prefix) */
|
list prefixes; /* Prefixes to send in this bucket (struct bgp_prefix) */
|
||||||
ea_list *attrs; /* Attributes to encode */
|
u32 hash; /* Hash over extended attributes */
|
||||||
u32 px_uc:31; /* How many prefixes are linking this bucket */
|
u32 px_uc:31; /* How many prefixes are linking this bucket */
|
||||||
u32 bmp:1; /* Temporary bucket for BMP encoding */
|
u32 bmp:1; /* Temporary bucket for BMP encoding */
|
||||||
|
ea_list eattrs[0]; /* Per-bucket extended attributes */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bgp_export_state {
|
struct bgp_export_state {
|
||||||
|
@ -2313,7 +2313,7 @@ bgp_create_ip_reach(struct bgp_write_state *s, struct bgp_bucket *buck, byte *bu
|
|||||||
|
|
||||||
int lr, la;
|
int lr, la;
|
||||||
|
|
||||||
la = bgp_encode_attrs(s, buck->attrs, buf+4, buf + MAX_ATTRS_LENGTH);
|
la = bgp_encode_attrs(s, buck->eattrs, buf+4, buf + MAX_ATTRS_LENGTH);
|
||||||
if (la < 0)
|
if (la < 0)
|
||||||
{
|
{
|
||||||
/* Attribute list too long */
|
/* Attribute list too long */
|
||||||
@ -2362,7 +2362,7 @@ bgp_create_mp_reach(struct bgp_write_state *s, struct bgp_bucket *buck, byte *bu
|
|||||||
|
|
||||||
/* Encode attributes to temporary buffer */
|
/* Encode attributes to temporary buffer */
|
||||||
byte *abuf = alloca(MAX_ATTRS_LENGTH);
|
byte *abuf = alloca(MAX_ATTRS_LENGTH);
|
||||||
la = bgp_encode_attrs(s, buck->attrs, abuf, abuf + MAX_ATTRS_LENGTH);
|
la = bgp_encode_attrs(s, buck->eattrs, abuf, abuf + MAX_ATTRS_LENGTH);
|
||||||
if (la < 0)
|
if (la < 0)
|
||||||
{
|
{
|
||||||
/* Attribute list too long */
|
/* Attribute list too long */
|
||||||
|
Loading…
Reference in New Issue
Block a user