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 atomic_inc(&rxnet->nr_conns); in rxrpc_alloc_client_connection()
184 write_lock(&rxnet->conn_lock); in rxrpc_alloc_client_connection()
185 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); in rxrpc_alloc_client_connection()
186 write_unlock(&rxnet->conn_lock); in rxrpc_alloc_client_connection()
189 rxrpc_get_peer(conn->params.peer); in rxrpc_alloc_client_connection()
190 rxrpc_get_local(conn->params.local); in rxrpc_alloc_client_connection()
191 key_get(conn->params.key); in rxrpc_alloc_client_connection()
193 trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client, in rxrpc_alloc_client_connection()
194 atomic_read(&conn->usage), in rxrpc_alloc_client_connection()
197 atomic_inc(&rxnet->nr_client_conns); in rxrpc_alloc_client_connection()
198 trace_rxrpc_client(conn, -1, rxrpc_client_alloc); in rxrpc_alloc_client_connection()
221 rxnet = conn->params.local->rxnet; in rxrpc_may_reuse_conn()
222 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags)) in rxrpc_may_reuse_conn()
225 if (conn->state != RXRPC_CONN_CLIENT || in rxrpc_may_reuse_conn()
226 conn->proto.epoch != rxnet->epoch) in rxrpc_may_reuse_conn()
236 id = conn->proto.cid >> RXRPC_CIDSHIFT; in rxrpc_may_reuse_conn()
237 distance = id - id_cursor; in rxrpc_may_reuse_conn()
239 distance = -distance; in rxrpc_may_reuse_conn()
240 limit = max_t(unsigned long, atomic_read(&rxnet->nr_conns) * 4, 1024); in rxrpc_may_reuse_conn()
247 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_may_reuse_conn()
261 struct rxrpc_local *local = cp->local; in rxrpc_look_up_bundle()
263 long diff; in rxrpc_look_up_bundle() local
266 cp->peer, key_serial(cp->key), cp->security_level, cp->upgrade); in rxrpc_look_up_bundle()
268 if (cp->exclusive) in rxrpc_look_up_bundle()
273 spin_lock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
274 p = local->client_bundles.rb_node; in rxrpc_look_up_bundle()
278 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
279 diff = (cmp(peer) ?: in rxrpc_look_up_bundle()
284 if (diff < 0) in rxrpc_look_up_bundle()
285 p = p->rb_left; in rxrpc_look_up_bundle()
286 else if (diff > 0) in rxrpc_look_up_bundle()
287 p = p->rb_right; in rxrpc_look_up_bundle()
291 spin_unlock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
300 spin_lock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
301 pp = &local->client_bundles.rb_node; in rxrpc_look_up_bundle()
307 #define cmp(X) ((long)bundle->params.X - (long)cp->X) in rxrpc_look_up_bundle()
308 diff = (cmp(peer) ?: in rxrpc_look_up_bundle()
313 if (diff < 0) in rxrpc_look_up_bundle()
314 pp = &(*pp)->rb_left; in rxrpc_look_up_bundle()
315 else if (diff > 0) in rxrpc_look_up_bundle()
316 pp = &(*pp)->rb_right; in rxrpc_look_up_bundle()
322 candidate->debug_id = atomic_inc_return(&rxrpc_bundle_id); in rxrpc_look_up_bundle()
323 rb_link_node(&candidate->local_node, parent, pp); in rxrpc_look_up_bundle()
324 rb_insert_color(&candidate->local_node, &local->client_bundles); in rxrpc_look_up_bundle()
326 spin_unlock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
327 _leave(" = %u [new]", candidate->debug_id); in rxrpc_look_up_bundle()
334 spin_unlock(&local->client_bundles_lock); in rxrpc_look_up_bundle()
335 _leave(" = %u [found]", bundle->debug_id); in rxrpc_look_up_bundle()
353 _enter("{%d,%lx},", call->debug_id, call->user_call_ID); in rxrpc_prep_call()
355 cp->peer = rxrpc_lookup_peer(rx, cp->local, srx, gfp); in rxrpc_prep_call()
356 if (!cp->peer) in rxrpc_prep_call()
359 call->cong_cwnd = cp->peer->cong_cwnd; in rxrpc_prep_call()
360 if (call->cong_cwnd >= call->cong_ssthresh) in rxrpc_prep_call()
361 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_prep_call()
363 call->cong_mode = RXRPC_CALL_SLOW_START; in rxrpc_prep_call()
364 if (cp->upgrade) in rxrpc_prep_call()
365 __set_bit(RXRPC_CALL_UPGRADE, &call->flags); in rxrpc_prep_call()
375 spin_lock(&bundle->channel_lock); in rxrpc_prep_call()
376 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
377 spin_unlock(&bundle->channel_lock); in rxrpc_prep_call()
379 _leave(" = [B=%x]", bundle->debug_id); in rxrpc_prep_call()
383 _leave(" = -ENOMEM"); in rxrpc_prep_call()
384 return ERR_PTR(-ENOMEM); in rxrpc_prep_call()
391 __releases(bundle->channel_lock) in rxrpc_add_conn_to_bundle()
399 conflict = bundle->alloc_conn; in rxrpc_add_conn_to_bundle()
401 bundle->alloc_conn = true; in rxrpc_add_conn_to_bundle()
402 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
410 spin_lock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
411 bundle->alloc_conn = false; in rxrpc_add_conn_to_bundle()
414 bundle->alloc_error = PTR_ERR(candidate); in rxrpc_add_conn_to_bundle()
415 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
420 bundle->alloc_error = 0; in rxrpc_add_conn_to_bundle()
422 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) { in rxrpc_add_conn_to_bundle()
426 old = bundle->conns[i]; in rxrpc_add_conn_to_bundle()
429 trace_rxrpc_client(old, -1, rxrpc_client_replace); in rxrpc_add_conn_to_bundle()
430 candidate->bundle_shift = shift; in rxrpc_add_conn_to_bundle()
431 bundle->conns[i] = candidate; in rxrpc_add_conn_to_bundle()
433 set_bit(shift + j, &bundle->avail_chans); in rxrpc_add_conn_to_bundle()
441 spin_unlock(&bundle->channel_lock); in rxrpc_add_conn_to_bundle()
444 _debug("discard C=%x", candidate->debug_id); in rxrpc_add_conn_to_bundle()
445 trace_rxrpc_client(candidate, -1, rxrpc_client_duplicate); in rxrpc_add_conn_to_bundle()
464 spin_lock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
468 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_maybe_add_conn()
469 if (rxrpc_may_reuse_conn(bundle->conns[i])) in rxrpc_maybe_add_conn()
472 if (!usable && !list_empty(&bundle->waiting_calls)) { in rxrpc_maybe_add_conn()
473 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
475 if (test_bit(RXRPC_CALL_UPGRADE, &call->flags)) in rxrpc_maybe_add_conn()
476 bundle->try_upgrade = true; in rxrpc_maybe_add_conn()
482 if (!bundle->avail_chans && in rxrpc_maybe_add_conn()
483 !bundle->try_upgrade && in rxrpc_maybe_add_conn()
484 !list_empty(&bundle->waiting_calls) && in rxrpc_maybe_add_conn()
485 usable < ARRAY_SIZE(bundle->conns)) in rxrpc_maybe_add_conn()
488 spin_unlock(&bundle->channel_lock); in rxrpc_maybe_add_conn()
504 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_activate_one_channel()
505 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel()
506 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel()
508 u32 call_id = chan->call_counter + 1; in rxrpc_activate_one_channel()
510 _enter("C=%x,%u", conn->debug_id, channel); in rxrpc_activate_one_channel()
517 clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_activate_one_channel()
518 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
521 list_del_init(&call->chan_wait_link); in rxrpc_activate_one_channel()
522 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
523 call->conn = rxrpc_get_connection(conn); in rxrpc_activate_one_channel()
524 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
525 call->call_id = call_id; in rxrpc_activate_one_channel()
526 call->security = conn->security; in rxrpc_activate_one_channel()
527 call->security_ix = conn->security_ix; in rxrpc_activate_one_channel()
528 call->service_id = conn->service_id; in rxrpc_activate_one_channel()
532 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
534 write_lock_bh(&call->state_lock); in rxrpc_activate_one_channel()
535 call->state = RXRPC_CALL_CLIENT_SEND_REQUEST; in rxrpc_activate_one_channel()
536 write_unlock_bh(&call->state_lock); in rxrpc_activate_one_channel()
550 chan->call_id = call_id; in rxrpc_activate_one_channel()
551 chan->call_debug_id = call->debug_id; in rxrpc_activate_one_channel()
552 rcu_assign_pointer(chan->call, call); in rxrpc_activate_one_channel()
553 wake_up(&call->waitq); in rxrpc_activate_one_channel()
561 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_unidle_conn()
564 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
566 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_unidle_conn()
567 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
568 list_del_init(&conn->cache_link); in rxrpc_unidle_conn()
571 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_unidle_conn()
578 * Assign channels and callNumbers to waiting calls with channel_lock
587 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
592 while (!list_empty(&bundle->waiting_calls)) { in rxrpc_activate_channels_locked()
593 avail = bundle->avail_chans & mask; in rxrpc_activate_channels_locked()
597 clear_bit(channel, &bundle->avail_chans); in rxrpc_activate_channels_locked()
600 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
604 if (bundle->try_upgrade) in rxrpc_activate_channels_locked()
605 set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_activate_channels_locked()
608 channel &= (RXRPC_MAXCALLS - 1); in rxrpc_activate_channels_locked()
609 conn->act_chans |= 1 << channel; in rxrpc_activate_channels_locked()
615 * Assign channels and callNumbers to waiting calls.
619 _enter("B=%x", bundle->debug_id); in rxrpc_activate_channels()
621 trace_rxrpc_client(NULL, -1, rxrpc_client_activate_chans); in rxrpc_activate_channels()
623 if (!bundle->avail_chans) in rxrpc_activate_channels()
626 spin_lock(&bundle->channel_lock); in rxrpc_activate_channels()
628 spin_unlock(&bundle->channel_lock); in rxrpc_activate_channels()
641 _enter("%d", call->debug_id); in rxrpc_wait_for_channel()
646 ret = bundle->alloc_error ?: -EAGAIN; in rxrpc_wait_for_channel()
650 add_wait_queue_exclusive(&call->waitq, &myself); in rxrpc_wait_for_channel()
654 ret = bundle->alloc_error; in rxrpc_wait_for_channel()
658 switch (call->interruptibility) { in rxrpc_wait_for_channel()
668 if (READ_ONCE(call->state) != RXRPC_CALL_CLIENT_AWAIT_CONN) in rxrpc_wait_for_channel()
670 if ((call->interruptibility == RXRPC_INTERRUPTIBLE || in rxrpc_wait_for_channel()
671 call->interruptibility == RXRPC_PREINTERRUPTIBLE) && in rxrpc_wait_for_channel()
673 ret = -ERESTARTSYS; in rxrpc_wait_for_channel()
678 remove_wait_queue(&call->waitq, &myself); in rxrpc_wait_for_channel()
688 * - called in process context with IRQs enabled
697 struct rxrpc_net *rxnet = cp->local->rxnet; in rxrpc_connect_call()
700 _enter("{%d,%lx},", call->debug_id, call->user_call_ID); in rxrpc_connect_call()
702 rxrpc_discard_expired_client_conns(&rxnet->client_conn_reaper); in rxrpc_connect_call()
710 if (call->state == RXRPC_CALL_CLIENT_AWAIT_CONN) { in rxrpc_connect_call()
727 spin_lock(&bundle->channel_lock); in rxrpc_connect_call()
728 list_del_init(&call->chan_wait_link); in rxrpc_connect_call()
729 spin_unlock(&bundle->channel_lock); in rxrpc_connect_call()
731 if (call->state != RXRPC_CALL_CLIENT_AWAIT_CONN) { in rxrpc_connect_call()
736 trace_rxrpc_client(call->conn, ret, rxrpc_client_chan_wait_failed); in rxrpc_connect_call()
748 unsigned int channel = call->cid & RXRPC_CHANNELMASK; in rxrpc_expose_client_call()
749 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call()
750 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_expose_client_call()
752 if (!test_and_set_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_expose_client_call()
758 chan->call_counter++; in rxrpc_expose_client_call()
759 if (chan->call_counter >= INT_MAX) in rxrpc_expose_client_call()
760 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_expose_client_call()
770 if (!rxnet->kill_all_client_conns) { in rxrpc_set_client_reap_timer()
774 if (rxnet->live) in rxrpc_set_client_reap_timer()
775 timer_reduce(&rxnet->client_conn_reap_timer, reap_at); in rxrpc_set_client_reap_timer()
786 struct rxrpc_net *rxnet = bundle->params.local->rxnet; in rxrpc_disconnect_client_call()
791 _enter("c=%x", call->debug_id); in rxrpc_disconnect_client_call()
793 spin_lock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
794 set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); in rxrpc_disconnect_client_call()
799 conn = call->conn; in rxrpc_disconnect_client_call()
802 ASSERTCMP(call->call_id, ==, 0); in rxrpc_disconnect_client_call()
803 ASSERT(!test_bit(RXRPC_CALL_EXPOSED, &call->flags)); in rxrpc_disconnect_client_call()
804 list_del_init(&call->chan_wait_link); in rxrpc_disconnect_client_call()
808 cid = call->cid; in rxrpc_disconnect_client_call()
810 chan = &conn->channels[channel]; in rxrpc_disconnect_client_call()
813 if (rcu_access_pointer(chan->call) != call) { in rxrpc_disconnect_client_call()
814 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
829 if (test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_disconnect_client_call()
830 _debug("exposed %u,%u", call->call_id, call->abort_code); in rxrpc_disconnect_client_call()
833 if (test_and_clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) { in rxrpc_disconnect_client_call()
835 bundle->try_upgrade = false; in rxrpc_disconnect_client_call()
843 if (may_reuse && !list_empty(&bundle->waiting_calls)) { in rxrpc_disconnect_client_call()
850 * can be skipped if we find a follow-on call. The first DATA packet in rxrpc_disconnect_client_call()
853 if (call->completion == RXRPC_CALL_SUCCEEDED && in rxrpc_disconnect_client_call()
854 test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_disconnect_client_call()
857 WRITE_ONCE(chan->final_ack_at, final_ack_at); in rxrpc_disconnect_client_call()
859 set_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_disconnect_client_call()
864 rcu_assign_pointer(chan->call, NULL); in rxrpc_disconnect_client_call()
865 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
866 conn->act_chans &= ~(1 << channel); in rxrpc_disconnect_client_call()
868 /* If no channels remain active, then put the connection on the idle in rxrpc_disconnect_client_call()
872 if (!conn->act_chans) { in rxrpc_disconnect_client_call()
874 conn->idle_timestamp = jiffies; in rxrpc_disconnect_client_call()
877 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_disconnect_client_call()
878 list_move_tail(&conn->cache_link, &rxnet->idle_client_conns); in rxrpc_disconnect_client_call()
879 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_disconnect_client_call()
885 spin_unlock(&bundle->channel_lock); in rxrpc_disconnect_client_call()
895 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn()
896 struct rxrpc_local *local = bundle->params.local; in rxrpc_unbundle_conn()
901 _enter("C=%x", conn->debug_id); in rxrpc_unbundle_conn()
903 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_unbundle_conn()
906 spin_lock(&bundle->channel_lock); in rxrpc_unbundle_conn()
907 bindex = conn->bundle_shift / RXRPC_MAXCALLS; in rxrpc_unbundle_conn()
908 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
910 bundle->conns[bindex] = NULL; in rxrpc_unbundle_conn()
912 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
915 spin_unlock(&bundle->channel_lock); in rxrpc_unbundle_conn()
918 if (!bundle->avail_chans) { in rxrpc_unbundle_conn()
920 spin_lock(&local->client_bundles_lock); in rxrpc_unbundle_conn()
922 for (i = 0; i < ARRAY_SIZE(bundle->conns); i++) in rxrpc_unbundle_conn()
923 if (bundle->conns[i]) in rxrpc_unbundle_conn()
925 if (i == ARRAY_SIZE(bundle->conns) && !bundle->params.exclusive) { in rxrpc_unbundle_conn()
927 rb_erase(&bundle->local_node, &local->client_bundles); in rxrpc_unbundle_conn()
931 spin_unlock(&local->client_bundles_lock); in rxrpc_unbundle_conn()
946 struct rxrpc_local *local = conn->params.local; in rxrpc_kill_client_conn()
947 struct rxrpc_net *rxnet = local->rxnet; in rxrpc_kill_client_conn()
949 _enter("C=%x", conn->debug_id); in rxrpc_kill_client_conn()
951 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup); in rxrpc_kill_client_conn()
952 atomic_dec(&rxnet->nr_client_conns); in rxrpc_kill_client_conn()
964 unsigned int debug_id = conn->debug_id; in rxrpc_put_client_conn()
967 n = atomic_dec_return(&conn->usage); in rxrpc_put_client_conn()
980 * considered non-reentrant.
992 if (list_empty(&rxnet->idle_client_conns)) { in rxrpc_discard_expired_client_conns()
998 if (!spin_trylock(&rxnet->client_conn_discard_lock)) { in rxrpc_discard_expired_client_conns()
1006 nr_conns = atomic_read(&rxnet->nr_client_conns); in rxrpc_discard_expired_client_conns()
1009 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_discard_expired_client_conns()
1011 if (list_empty(&rxnet->idle_client_conns)) in rxrpc_discard_expired_client_conns()
1014 conn = list_entry(rxnet->idle_client_conns.next, in rxrpc_discard_expired_client_conns()
1017 if (!rxnet->kill_all_client_conns) { in rxrpc_discard_expired_client_conns()
1021 * final-ACK or ABORT retransmission. in rxrpc_discard_expired_client_conns()
1026 if (conn->params.local->service_closed) in rxrpc_discard_expired_client_conns()
1029 conn_expires_at = conn->idle_timestamp + expiry; in rxrpc_discard_expired_client_conns()
1036 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_discard_expired_client_conns()
1037 list_del_init(&conn->cache_link); in rxrpc_discard_expired_client_conns()
1039 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_discard_expired_client_conns()
1042 rxrpc_put_connection(conn); /* Drop the ->cache_link ref */ in rxrpc_discard_expired_client_conns()
1044 nr_conns--; in rxrpc_discard_expired_client_conns()
1051 * We don't worry if the work item is already scheduled - it can look in rxrpc_discard_expired_client_conns()
1056 if (!rxnet->kill_all_client_conns) in rxrpc_discard_expired_client_conns()
1057 timer_reduce(&rxnet->client_conn_reap_timer, conn_expires_at); in rxrpc_discard_expired_client_conns()
1060 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_discard_expired_client_conns()
1061 spin_unlock(&rxnet->client_conn_discard_lock); in rxrpc_discard_expired_client_conns()
1073 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_destroy_all_client_connections()
1074 rxnet->kill_all_client_conns = true; in rxrpc_destroy_all_client_connections()
1075 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_destroy_all_client_connections()
1077 del_timer_sync(&rxnet->client_conn_reap_timer); in rxrpc_destroy_all_client_connections()
1079 if (!rxrpc_queue_work(&rxnet->client_conn_reaper)) in rxrpc_destroy_all_client_connections()
1091 struct rxrpc_net *rxnet = local->rxnet; in rxrpc_clean_up_local_conns()
1096 spin_lock(&rxnet->client_conn_cache_lock); in rxrpc_clean_up_local_conns()
1098 list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, in rxrpc_clean_up_local_conns()
1100 if (conn->params.local == local) { in rxrpc_clean_up_local_conns()
1101 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_clean_up_local_conns()
1102 list_move(&conn->cache_link, &graveyard); in rxrpc_clean_up_local_conns()
1106 spin_unlock(&rxnet->client_conn_cache_lock); in rxrpc_clean_up_local_conns()
1111 list_del_init(&conn->cache_link); in rxrpc_clean_up_local_conns()