From 9a6ba56edf1e6173ce6053a397e74d6fc8c2d84d Mon Sep 17 00:00:00 2001 From: Michael Blizek Date: Sat, 7 May 2022 10:32:21 +0200 Subject: [PATCH] convert rcv_conn_list to snd_conn_list --- net/cor/conn.c | 41 ++++++++++++++++-------------- net/cor/conn_src_in.c | 2 -- net/cor/conn_trgt_out.c | 4 ++- net/cor/cor.h | 21 ++++++++-------- net/cor/neigh.c | 21 ++++++++-------- net/cor/neigh_rcv.c | 12 +-------- net/cor/neigh_snd.c | 66 +++++++++++++++---------------------------------- 7 files changed, 68 insertions(+), 99 deletions(-) diff --git a/net/cor/conn.c b/net/cor/conn.c index 341d7c705c54..c417f18f562b 100644 --- a/net/cor/conn.c +++ b/net/cor/conn.c @@ -175,16 +175,17 @@ static void cor_connreset_priority(struct cor_conn *cn_lx) _cor_set_conn_in_priority(cn_lx, 0); } -void _cor_set_last_act(struct cor_conn *src_in_l) +void _cor_set_last_act(struct cor_conn *trgt_out_l) { unsigned long iflags; - src_in_l->source.in.jiffies_last_act = jiffies; - spin_lock_irqsave(&(src_in_l->source.in.nb->conn_list_lock), iflags); - list_del(&(src_in_l->source.in.nb_list)); - list_add_tail(&(src_in_l->source.in.nb_list), - &(src_in_l->source.in.nb->rcv_conn_list)); - spin_unlock_irqrestore(&(src_in_l->source.in.nb->conn_list_lock), - iflags); + struct cor_neighbor *nb = trgt_out_l->target.out.nb; + + trgt_out_l->target.out.jiffies_last_act = jiffies; + + spin_lock_irqsave(&(nb->conn_list_lock), iflags); + list_del(&(trgt_out_l->target.out.nb_list)); + list_add_tail(&(trgt_out_l->target.out.nb_list), &(nb->snd_conn_list)); + spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); } static void _cor_free_conn(struct cor_conn *cn) @@ -289,9 +290,9 @@ int cor_conn_init_out(struct cor_conn *trgt_unconn_ll, struct cor_neighbor *nb, } } - list_add_tail(&(src_unconn_ll->source.in.nb_list), - &(nb->rcv_conn_list)); - cor_conn_kref_get(src_unconn_ll, "neighbor_list"); + list_add_tail(&(trgt_unconn_ll->target.out.nb_list), + &(nb->snd_conn_list)); + cor_conn_kref_get(trgt_unconn_ll, "neighbor_list"); spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); @@ -339,7 +340,7 @@ out_err: src_unconn_ll->source.in.priority_seqno = 0; - src_unconn_ll->source.in.jiffies_last_act = jiffies; + trgt_unconn_ll->target.out.jiffies_last_act = jiffies; if (src_unconn_ll->is_highlatency) trgt_unconn_ll->target.out.jiffies_idle_since = @@ -664,15 +665,11 @@ int cor_connect_neigh(struct cor_conn *trgt_unconn_ll, char *addr, static void _cor_reset_conn(struct cor_conn *cn_ll, int trgt_out_resetneeded) { + unsigned long iflags; + if (cn_ll->sourcetype == SOURCE_IN) { - unsigned long iflags; struct cor_neighbor *nb = cn_ll->source.in.nb; - spin_lock_irqsave(&(nb->conn_list_lock), iflags); - list_del(&(cn_ll->source.in.nb_list)); - spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); - cor_conn_kref_put_bug(cn_ll, "neighbor_list"); - if (cn_ll->source.in.conn_id != 0 && (cn_ll->source.in.conn_id & (1 << 31)) != 0) { BUG_ON(cn_ll->source.in.cir != 0); @@ -730,6 +727,14 @@ static void _cor_reset_conn(struct cor_conn *cn_ll, int trgt_out_resetneeded) cn_ll->target.unconnected.cmdparams = 0; } } else if (cn_ll->targettype == TARGET_OUT) { + struct cor_neighbor *nb = cn_ll->target.out.nb; + + spin_lock_irqsave(&(nb->conn_list_lock), iflags); + list_del(&(cn_ll->target.out.nb_list)); + spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); + cor_conn_kref_put_bug(cn_ll, "neighbor_list"); + + if (trgt_out_resetneeded && cn_ll->target.out.conn_id != 0) { cor_send_reset_conn(cn_ll->target.out.nb, cn_ll->target.out.conn_id, 0); diff --git a/net/cor/conn_src_in.c b/net/cor/conn_src_in.c index 076b4d9b0e11..cd3c983f5055 100644 --- a/net/cor/conn_src_in.c +++ b/net/cor/conn_src_in.c @@ -622,8 +622,6 @@ static void _cor_conn_rcv(struct cor_neighbor *nb, struct cor_conn *src_in, if (cor_is_conn_in(src_in, nb, conn_id) == 0) goto drop; - cor_set_last_act(src_in); - if (unlikely(cor_seqno_before(seqno + len, src_in->source.in.next_seqno))) goto drop_ack; diff --git a/net/cor/conn_trgt_out.c b/net/cor/conn_trgt_out.c index 0c0223017de0..f8dff9b2e972 100644 --- a/net/cor/conn_trgt_out.c +++ b/net/cor/conn_trgt_out.c @@ -733,8 +733,10 @@ void cor_conn_ack_rcvd(struct cor_neighbor *nb, __u32 conn_id, spin_unlock_bh(&(nb->retrans_conn_lock)); cor_nb_kref_put(nb, "stack"); - if (seqno_advanced) + if (seqno_advanced) { cor_databuf_ack(trgt_out, trgt_out->target.out.seqno_acked); + cor_set_last_act(trgt_out); + } if (cor_seqno_eq(trgt_out->target.out.seqno_acked, trgt_out->target.out.seqno_nextsend)) diff --git a/net/cor/cor.h b/net/cor/cor.h index 3023969a28c6..b8cba32a69da 100644 --- a/net/cor/cor.h +++ b/net/cor/cor.h @@ -682,7 +682,7 @@ struct cor_neighbor{ * inactive connections */ spinlock_t conn_list_lock; - struct list_head rcv_conn_list; + struct list_head snd_conn_list; /* * the timer has to be inited when adding the neighbor @@ -856,8 +856,6 @@ struct cor_conn{ union{ struct{ struct cor_neighbor *nb; - /* list of all connections from this neighbor */ - struct list_head nb_list; struct list_head reorder_queue; __u32 reorder_memused; @@ -883,8 +881,6 @@ struct cor_conn{ /* protected by nb->cmsg_lock */ struct list_head acks_pending; - - unsigned long jiffies_last_act; }in; struct{ @@ -943,6 +939,11 @@ struct cor_conn{ struct{ struct cor_neighbor *nb; + + /* list of all connections to this neighbor */ + struct list_head nb_list; + unsigned long jiffies_last_act; + /* protected by nb->retrans_conn_lock, sorted by seqno */ struct list_head retrans_list; @@ -1587,7 +1588,7 @@ extern __u32 cor_conn_refresh_priority(struct cor_conn *cn, int locked); extern void cor_set_conn_in_priority(struct cor_neighbor *nb, __u32 conn_id, struct cor_conn *src_in, __u8 priority_seqno, __u16 priority); -extern void _cor_set_last_act(struct cor_conn *src_in_l); +extern void _cor_set_last_act(struct cor_conn *trgt_out_l); extern int cor_conn_init_out(struct cor_conn *trgt_unconn_ll, struct cor_neighbor *nb, __u32 rcvd_connid, @@ -2192,16 +2193,16 @@ static inline int cor_is_trgt_sock(struct cor_conn *cn_l, struct cor_sock *cs) return 1; } -static inline void cor_set_last_act(struct cor_conn *src_in_l) +static inline void cor_set_last_act(struct cor_conn *trgt_out_l) { unsigned long jiffies_tmp = jiffies; - BUG_ON(src_in_l->sourcetype != SOURCE_IN); + BUG_ON(trgt_out_l->targettype != TARGET_OUT); if (unlikely(time_after(jiffies_tmp, - src_in_l->source.in.jiffies_last_act + + trgt_out_l->target.out.jiffies_last_act + HZ * CONN_ACTIVITY_UPDATEINTERVAL_SEC))) - _cor_set_last_act(src_in_l); + _cor_set_last_act(trgt_out_l); } #define BUFLEN_MIN 128 diff --git a/net/cor/neigh.c b/net/cor/neigh.c index 2ed0df91ca27..7b5a2f5f8a44 100644 --- a/net/cor/neigh.c +++ b/net/cor/neigh.c @@ -74,8 +74,8 @@ void cor_neighbor_free(struct kref *ref) "cor_neighbor_free(): nb->connid_reuse_list is not empty"); WARN_ONCE(nb->kp_retransmits_rb.rb_node != 0, "cor_neighbor_free(): nb->kp_retransmits_rb is not empty"); - WARN_ONCE(list_empty(&(nb->rcv_conn_list)) == 0, - "cor_neighbor_free(): nb->rcv_conn_list is not empty"); + WARN_ONCE(list_empty(&(nb->snd_conn_list)) == 0, + "cor_neighbor_free(): nb->snd_conn_list is not empty"); WARN_ONCE(list_empty(&(nb->retrans_fast_list)) == 0, "cor_neighbor_free(): nb->retrans_fast_list is not empty"); WARN_ONCE(list_empty(&(nb->retrans_slow_list)) == 0, @@ -164,8 +164,7 @@ static struct cor_neighbor *cor_alloc_neighbor(gfp_t allocflags) nb->kpacket_seqno = seqno; atomic64_set(&(nb->priority_sum), 0); spin_lock_init(&(nb->conn_list_lock)); - INIT_LIST_HEAD(&(nb->rcv_conn_list)); - INIT_LIST_HEAD(&(nb->rcv_conn_list)); + INIT_LIST_HEAD(&(nb->snd_conn_list)); spin_lock_init(&(nb->retrans_lock)); INIT_LIST_HEAD(&(nb->retrans_fast_list)); INIT_LIST_HEAD(&(nb->retrans_slow_list)); @@ -382,26 +381,26 @@ static void cor_reset_all_conns(struct cor_neighbor *nb) { while (1) { unsigned long iflags; - struct cor_conn *src_in; struct cor_conn *trgt_out; + struct cor_conn *src_in; struct cor_conn_bidir *cnb; int rc; spin_lock_irqsave(&(nb->conn_list_lock), iflags); - if (list_empty(&(nb->rcv_conn_list))) { + if (list_empty(&(nb->snd_conn_list))) { spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); break; } - src_in = container_of(nb->rcv_conn_list.next, struct cor_conn, - source.in.nb_list); + trgt_out = container_of(nb->snd_conn_list.next, struct cor_conn, + target.out.nb_list); cor_conn_kref_get(src_in, "stack"); spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); - trgt_out = cor_get_conn_reversedir(src_in); - cnb = cor_get_conn_bidir(src_in); + src_in = cor_get_conn_reversedir(trgt_out); + cnb = cor_get_conn_bidir(trgt_out); spin_lock_bh(&(cnb->cli.rcv_lock)); spin_lock_bh(&(cnb->srv.rcv_lock)); @@ -926,7 +925,7 @@ static int cor_get_ping_forcetime_ms(struct cor_neighbor *nb) return PING_FORCETIME_ACTIVE_FAST_MS; spin_lock_irqsave(&(nb->conn_list_lock), iflags); - idle = list_empty(&(nb->rcv_conn_list)); + idle = list_empty(&(nb->snd_conn_list)); spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); if (idle) diff --git a/net/cor/neigh_rcv.c b/net/cor/neigh_rcv.c index eec70e15b0d1..43aef8abd890 100644 --- a/net/cor/neigh_rcv.c +++ b/net/cor/neigh_rcv.c @@ -153,7 +153,7 @@ static void cor_parse_conn_success(struct cor_neighbor *nb, struct sk_buff *skb) if (unlikely(trgt_out->isreset != 0)) goto err_unlock; - cor_set_last_act(src_in); + _cor_set_last_act(trgt_out); src_in->source.in.established = 1; @@ -332,16 +332,6 @@ static void cor_parse_ack_conn(struct cor_neighbor *nb, struct sk_buff *skb, return; } - spin_lock_bh(&(src_in->rcv_lock)); - - if (unlikely(cor_is_conn_in(src_in, nb, conn_id) == 0)) { - cor_send_reset_conn(nb, cor_get_connid_reverse(conn_id), 0); - } else { - cor_set_last_act(src_in); - } - - spin_unlock_bh(&(src_in->rcv_lock)); - cor_conn_kref_put(src_in, "stack"); } diff --git a/net/cor/neigh_snd.c b/net/cor/neigh_snd.c index c72c5bda342d..f39bff25fa8a 100644 --- a/net/cor/neigh_snd.c +++ b/net/cor/neigh_snd.c @@ -1851,34 +1851,24 @@ static void cor_delete_all_cmsgs(struct cor_neighbor *nb) } } -static int cor_reset_timeouted_conn_needed(struct cor_neighbor *nb, - struct cor_conn *src_in_l) -{ - if (unlikely(src_in_l->sourcetype != SOURCE_IN || - src_in_l->source.in.nb != nb || - src_in_l->isreset != 0)) - return 0; - else if (likely(time_after(src_in_l->source.in.jiffies_last_act + - CONN_ACTIVITY_UPDATEINTERVAL_SEC * HZ + - CONN_INACTIVITY_TIMEOUT_SEC * HZ, jiffies))) - return 0; - - return 1; -} - static int cor_reset_timeouted_conn(struct cor_neighbor *nb, - struct cor_conn *src_in) + struct cor_conn *trgt_out) { - struct cor_conn_bidir *cnb = cor_get_conn_bidir(src_in); - struct cor_conn *trgt_out = cor_get_conn_reversedir(src_in); + struct cor_conn_bidir *cnb = cor_get_conn_bidir(trgt_out); + struct cor_conn *src_in = cor_get_conn_reversedir(trgt_out); int resetted = 0; spin_lock_bh(&(cnb->cli.rcv_lock)); spin_lock_bh(&(cnb->srv.rcv_lock)); - resetted = cor_reset_timeouted_conn_needed(nb, src_in); - if (unlikely(resetted == 0)) + BUG_ON(trgt_out->targettype != TARGET_OUT); + BUG_ON(trgt_out->target.out.nb != nb); + + if (unlikely(trgt_out->isreset != 0) || likely(time_before(jiffies, + trgt_out->target.out.jiffies_last_act + + CONN_ACTIVITY_UPDATEINTERVAL_SEC * HZ + + CONN_INACTIVITY_TIMEOUT_SEC * HZ))) goto unlock; resetted = (cor_send_reset_conn(nb, cor_get_connid_reverse( @@ -1886,17 +1876,15 @@ static int cor_reset_timeouted_conn(struct cor_neighbor *nb, if (unlikely(resetted == 0)) goto unlock; - BUG_ON(trgt_out->isreset != 0); trgt_out->isreset = 1; + cor_reset_conn_locked(cnb); + unlock: spin_unlock_bh(&(cnb->srv.rcv_lock)); spin_unlock_bh(&(cnb->cli.rcv_lock)); - if (resetted) - cor_reset_conn(src_in); - return resetted; } @@ -1905,40 +1893,26 @@ static void cor_reset_timeouted_conns(struct cor_neighbor *nb) int i; for (i=0;i<10000;i++) { unsigned long iflags; - struct list_head *lh; - struct cor_conn *src_in; + struct cor_conn *trgt_out; - int resetted = 1; + int resetted; spin_lock_irqsave(&(nb->conn_list_lock), iflags); - if (list_empty(&(nb->rcv_conn_list))) { + if (list_empty(&(nb->snd_conn_list))) { spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); break; } - lh = nb->rcv_conn_list.next; - list_del(lh); - list_add_tail(lh, &(nb->rcv_conn_list)); - - src_in = container_of(lh, struct cor_conn, source.in.nb_list); - cor_conn_kref_get(src_in, "stack"); + trgt_out = container_of(nb->snd_conn_list.next, struct cor_conn, + target.out.nb_list); + cor_conn_kref_get(trgt_out, "stack"); spin_unlock_irqrestore(&(nb->conn_list_lock), iflags); + resetted = cor_reset_timeouted_conn(nb, trgt_out); - spin_lock_bh(&(src_in->rcv_lock)); - BUG_ON(src_in->sourcetype != SOURCE_IN); - BUG_ON(src_in->source.in.nb != nb); - resetted = cor_reset_timeouted_conn_needed(nb, src_in); - spin_unlock_bh(&(src_in->rcv_lock)); - if (likely(resetted == 0)) - goto put; - - resetted = cor_reset_timeouted_conn(nb, src_in); - -put: - cor_conn_kref_put(src_in, "stack"); + cor_conn_kref_put(trgt_out, "stack"); if (likely(resetted == 0)) break; -- 2.11.4.GIT