Lines Matching full:conn
26 void rxrpc_poke_conn(struct rxrpc_connection *conn, enum rxrpc_conn_trace why) in rxrpc_poke_conn() argument
28 struct rxrpc_local *local = conn->local; in rxrpc_poke_conn()
35 busy = !list_empty(&conn->attend_link); in rxrpc_poke_conn()
37 rxrpc_get_connection(conn, why); in rxrpc_poke_conn()
38 list_add_tail(&conn->attend_link, &local->conn_attend_q); in rxrpc_poke_conn()
46 struct rxrpc_connection *conn = in rxrpc_connection_timer() local
49 rxrpc_poke_conn(conn, rxrpc_conn_get_poke_timer); in rxrpc_connection_timer()
58 struct rxrpc_connection *conn; in rxrpc_alloc_connection() local
62 conn = kzalloc(sizeof(struct rxrpc_connection), gfp); in rxrpc_alloc_connection()
63 if (conn) { in rxrpc_alloc_connection()
64 INIT_LIST_HEAD(&conn->cache_link); in rxrpc_alloc_connection()
65 timer_setup(&conn->timer, &rxrpc_connection_timer, 0); in rxrpc_alloc_connection()
66 INIT_WORK(&conn->processor, rxrpc_process_connection); in rxrpc_alloc_connection()
67 INIT_WORK(&conn->destructor, rxrpc_clean_up_connection); in rxrpc_alloc_connection()
68 INIT_LIST_HEAD(&conn->proc_link); in rxrpc_alloc_connection()
69 INIT_LIST_HEAD(&conn->link); in rxrpc_alloc_connection()
70 INIT_LIST_HEAD(&conn->attend_link); in rxrpc_alloc_connection()
71 mutex_init(&conn->security_lock); in rxrpc_alloc_connection()
72 skb_queue_head_init(&conn->rx_queue); in rxrpc_alloc_connection()
73 conn->rxnet = rxnet; in rxrpc_alloc_connection()
74 conn->security = &rxrpc_no_security; in rxrpc_alloc_connection()
75 spin_lock_init(&conn->state_lock); in rxrpc_alloc_connection()
76 conn->debug_id = atomic_inc_return(&rxrpc_debug_id); in rxrpc_alloc_connection()
77 conn->idle_timestamp = jiffies; in rxrpc_alloc_connection()
80 _leave(" = %p{%d}", conn, conn ? conn->debug_id : 0); in rxrpc_alloc_connection()
81 return conn; in rxrpc_alloc_connection()
99 struct rxrpc_connection *conn; in rxrpc_find_client_connection_rcu() local
108 conn = idr_find(&local->conn_ids, sp->hdr.cid >> RXRPC_CIDSHIFT); in rxrpc_find_client_connection_rcu()
109 if (!conn || refcount_read(&conn->ref) == 0) { in rxrpc_find_client_connection_rcu()
110 _debug("no conn"); in rxrpc_find_client_connection_rcu()
114 if (conn->proto.epoch != sp->hdr.epoch || in rxrpc_find_client_connection_rcu()
115 conn->local != local) in rxrpc_find_client_connection_rcu()
118 peer = conn->peer; in rxrpc_find_client_connection_rcu()
136 _leave(" = %p", conn); in rxrpc_find_client_connection_rcu()
137 return conn; in rxrpc_find_client_connection_rcu()
149 void __rxrpc_disconnect_call(struct rxrpc_connection *conn, in __rxrpc_disconnect_call() argument
153 &conn->channels[call->cid & RXRPC_CHANNELMASK]; in __rxrpc_disconnect_call()
155 _enter("%d,%x", conn->debug_id, call->cid); in __rxrpc_disconnect_call()
191 struct rxrpc_connection *conn = call->conn; in rxrpc_disconnect_call() local
207 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_call()
208 conn->idle_timestamp = jiffies; in rxrpc_disconnect_call()
209 if (atomic_dec_and_test(&conn->active)) in rxrpc_disconnect_call()
210 rxrpc_set_service_reap_timer(conn->rxnet, in rxrpc_disconnect_call()
221 void rxrpc_queue_conn(struct rxrpc_connection *conn, enum rxrpc_conn_trace why) in rxrpc_queue_conn() argument
223 if (atomic_read(&conn->active) >= 0 && in rxrpc_queue_conn()
224 rxrpc_queue_work(&conn->processor)) in rxrpc_queue_conn()
225 rxrpc_see_connection(conn, why); in rxrpc_queue_conn()
231 void rxrpc_see_connection(struct rxrpc_connection *conn, in rxrpc_see_connection() argument
234 if (conn) { in rxrpc_see_connection()
235 int r = refcount_read(&conn->ref); in rxrpc_see_connection()
237 trace_rxrpc_conn(conn->debug_id, r, why); in rxrpc_see_connection()
244 struct rxrpc_connection *rxrpc_get_connection(struct rxrpc_connection *conn, in rxrpc_get_connection() argument
249 __refcount_inc(&conn->ref, &r); in rxrpc_get_connection()
250 trace_rxrpc_conn(conn->debug_id, r + 1, why); in rxrpc_get_connection()
251 return conn; in rxrpc_get_connection()
258 rxrpc_get_connection_maybe(struct rxrpc_connection *conn, in rxrpc_get_connection_maybe() argument
263 if (conn) { in rxrpc_get_connection_maybe()
264 if (__refcount_inc_not_zero(&conn->ref, &r)) in rxrpc_get_connection_maybe()
265 trace_rxrpc_conn(conn->debug_id, r + 1, why); in rxrpc_get_connection_maybe()
267 conn = NULL; in rxrpc_get_connection_maybe()
269 return conn; in rxrpc_get_connection_maybe()
287 struct rxrpc_connection *conn = in rxrpc_rcu_free_connection() local
289 struct rxrpc_net *rxnet = conn->rxnet; in rxrpc_rcu_free_connection()
291 _enter("{%d,u=%d}", conn->debug_id, refcount_read(&conn->ref)); in rxrpc_rcu_free_connection()
293 trace_rxrpc_conn(conn->debug_id, refcount_read(&conn->ref), in rxrpc_rcu_free_connection()
295 kfree(conn); in rxrpc_rcu_free_connection()
306 struct rxrpc_connection *conn = in rxrpc_clean_up_connection() local
308 struct rxrpc_net *rxnet = conn->rxnet; in rxrpc_clean_up_connection()
310 ASSERT(!conn->channels[0].call && in rxrpc_clean_up_connection()
311 !conn->channels[1].call && in rxrpc_clean_up_connection()
312 !conn->channels[2].call && in rxrpc_clean_up_connection()
313 !conn->channels[3].call); in rxrpc_clean_up_connection()
314 ASSERT(list_empty(&conn->cache_link)); in rxrpc_clean_up_connection()
316 del_timer_sync(&conn->timer); in rxrpc_clean_up_connection()
317 cancel_work_sync(&conn->processor); /* Processing may restart the timer */ in rxrpc_clean_up_connection()
318 del_timer_sync(&conn->timer); in rxrpc_clean_up_connection()
321 list_del_init(&conn->proc_link); in rxrpc_clean_up_connection()
324 rxrpc_purge_queue(&conn->rx_queue); in rxrpc_clean_up_connection()
326 rxrpc_kill_client_conn(conn); in rxrpc_clean_up_connection()
328 conn->security->clear(conn); in rxrpc_clean_up_connection()
329 key_put(conn->key); in rxrpc_clean_up_connection()
330 rxrpc_put_bundle(conn->bundle, rxrpc_bundle_put_conn); in rxrpc_clean_up_connection()
331 rxrpc_put_peer(conn->peer, rxrpc_peer_put_conn); in rxrpc_clean_up_connection()
332 rxrpc_put_local(conn->local, rxrpc_local_put_kill_conn); in rxrpc_clean_up_connection()
338 rxrpc_purge_queue(&conn->rx_queue); in rxrpc_clean_up_connection()
340 call_rcu(&conn->rcu, rxrpc_rcu_free_connection); in rxrpc_clean_up_connection()
346 void rxrpc_put_connection(struct rxrpc_connection *conn, in rxrpc_put_connection() argument
353 if (!conn) in rxrpc_put_connection()
356 debug_id = conn->debug_id; in rxrpc_put_connection()
357 dead = __refcount_dec_and_test(&conn->ref, &r); in rxrpc_put_connection()
360 del_timer(&conn->timer); in rxrpc_put_connection()
361 cancel_work(&conn->processor); in rxrpc_put_connection()
363 if (in_softirq() || work_busy(&conn->processor) || in rxrpc_put_connection()
364 timer_pending(&conn->timer)) in rxrpc_put_connection()
368 schedule_work(&conn->destructor); in rxrpc_put_connection()
370 rxrpc_clean_up_connection(&conn->destructor); in rxrpc_put_connection()
379 struct rxrpc_connection *conn, *_p; in rxrpc_service_connection_reaper() local
393 list_for_each_entry_safe(conn, _p, &rxnet->service_conns, link) { in rxrpc_service_connection_reaper()
394 ASSERTCMP(atomic_read(&conn->active), >=, 0); in rxrpc_service_connection_reaper()
395 if (likely(atomic_read(&conn->active) > 0)) in rxrpc_service_connection_reaper()
397 if (conn->state == RXRPC_CONN_SERVICE_PREALLOC) in rxrpc_service_connection_reaper()
400 if (rxnet->live && !conn->local->dead) { in rxrpc_service_connection_reaper()
401 idle_timestamp = READ_ONCE(conn->idle_timestamp); in rxrpc_service_connection_reaper()
403 if (conn->local->service_closed) in rxrpc_service_connection_reaper()
406 _debug("reap CONN %d { a=%d,t=%ld }", in rxrpc_service_connection_reaper()
407 conn->debug_id, atomic_read(&conn->active), in rxrpc_service_connection_reaper()
417 /* The activity count sits at 0 whilst the conn is unused on in rxrpc_service_connection_reaper()
418 * the list; we reduce that to -1 to make the conn unavailable. in rxrpc_service_connection_reaper()
421 if (!atomic_try_cmpxchg(&conn->active, &active, -1)) in rxrpc_service_connection_reaper()
423 rxrpc_see_connection(conn, rxrpc_conn_see_reap_service); in rxrpc_service_connection_reaper()
425 if (rxrpc_conn_is_client(conn)) in rxrpc_service_connection_reaper()
428 rxrpc_unpublish_service_conn(conn); in rxrpc_service_connection_reaper()
430 list_move_tail(&conn->link, &graveyard); in rxrpc_service_connection_reaper()
441 conn = list_entry(graveyard.next, struct rxrpc_connection, in rxrpc_service_connection_reaper()
443 list_del_init(&conn->link); in rxrpc_service_connection_reaper()
445 ASSERTCMP(atomic_read(&conn->active), ==, -1); in rxrpc_service_connection_reaper()
446 rxrpc_put_connection(conn, rxrpc_conn_put_service_reaped); in rxrpc_service_connection_reaper()
458 struct rxrpc_connection *conn, *_p; in rxrpc_destroy_all_connections() local
470 list_for_each_entry_safe(conn, _p, &rxnet->service_conns, link) { in rxrpc_destroy_all_connections()
471 pr_err("AF_RXRPC: Leaked conn %p {%d}\n", in rxrpc_destroy_all_connections()
472 conn, refcount_read(&conn->ref)); in rxrpc_destroy_all_connections()