From 1c9df18c207d42ad004a111797a0b748fbc423a6 Mon Sep 17 00:00:00 2001 From: Michael Blizek Date: Sat, 25 Sep 2021 10:00:21 +0200 Subject: [PATCH] move some stuff from common.c to neighbor.c --- net/cor/common.c | 260 +--------------------------------------------------- net/cor/cor.h | 19 ++-- net/cor/neighbor.c | 262 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 276 insertions(+), 265 deletions(-) diff --git a/net/cor/common.c b/net/cor/common.c index da70ded83761..6c92fbaccdee 100644 --- a/net/cor/common.c +++ b/net/cor/common.c @@ -24,272 +24,14 @@ DEFINE_SPINLOCK(cor_bindnodes); static DEFINE_SPINLOCK(cor_conn_free); -static DEFINE_SPINLOCK(cor_connid_gen); static LIST_HEAD(cor_openports); static struct kmem_cache *cor_conn_slab; -static struct kmem_cache *cor_connid_reuse_slab; +struct kmem_cache *cor_connid_reuse_slab; atomic_t cor_num_conns; - -struct cor_conn *cor_get_conn(struct cor_neighbor *nb, __u32 conn_id) -{ - struct rb_node * n = 0; - struct cor_conn *ret = 0; - - spin_lock_bh(&(nb->connid_lock)); - - n = nb->connid_rb.rb_node; - - while (likely(n != 0) && ret == 0) { - struct cor_conn *src_in_o = container_of(n, struct cor_conn, - source.in.rbn); - - BUG_ON(src_in_o->sourcetype != SOURCE_IN); - - if (conn_id < src_in_o->source.in.conn_id) - n = n->rb_left; - else if (conn_id > src_in_o->source.in.conn_id) - n = n->rb_right; - else - ret = src_in_o; - } - - if (ret != 0) - kref_get(&(ret->ref)); - - spin_unlock_bh(&(nb->connid_lock)); - - return ret; -} - -static int cor_insert_connid(struct cor_neighbor *nb, struct cor_conn *src_in_ll) -{ - int rc = 0; - - __u32 conn_id = src_in_ll->source.in.conn_id; - - struct rb_root *root; - struct rb_node **p; - struct rb_node *parent = 0; - - BUG_ON(src_in_ll->sourcetype != SOURCE_IN); - - spin_lock_bh(&(nb->connid_lock)); - - root = &(nb->connid_rb); - p = &(root->rb_node); - - while ((*p) != 0) { - struct cor_conn *src_in_o = container_of(*p, struct cor_conn, - source.in.rbn); - - BUG_ON(src_in_o->sourcetype != SOURCE_IN); - - parent = *p; - if (unlikely(conn_id == src_in_o->source.in.conn_id)) { - goto duplicate; - } else if (conn_id < src_in_o->source.in.conn_id) { - p = &(*p)->rb_left; - } else if (conn_id > src_in_o->source.in.conn_id) { - p = &(*p)->rb_right; - } else { - BUG(); - } - } - - kref_get(&(src_in_ll->ref)); - rb_link_node(&(src_in_ll->source.in.rbn), parent, p); - rb_insert_color(&(src_in_ll->source.in.rbn), root); - - if (0) { -duplicate: - rc = 1; - } - - spin_unlock_bh(&(nb->connid_lock)); - - return rc; -} - -struct cor_connid_reuse_item *cor_get_connid_reuseitem(struct cor_neighbor *nb, - __u32 conn_id) -{ - struct rb_node *n = 0; - struct cor_connid_reuse_item *ret = 0; - - spin_lock_bh(&(nb->connid_reuse_lock)); - - n = nb->connid_reuse_rb.rb_node; - - while (likely(n != 0) && ret == 0) { - struct cor_connid_reuse_item *cir = container_of(n, - struct cor_connid_reuse_item, rbn); - - BUG_ON(cir->conn_id == 0); - - if (conn_id < cir->conn_id) - n = n->rb_left; - else if (conn_id > cir->conn_id) - n = n->rb_right; - else - ret = cir; - } - - if (ret != 0) - kref_get(&(ret->ref)); - - spin_unlock_bh(&(nb->connid_reuse_lock)); - - return ret; -} - -/* nb->connid_reuse_lock must be held by the caller */ -static void cor_insert_connid_reuse(struct cor_neighbor *nb, - struct cor_connid_reuse_item *ins) -{ - struct rb_root *root; - struct rb_node **p; - struct rb_node *parent = 0; - - BUG_ON(ins->conn_id == 0); - - root = &(nb->connid_reuse_rb); - p = &(root->rb_node); - - while ((*p) != 0) { - struct cor_connid_reuse_item *curr = container_of(*p, - struct cor_connid_reuse_item, rbn); - - BUG_ON(curr->conn_id == 0); - - parent = *p; - if (unlikely(ins->conn_id == curr->conn_id)) { - BUG(); - } else if (ins->conn_id < curr->conn_id) { - p = &(*p)->rb_left; - } else if (ins->conn_id > curr->conn_id) { - p = &(*p)->rb_right; - } else { - BUG(); - } - } - - kref_get(&(ins->ref)); - rb_link_node(&(ins->rbn), parent, p); - rb_insert_color(&(ins->rbn), root); -} - -static void cor_free_connid_reuse(struct kref *ref) -{ - struct cor_connid_reuse_item *cir = container_of(ref, - struct cor_connid_reuse_item, ref); - - kmem_cache_free(cor_connid_reuse_slab, cir); -} - -void cor_delete_connid_reuse_items(struct cor_neighbor *nb) -{ - struct cor_connid_reuse_item *cri; - - spin_lock_bh(&(nb->connid_reuse_lock)); - - while (list_empty(&(nb->connid_reuse_list)) == 0) { - cri = container_of(nb->connid_reuse_list.next, - struct cor_connid_reuse_item, lh); - - rb_erase(&(cri->rbn), &(nb->connid_reuse_rb)); - kref_put(&(cri->ref), cor_kreffree_bug); - - list_del(&(cri->lh)); - kref_put(&(cri->ref), cor_free_connid_reuse); - } - - spin_unlock_bh(&(nb->connid_reuse_lock)); -} - -void cor_connid_used_pingsuccess(struct cor_neighbor *nb) -{ - struct cor_connid_reuse_item *cri; - - spin_lock_bh(&(nb->connid_reuse_lock)); - - nb->connid_reuse_pingcnt++; - while (list_empty(&(nb->connid_reuse_list)) == 0) { - cri = container_of(nb->connid_reuse_list.next, - struct cor_connid_reuse_item, lh); - if ((cri->pingcnt + CONNID_REUSE_RTTS - - nb->connid_reuse_pingcnt) < 32768) - break; - - rb_erase(&(cri->rbn), &(nb->connid_reuse_rb)); - kref_put(&(cri->ref), cor_kreffree_bug); - - list_del(&(cri->lh)); - kref_put(&(cri->ref), cor_free_connid_reuse); - } - - spin_unlock_bh(&(nb->connid_reuse_lock)); -} - -static int cor_connid_used(struct cor_neighbor *nb, __u32 conn_id) -{ - struct cor_conn *cn; - struct cor_connid_reuse_item *cir; - - cn = cor_get_conn(nb, conn_id); - if (unlikely(cn != 0)) { - kref_put(&(cn->ref), cor_free_conn); - return 1; - } - - cir = cor_get_connid_reuseitem(nb, conn_id); - if (unlikely(cir != 0)) { - kref_put(&(cir->ref), cor_free_connid_reuse); - return 1; - } - - return 0; -} - -static int cor_connid_alloc(struct cor_neighbor *nb, struct cor_conn *src_in_ll) -{ - __u32 conn_id; - int i; - - BUG_ON(src_in_ll->sourcetype != SOURCE_IN); - BUG_ON(src_in_ll->reversedir->targettype != TARGET_OUT); - - spin_lock_bh(&cor_connid_gen); - for (i=0;i<16;i++) { - conn_id = 0; - get_random_bytes((char *) &conn_id, sizeof(conn_id)); - conn_id = (conn_id & ~(1 << 31)); - - if (unlikely(conn_id == 0)) - continue; - - if (unlikely(cor_connid_used(nb, conn_id))) - continue; - - goto found; - } - spin_unlock_bh(&cor_connid_gen); - - return 1; - -found: - src_in_ll->source.in.conn_id = conn_id; - src_in_ll->reversedir->target.out.conn_id = (conn_id | (1 << 31)); - if (unlikely(cor_insert_connid(nb, src_in_ll) != 0)) { - BUG(); - } - spin_unlock_bh(&cor_connid_gen); - return 0; -} - void _cor_set_last_act(struct cor_conn *src_in_l) { unsigned long iflags; diff --git a/net/cor/cor.h b/net/cor/cor.h index 2d0879c89f4b..3a2de0347543 100644 --- a/net/cor/cor.h +++ b/net/cor/cor.h @@ -1243,16 +1243,12 @@ extern void __exit cor_dev_exit1(void); extern int __init cor_dev_init(void); /* common.c */ +extern struct kmem_cache *cor_connid_reuse_slab; + extern atomic_t cor_num_conns; extern spinlock_t cor_bindnodes; -extern struct cor_conn *cor_get_conn(struct cor_neighbor *nb, __u32 conn_id); - -extern void cor_delete_connid_reuse_items(struct cor_neighbor *nb); - -extern void cor_connid_used_pingsuccess(struct cor_neighbor *nb); - extern void _cor_set_last_act(struct cor_conn *src_in_l); extern void cor_free_conn(struct kref *ref); @@ -1353,6 +1349,17 @@ extern unsigned long cor_get_next_ping_time(struct cor_neighbor *nb); extern void cor_add_neighbor(struct cor_neighbor_discdata *nb_dd); +extern struct cor_conn *cor_get_conn(struct cor_neighbor *nb, __u32 conn_id); + +extern int cor_insert_connid(struct cor_neighbor *nb, + struct cor_conn *src_in_ll); + +extern void cor_insert_connid_reuse(struct cor_neighbor *nb, + struct cor_connid_reuse_item *ins); + +extern int cor_connid_alloc(struct cor_neighbor *nb, + struct cor_conn *src_in_ll); + extern int __init cor_neighbor_init(void); extern void __exit cor_neighbor_exit2(void); diff --git a/net/cor/neighbor.c b/net/cor/neighbor.c index 9afb8c02fc47..d5c8bd0a3b6c 100644 --- a/net/cor/neighbor.c +++ b/net/cor/neighbor.c @@ -27,6 +27,8 @@ static LIST_HEAD(cor_nb_list); static struct kmem_cache *cor_nb_slab; atomic_t cor_num_neighs; +static DEFINE_SPINLOCK(cor_connid_gen); + void cor_neighbor_free(struct kref *ref) { @@ -412,6 +414,8 @@ unlock: } } +static void cor_delete_connid_reuse_items(struct cor_neighbor *nb); + static void _cor_reset_neighbor(struct work_struct *work) { struct cor_neighbor *nb = container_of(work, struct cor_neighbor, @@ -691,6 +695,8 @@ static void cor_update_nb_latency(struct cor_neighbor *nb_statelocked, nb_statelocked->last_roundtrip_end = now; } +static void cor_connid_used_pingsuccess(struct cor_neighbor *nb); + void cor_ping_resp(struct cor_neighbor *nb, __u32 cookie, __u32 respdelay) { unsigned long iflags; @@ -1058,6 +1064,262 @@ already_present: spin_unlock_bh(&cor_neighbor_list_lock); } +struct cor_conn *cor_get_conn(struct cor_neighbor *nb, __u32 conn_id) +{ + struct rb_node * n = 0; + struct cor_conn *ret = 0; + + spin_lock_bh(&(nb->connid_lock)); + + n = nb->connid_rb.rb_node; + + while (likely(n != 0) && ret == 0) { + struct cor_conn *src_in_o = container_of(n, struct cor_conn, + source.in.rbn); + + BUG_ON(src_in_o->sourcetype != SOURCE_IN); + + if (conn_id < src_in_o->source.in.conn_id) + n = n->rb_left; + else if (conn_id > src_in_o->source.in.conn_id) + n = n->rb_right; + else + ret = src_in_o; + } + + if (ret != 0) + kref_get(&(ret->ref)); + + spin_unlock_bh(&(nb->connid_lock)); + + return ret; +} + +int cor_insert_connid(struct cor_neighbor *nb, struct cor_conn *src_in_ll) +{ + int rc = 0; + + __u32 conn_id = src_in_ll->source.in.conn_id; + + struct rb_root *root; + struct rb_node **p; + struct rb_node *parent = 0; + + BUG_ON(src_in_ll->sourcetype != SOURCE_IN); + + spin_lock_bh(&(nb->connid_lock)); + + root = &(nb->connid_rb); + p = &(root->rb_node); + + while ((*p) != 0) { + struct cor_conn *src_in_o = container_of(*p, struct cor_conn, + source.in.rbn); + + BUG_ON(src_in_o->sourcetype != SOURCE_IN); + + parent = *p; + if (unlikely(conn_id == src_in_o->source.in.conn_id)) { + goto duplicate; + } else if (conn_id < src_in_o->source.in.conn_id) { + p = &(*p)->rb_left; + } else if (conn_id > src_in_o->source.in.conn_id) { + p = &(*p)->rb_right; + } else { + BUG(); + } + } + + kref_get(&(src_in_ll->ref)); + rb_link_node(&(src_in_ll->source.in.rbn), parent, p); + rb_insert_color(&(src_in_ll->source.in.rbn), root); + + if (0) { +duplicate: + rc = 1; + } + + spin_unlock_bh(&(nb->connid_lock)); + + return rc; +} + +static struct cor_connid_reuse_item *cor_get_connid_reuseitem( + struct cor_neighbor *nb, __u32 conn_id) +{ + struct rb_node *n = 0; + struct cor_connid_reuse_item *ret = 0; + + spin_lock_bh(&(nb->connid_reuse_lock)); + + n = nb->connid_reuse_rb.rb_node; + + while (likely(n != 0) && ret == 0) { + struct cor_connid_reuse_item *cir = container_of(n, + struct cor_connid_reuse_item, rbn); + + BUG_ON(cir->conn_id == 0); + + if (conn_id < cir->conn_id) + n = n->rb_left; + else if (conn_id > cir->conn_id) + n = n->rb_right; + else + ret = cir; + } + + if (ret != 0) + kref_get(&(ret->ref)); + + spin_unlock_bh(&(nb->connid_reuse_lock)); + + return ret; +} + +/* nb->connid_reuse_lock must be held by the caller */ +void cor_insert_connid_reuse(struct cor_neighbor *nb, + struct cor_connid_reuse_item *ins) +{ + struct rb_root *root; + struct rb_node **p; + struct rb_node *parent = 0; + + BUG_ON(ins->conn_id == 0); + + root = &(nb->connid_reuse_rb); + p = &(root->rb_node); + + while ((*p) != 0) { + struct cor_connid_reuse_item *curr = container_of(*p, + struct cor_connid_reuse_item, rbn); + + BUG_ON(curr->conn_id == 0); + + parent = *p; + if (unlikely(ins->conn_id == curr->conn_id)) { + BUG(); + } else if (ins->conn_id < curr->conn_id) { + p = &(*p)->rb_left; + } else if (ins->conn_id > curr->conn_id) { + p = &(*p)->rb_right; + } else { + BUG(); + } + } + + kref_get(&(ins->ref)); + rb_link_node(&(ins->rbn), parent, p); + rb_insert_color(&(ins->rbn), root); +} + +static void cor_free_connid_reuse(struct kref *ref) +{ + struct cor_connid_reuse_item *cir = container_of(ref, + struct cor_connid_reuse_item, ref); + + kmem_cache_free(cor_connid_reuse_slab, cir); +} + +static void cor_delete_connid_reuse_items(struct cor_neighbor *nb) +{ + struct cor_connid_reuse_item *cri; + + spin_lock_bh(&(nb->connid_reuse_lock)); + + while (list_empty(&(nb->connid_reuse_list)) == 0) { + cri = container_of(nb->connid_reuse_list.next, + struct cor_connid_reuse_item, lh); + + rb_erase(&(cri->rbn), &(nb->connid_reuse_rb)); + kref_put(&(cri->ref), cor_kreffree_bug); + + list_del(&(cri->lh)); + kref_put(&(cri->ref), cor_free_connid_reuse); + } + + spin_unlock_bh(&(nb->connid_reuse_lock)); +} + +static void cor_connid_used_pingsuccess(struct cor_neighbor *nb) +{ + struct cor_connid_reuse_item *cri; + + spin_lock_bh(&(nb->connid_reuse_lock)); + + nb->connid_reuse_pingcnt++; + while (list_empty(&(nb->connid_reuse_list)) == 0) { + cri = container_of(nb->connid_reuse_list.next, + struct cor_connid_reuse_item, lh); + if ((cri->pingcnt + CONNID_REUSE_RTTS - + nb->connid_reuse_pingcnt) < 32768) + break; + + rb_erase(&(cri->rbn), &(nb->connid_reuse_rb)); + kref_put(&(cri->ref), cor_kreffree_bug); + + list_del(&(cri->lh)); + kref_put(&(cri->ref), cor_free_connid_reuse); + } + + spin_unlock_bh(&(nb->connid_reuse_lock)); +} + +static int cor_connid_used(struct cor_neighbor *nb, __u32 conn_id) +{ + struct cor_conn *cn; + struct cor_connid_reuse_item *cir; + + cn = cor_get_conn(nb, conn_id); + if (unlikely(cn != 0)) { + kref_put(&(cn->ref), cor_free_conn); + return 1; + } + + cir = cor_get_connid_reuseitem(nb, conn_id); + if (unlikely(cir != 0)) { + kref_put(&(cir->ref), cor_free_connid_reuse); + return 1; + } + + return 0; +} + +int cor_connid_alloc(struct cor_neighbor *nb, struct cor_conn *src_in_ll) +{ + __u32 conn_id; + int i; + + BUG_ON(src_in_ll->sourcetype != SOURCE_IN); + BUG_ON(src_in_ll->reversedir->targettype != TARGET_OUT); + + spin_lock_bh(&cor_connid_gen); + for (i=0;i<16;i++) { + conn_id = 0; + get_random_bytes((char *) &conn_id, sizeof(conn_id)); + conn_id = (conn_id & ~(1 << 31)); + + if (unlikely(conn_id == 0)) + continue; + + if (unlikely(cor_connid_used(nb, conn_id))) + continue; + + goto found; + } + spin_unlock_bh(&cor_connid_gen); + + return 1; + +found: + src_in_ll->source.in.conn_id = conn_id; + src_in_ll->reversedir->target.out.conn_id = (conn_id | (1 << 31)); + if (unlikely(cor_insert_connid(nb, src_in_ll) != 0)) { + BUG(); + } + spin_unlock_bh(&cor_connid_gen); + return 0; +} + int __init cor_neighbor_init(void) { cor_nb_slab = kmem_cache_create("cor_neighbor", -- 2.11.4.GIT