Lines Matching +full:diff +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Client connection-specific management code.
13 * (2) DONT_REUSE - The connection should be discarded as soon as possible and
31 #include "ar-internal.h"
38 * We use machine-unique IDs for our client connections.
52 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_get_client_connection_id()
68 conn->proto.epoch = rxnet->epoch; in rxrpc_get_client_connection_id()
69 conn->proto.cid = id << RXRPC_CIDSHIFT; in rxrpc_get_client_connection_id()
70 set_bit(RXRPC_CONN_HAS_IDR, &conn->flags); in rxrpc_get_client_connection_id()
71 _leave(" [CID %x]", conn->proto.cid); in rxrpc_get_client_connection_id()
86 if (test_bit(RXRPC_CONN_HAS_IDR, &conn->flags)) { in rxrpc_put_client_connection_id()
89 conn->proto.cid >> RXRPC_CIDSHIFT); in rxrpc_put_client_connection_id()
105 conn, atomic_read(&conn->usage)); in rxrpc_destroy_client_conn_ids()
123 bundle->params = *cp; in rxrpc_alloc_bundle()
124 rxrpc_get_peer(bundle->params.peer); in rxrpc_alloc_bundle()
125 atomic_set(&bundle->usage, 1); in rxrpc_alloc_bundle()
126 spin_lock_init(&bundle->channel_lock); in rxrpc_alloc_bundle()
127 INIT_LIST_HEAD(&bundle->waiting_calls); in rxrpc_alloc_bundle()
134 atomic_inc(&bundle->usage); in rxrpc_get_bundle()
140 unsigned int d = bundle->debug_id; in rxrpc_put_bundle()
141 unsigned int u = atomic_dec_return(&bundle->usage); in rxrpc_put_bundle()
145 rxrpc_put_peer(bundle->params.peer); in rxrpc_put_bundle()
157 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_alloc_client_connection()
164 _leave(" = -ENOMEM"); in rxrpc_alloc_client_connection()
165 return ERR_PTR(-ENOMEM); in rxrpc_alloc_client_connection()
168 atomic_set(&conn->usage, 1); in rxrpc_alloc_client_connection()
169 conn->bundle = bundle; in rxrpc_alloc_client_connection()
170 conn->params = bundle->params; in rxrpc_alloc_client_connection()
171 conn->out_clientflag = RXRPC_CLIENT_INITIATED; in rxrpc_alloc_client_connection()
172 conn->state = RXRPC_CONN_CLIENT; in rxrpc_alloc_client_connection()
173 conn->service_id = conn->params.service_id; in rxrpc_alloc_client_connection()
183 ret = conn->security->prime_packet_security(conn); in rxrpc_alloc_client_connection()
187 atomic_inc(&rxnet->nr_conns); in rxrpc_alloc_client_connection()
188 write_lock(&rxnet->conn_lock); in rxrpc_alloc_client_connection()
189 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); in rxrpc_alloc_client_connection()
190 write_unlock(&rxnet->conn_lock); in rxrpc_alloc_client_connection()
193 rxrpc_get_peer(conn->params.peer); in rxrpc_alloc_client_connection()
194 rxrpc_get_local(conn->params.local); in rxrpc_alloc_client_connection()
195 key_get(conn->params.key); in rxrpc_alloc_client_connection()
197 trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client, in rxrpc_alloc_client_connection()
198 atomic_read(&conn->usage), in rxrpc_alloc_client_connection()
201 atomic_inc(&rxnet->nr_client_conns); in rxrpc_alloc_client_connection()
202 trace_rxrpc_client(conn, -1, rxrpc_client_alloc); in rxrpc_alloc_client_connection()
207 conn->security->clear(conn); in rxrpc_alloc_client_connection()
227 rxnet = conn->params.local->rxnet; in rxrpc_may_reuse_conn()
228 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags)) in rxrpc_may_reuse_conn()
231 if (conn->state != RXRPC_CONN_CLIENT || in rxrpc_may_reuse_conn()
232 conn->proto.epoch != rxnet->epoch) in rxrpc_may_reuse_conn()
242 id = conn->proto.cid >> RXRPC_CIDSHIFT; in rxrpc_may_reuse_conn()
243 distance = id - id_cursor; in rxrpc_may_reuse_conn()
245 distance = -distance; in rxrpc_may_reuse_conn()
246 limit = max_t(unsigned long, atomic_read(&rxnet->nr_conns) * 4, 1024); in rxrpc_may_reuse_conn()
253 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_may_reuse_conn()
267 struct rxrpc_local *local = cp->local; in rxrpc_look_up_bundle()
269 long diff; in rxrpc_look_up_bundle() local
272 cp->peer, key_serial(cp->key), cp->security_level, cp->upgrade); in rxrpc_look_up_bundle()
274 if (cp->exclusive) in rxrpc_look_up_bundle()
279 spin_lock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
280 p = local->client_bundles.rb_node; in rxrpc_look_up_bundle()
284 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
285 diff = (cmp(peer) ?: in rxrpc_look_up_bundle()
290 if (diff < 0) in rxrpc_look_up_bundle()
291 p = p->rb_left; in rxrpc_look_up_bundle()
292 else if (diff > 0) in rxrpc_look_up_bundle()
293 p = p->rb_right; in rxrpc_look_up_bundle()
297 spin_unlock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
306 spin_lock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
307 pp = &local->client_bundles.rb_node; in rxrpc_look_up_bundle()
313 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
314 diff = (cmp(peer) ?: in rxrpc_look_up_bundle()
319 if (diff < 0) in rxrpc_look_up_bundle()
320 pp = &(*pp)->rb_left; in rxrpc_look_up_bundle()
321 else if (diff > 0) in rxrpc_look_up_bundle()
322 pp = &(*pp)->rb_right; in rxrpc_look_up_bundle()
328 candidate->debug_id = atomic_inc_return(&rxrpc_bundle_id); in rxrpc_look_up_bundle()
329 rb_link_node(&candidate->local_node, parent, pp); in rxrpc_look_up_bundle()
330 rb_insert_color(&candidate->local_node, &local->client_bundles); in rxrpc_look_up_bundle()
332 spin_unlock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
333 _leave(" = %u [new]", candidate->debug_id); in rxrpc_look_up_bundle()
340 spin_unlock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
341 _leave(" = %u [found]", bundle->debug_id); in rxrpc_look_up_bundle()
359 _enter("{%d,%lx},", call->debug_id, call->user_call_ID); in rxrpc_prep_call()
361 cp->peer = rxrpc_lookup_peer(rx, cp->local, srx, gfp); in rxrpc_prep_call()
362 if (!cp->peer) in rxrpc_prep_call()
365 call->cong_cwnd = cp->peer->cong_cwnd; in rxrpc_prep_call()
366 if (call->cong_cwnd >= call->cong_ssthresh) in rxrpc_prep_call()
367 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_prep_call()
369 call->cong_mode = RXRPC_CALL_SLOW_START; in rxrpc_prep_call()
370 if (cp->upgrade) in rxrpc_prep_call()
371 __set_bit(RXRPC_CALL_UPGRADE, &call->flags); in rxrpc_prep_call()
381 spin_lock(&bundle->channel_lock); in rxrpc_prep_call()
382 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
383 spin_unlock(&bundle->channel_lock); in rxrpc_prep_call()
385 _leave(" = [B=%x]", bundle->debug_id); in rxrpc_prep_call()
389 _leave(" = -ENOMEM"); in rxrpc_prep_call()
390 return ERR_PTR(-ENOMEM); in rxrpc_prep_call()
397 __releases(bundle->channel_lock) in rxrpc_add_conn_to_bundle()
405 conflict = bundle->alloc_conn; in rxrpc_add_conn_to_bundle()
407 bundle->alloc_conn = true; in rxrpc_add_conn_to_bundle()
408 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
416 spin_lock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
417 bundle->alloc_conn = false; in rxrpc_add_conn_to_bundle()
420 bundle->alloc_error = PTR_ERR(candidate); in rxrpc_add_conn_to_bundle()
421 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
426 bundle->alloc_error = 0; in rxrpc_add_conn_to_bundle()
428 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) { in rxrpc_add_conn_to_bundle()
432 old = bundle->conns[i]; in rxrpc_add_conn_to_bundle()
435 trace_rxrpc_client(old, -1, rxrpc_client_replace); in rxrpc_add_conn_to_bundle()
436 candidate->bundle_shift = shift; in rxrpc_add_conn_to_bundle()
437 bundle->conns[i] = candidate; in rxrpc_add_conn_to_bundle()
439 set_bit(shift + j, &bundle->avail_chans); in rxrpc_add_conn_to_bundle()
447 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
450 _debug("discard C=%x", candidate->debug_id); in rxrpc_add_conn_to_bundle()
451 trace_rxrpc_client(candidate, -1, rxrpc_client_duplicate); in rxrpc_add_conn_to_bundle()
470 spin_lock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
474 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_maybe_add_conn()
475 if (rxrpc_may_reuse_conn(bundle->conns[i])) in rxrpc_maybe_add_conn()
478 if (!usable && !list_empty(&bundle->waiting_calls)) { in rxrpc_maybe_add_conn()
479 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
481 if (test_bit(RXRPC_CALL_UPGRADE, &call->flags)) in rxrpc_maybe_add_conn()
482 bundle->try_upgrade = true; in rxrpc_maybe_add_conn()
488 if (!bundle->avail_chans && in rxrpc_maybe_add_conn()
489 !bundle->try_upgrade && in rxrpc_maybe_add_conn()
490 !list_empty(&bundle->waiting_calls) && in rxrpc_maybe_add_conn()
491 usable < ARRAY_SIZE(bundle->conns)) in rxrpc_maybe_add_conn()
494 spin_unlock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
510 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_activate_one_channel()
511 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel()
512 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel()
514 u32 call_id = chan->call_counter + 1; in rxrpc_activate_one_channel()
516 _enter("C=%x,%u", conn->debug_id, channel); in rxrpc_activate_one_channel()
523 clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_activate_one_channel()
524 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
527 list_del_init(&call->chan_wait_link); in rxrpc_activate_one_channel()
528 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
529 call->conn = rxrpc_get_connection(conn); in rxrpc_activate_one_channel()
530 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
531 call->call_id = call_id; in rxrpc_activate_one_channel()
532 call->security = conn->security; in rxrpc_activate_one_channel()
533 call->security_ix = conn->security_ix; in rxrpc_activate_one_channel()
534 call->service_id = conn->service_id; in rxrpc_activate_one_channel()
538 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
540 write_lock_bh(&call->state_lock); in rxrpc_activate_one_channel()
541 call->state = RXRPC_CALL_CLIENT_SEND_REQUEST; in rxrpc_activate_one_channel()
542 write_unlock_bh(&call->state_lock); in rxrpc_activate_one_channel()
556 chan->call_id = call_id; in rxrpc_activate_one_channel()
557 chan->call_debug_id = call->debug_id; in rxrpc_activate_one_channel()
558 rcu_assign_pointer(chan->call, call); in rxrpc_activate_one_channel()
559 wake_up(&call->waitq); in rxrpc_activate_one_channel()
567 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_unidle_conn()
570 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
572 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_unidle_conn()
573 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
574 list_del_init(&conn->cache_link); in rxrpc_unidle_conn()
577 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_unidle_conn()
584 * Assign channels and callNumbers to waiting calls with channel_lock
593 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
598 while (!list_empty(&bundle->waiting_calls)) { in rxrpc_activate_channels_locked()
599 avail = bundle->avail_chans & mask; in rxrpc_activate_channels_locked()
603 clear_bit(channel, &bundle->avail_chans); in rxrpc_activate_channels_locked()
606 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
610 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
611 set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_activate_channels_locked()
614 channel &= (RXRPC_MAXCALLS - 1); in rxrpc_activate_channels_locked()
615 conn->act_chans |= 1 << channel; in rxrpc_activate_channels_locked()
621 * Assign channels and callNumbers to waiting calls.
625 _enter("B=%x", bundle->debug_id); in rxrpc_activate_channels()
627 trace_rxrpc_client(NULL, -1, rxrpc_client_activate_chans); in rxrpc_activate_channels()
629 if (!bundle->avail_chans) in rxrpc_activate_channels()
632 spin_lock(&bundle->channel_lock); in rxrpc_activate_channels()
634 spin_unlock(&bundle->channel_lock); in rxrpc_activate_channels()
647 _enter("%d", call->debug_id); in rxrpc_wait_for_channel()
652 ret = bundle->alloc_error ?: -EAGAIN; in rxrpc_wait_for_channel()
656 add_wait_queue_exclusive(&call->waitq, &myself); in rxrpc_wait_for_channel()
660 ret = bundle->alloc_error; in rxrpc_wait_for_channel()
664 switch (call->interruptibility) { in rxrpc_wait_for_channel()
674 if (READ_ONCE(call->state) != RXRPC_CALL_CLIENT_AWAIT_CONN) in rxrpc_wait_for_channel()
676 if ((call->interruptibility == RXRPC_INTERRUPTIBLE || in rxrpc_wait_for_channel()
677 call->interruptibility == RXRPC_PREINTERRUPTIBLE) && in rxrpc_wait_for_channel()
679 ret = -ERESTARTSYS; in rxrpc_wait_for_channel()
684 remove_wait_queue(&call->waitq, &myself); in rxrpc_wait_for_channel()
694 * - called in process context with IRQs enabled
703 struct rxrpc_net *rxnet = cp->local->rxnet; in rxrpc_connect_call()
706 _enter("{%d,%lx},", call->debug_id, call->user_call_ID); in rxrpc_connect_call()
708 rxrpc_discard_expired_client_conns(&rxnet->client_conn_reaper); in rxrpc_connect_call()
716 if (call->state == RXRPC_CALL_CLIENT_AWAIT_CONN) { in rxrpc_connect_call()
733 spin_lock(&bundle->channel_lock); in rxrpc_connect_call()
734 list_del_init(&call->chan_wait_link); in rxrpc_connect_call()
735 spin_unlock(&bundle->channel_lock); in rxrpc_connect_call()
737 if (call->state != RXRPC_CALL_CLIENT_AWAIT_CONN) { in rxrpc_connect_call()
742 trace_rxrpc_client(call->conn, ret, rxrpc_client_chan_wait_failed); in rxrpc_connect_call()
754 unsigned int channel = call->cid & RXRPC_CHANNELMASK; in rxrpc_expose_client_call()
755 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call()
756 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_expose_client_call()
758 if (!test_and_set_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_expose_client_call()
764 chan->call_counter++; in rxrpc_expose_client_call()
765 if (chan->call_counter >= INT_MAX) in rxrpc_expose_client_call()
766 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_expose_client_call()
776 if (!rxnet->kill_all_client_conns) { in rxrpc_set_client_reap_timer()
780 if (rxnet->live) in rxrpc_set_client_reap_timer()
781 timer_reduce(&rxnet->client_conn_reap_timer, reap_at); in rxrpc_set_client_reap_timer()
792 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_disconnect_client_call()
797 _enter("c=%x", call->debug_id); in rxrpc_disconnect_client_call()
799 spin_lock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
800 set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); in rxrpc_disconnect_client_call()
805 conn = call->conn; in rxrpc_disconnect_client_call()
808 ASSERTCMP(call->call_id, ==, 0); in rxrpc_disconnect_client_call()
809 ASSERT(!test_bit(RXRPC_CALL_EXPOSED, &call->flags)); in rxrpc_disconnect_client_call()
810 list_del_init(&call->chan_wait_link); in rxrpc_disconnect_client_call()
814 cid = call->cid; in rxrpc_disconnect_client_call()
816 chan = &conn->channels[channel]; in rxrpc_disconnect_client_call()
819 if (rcu_access_pointer(chan->call) != call) { in rxrpc_disconnect_client_call()
820 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
835 if (test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_disconnect_client_call()
836 _debug("exposed %u,%u", call->call_id, call->abort_code); in rxrpc_disconnect_client_call()
839 if (test_and_clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) { in rxrpc_disconnect_client_call()
841 bundle->try_upgrade = false; in rxrpc_disconnect_client_call()
849 if (may_reuse && !list_empty(&bundle->waiting_calls)) { in rxrpc_disconnect_client_call()
856 * can be skipped if we find a follow-on call. The first DATA packet in rxrpc_disconnect_client_call()
859 if (call->completion == RXRPC_CALL_SUCCEEDED && in rxrpc_disconnect_client_call()
860 test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_disconnect_client_call()
863 WRITE_ONCE(chan->final_ack_at, final_ack_at); in rxrpc_disconnect_client_call()
865 set_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_disconnect_client_call()
870 rcu_assign_pointer(chan->call, NULL); in rxrpc_disconnect_client_call()
871 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
872 conn->act_chans &= ~(1 << channel); in rxrpc_disconnect_client_call()
874 /* If no channels remain active, then put the connection on the idle in rxrpc_disconnect_client_call()
878 if (!conn->act_chans) { in rxrpc_disconnect_client_call()
880 conn->idle_timestamp = jiffies; in rxrpc_disconnect_client_call()
883 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_disconnect_client_call()
884 list_move_tail(&conn->cache_link, &rxnet->idle_client_conns); in rxrpc_disconnect_client_call()
885 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_disconnect_client_call()
891 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
901 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn()
902 struct rxrpc_local *local = bundle->params.local; in rxrpc_unbundle_conn()
907 _enter("C=%x", conn->debug_id); in rxrpc_unbundle_conn()
909 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_unbundle_conn()
912 spin_lock(&bundle->channel_lock); in rxrpc_unbundle_conn()
913 bindex = conn->bundle_shift / RXRPC_MAXCALLS; in rxrpc_unbundle_conn()
914 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
916 bundle->conns[bindex] = NULL; in rxrpc_unbundle_conn()
918 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
921 spin_unlock(&bundle->channel_lock); in rxrpc_unbundle_conn()
924 if (!bundle->avail_chans) { in rxrpc_unbundle_conn()
926 spin_lock(&local->client_bundles_lock); in rxrpc_unbundle_conn()
928 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_unbundle_conn()
929 if (bundle->conns[i]) in rxrpc_unbundle_conn()
931 if (i == ARRAY_SIZE(bundle->conns) && !bundle->params.exclusive) { in rxrpc_unbundle_conn()
933 rb_erase(&bundle->local_node, &local->client_bundles); in rxrpc_unbundle_conn()
937 spin_unlock(&local->client_bundles_lock); in rxrpc_unbundle_conn()
952 struct rxrpc_local *local = conn->params.local; in rxrpc_kill_client_conn()
953 struct rxrpc_net *rxnet = local->rxnet; in rxrpc_kill_client_conn()
955 _enter("C=%x", conn->debug_id); in rxrpc_kill_client_conn()
957 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup); in rxrpc_kill_client_conn()
958 atomic_dec(&rxnet->nr_client_conns); in rxrpc_kill_client_conn()
970 unsigned int debug_id = conn->debug_id; in rxrpc_put_client_conn()
973 n = atomic_dec_return(&conn->usage); in rxrpc_put_client_conn()
986 * considered non-reentrant.
998 if (list_empty(&rxnet->idle_client_conns)) { in rxrpc_discard_expired_client_conns()
1004 if (!spin_trylock(&rxnet->client_conn_discard_lock)) { in rxrpc_discard_expired_client_conns()
1012 nr_conns = atomic_read(&rxnet->nr_client_conns); in rxrpc_discard_expired_client_conns()
1015 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_discard_expired_client_conns()
1017 if (list_empty(&rxnet->idle_client_conns)) in rxrpc_discard_expired_client_conns()
1020 conn = list_entry(rxnet->idle_client_conns.next, in rxrpc_discard_expired_client_conns()
1023 if (!rxnet->kill_all_client_conns) { in rxrpc_discard_expired_client_conns()
1027 * final-ACK or ABORT retransmission. in rxrpc_discard_expired_client_conns()
1032 if (conn->params.local->service_closed) in rxrpc_discard_expired_client_conns()
1035 conn_expires_at = conn->idle_timestamp + expiry; in rxrpc_discard_expired_client_conns()
1042 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_discard_expired_client_conns()
1043 list_del_init(&conn->cache_link); in rxrpc_discard_expired_client_conns()
1045 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_discard_expired_client_conns()
1048 rxrpc_put_connection(conn); /* Drop the ->cache_link ref */ in rxrpc_discard_expired_client_conns()
1050 nr_conns--; in rxrpc_discard_expired_client_conns()
1057 * We don't worry if the work item is already scheduled - it can look in rxrpc_discard_expired_client_conns()
1062 if (!rxnet->kill_all_client_conns) in rxrpc_discard_expired_client_conns()
1063 timer_reduce(&rxnet->client_conn_reap_timer, conn_expires_at); in rxrpc_discard_expired_client_conns()
1066 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_discard_expired_client_conns()
1067 spin_unlock(&rxnet->client_conn_discard_lock); in rxrpc_discard_expired_client_conns()
1079 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_destroy_all_client_connections()
1080 rxnet->kill_all_client_conns = true; in rxrpc_destroy_all_client_connections()
1081 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_destroy_all_client_connections()
1083 del_timer_sync(&rxnet->client_conn_reap_timer); in rxrpc_destroy_all_client_connections()
1085 if (!rxrpc_queue_work(&rxnet->client_conn_reaper)) in rxrpc_destroy_all_client_connections()
1097 struct rxrpc_net *rxnet = local->rxnet; in rxrpc_clean_up_local_conns()
1102 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_clean_up_local_conns()
1104 list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, in rxrpc_clean_up_local_conns()
1106 if (conn->params.local == local) { in rxrpc_clean_up_local_conns()
1107 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_clean_up_local_conns()
1108 list_move(&conn->cache_link, &graveyard); in rxrpc_clean_up_local_conns()
1112 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_clean_up_local_conns()
1117 list_del_init(&conn->cache_link); in rxrpc_clean_up_local_conns()