Lines Matching refs:conn
33 struct rxrpc_connection *conn; in rxrpc_alloc_connection() local
37 conn = kzalloc(sizeof(struct rxrpc_connection), gfp); in rxrpc_alloc_connection()
38 if (conn) { in rxrpc_alloc_connection()
39 INIT_LIST_HEAD(&conn->cache_link); in rxrpc_alloc_connection()
40 spin_lock_init(&conn->channel_lock); in rxrpc_alloc_connection()
41 INIT_LIST_HEAD(&conn->waiting_calls); in rxrpc_alloc_connection()
42 INIT_WORK(&conn->processor, &rxrpc_process_connection); in rxrpc_alloc_connection()
43 INIT_LIST_HEAD(&conn->proc_link); in rxrpc_alloc_connection()
44 INIT_LIST_HEAD(&conn->link); in rxrpc_alloc_connection()
45 skb_queue_head_init(&conn->rx_queue); in rxrpc_alloc_connection()
46 conn->security = &rxrpc_no_security; in rxrpc_alloc_connection()
47 spin_lock_init(&conn->state_lock); in rxrpc_alloc_connection()
48 conn->debug_id = atomic_inc_return(&rxrpc_debug_id); in rxrpc_alloc_connection()
49 conn->size_align = 4; in rxrpc_alloc_connection()
50 conn->idle_timestamp = jiffies; in rxrpc_alloc_connection()
53 _leave(" = %p{%d}", conn, conn ? conn->debug_id : 0); in rxrpc_alloc_connection()
54 return conn; in rxrpc_alloc_connection()
68 struct rxrpc_connection *conn; in rxrpc_find_connection_rcu() local
101 conn = rxrpc_find_service_conn_rcu(peer, skb); in rxrpc_find_connection_rcu()
102 if (!conn || atomic_read(&conn->usage) == 0) in rxrpc_find_connection_rcu()
104 _leave(" = %p", conn); in rxrpc_find_connection_rcu()
105 return conn; in rxrpc_find_connection_rcu()
110 conn = idr_find(&rxrpc_client_conn_ids, in rxrpc_find_connection_rcu()
112 if (!conn || atomic_read(&conn->usage) == 0) { in rxrpc_find_connection_rcu()
117 if (conn->proto.epoch != k.epoch || in rxrpc_find_connection_rcu()
118 conn->params.local != local) in rxrpc_find_connection_rcu()
121 peer = conn->params.peer; in rxrpc_find_connection_rcu()
144 _leave(" = %p", conn); in rxrpc_find_connection_rcu()
145 return conn; in rxrpc_find_connection_rcu()
158 void __rxrpc_disconnect_call(struct rxrpc_connection *conn, in __rxrpc_disconnect_call() argument
162 &conn->channels[call->cid & RXRPC_CHANNELMASK]; in __rxrpc_disconnect_call()
164 _enter("%d,%x", conn->debug_id, call->cid); in __rxrpc_disconnect_call()
195 struct rxrpc_connection *conn = call->conn; in rxrpc_disconnect_call() local
199 spin_lock_bh(&conn->params.peer->lock); in rxrpc_disconnect_call()
201 spin_unlock_bh(&conn->params.peer->lock); in rxrpc_disconnect_call()
206 spin_lock(&conn->channel_lock); in rxrpc_disconnect_call()
207 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_call()
208 spin_unlock(&conn->channel_lock); in rxrpc_disconnect_call()
211 conn->idle_timestamp = jiffies; in rxrpc_disconnect_call()
217 void rxrpc_kill_connection(struct rxrpc_connection *conn) in rxrpc_kill_connection() argument
219 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_kill_connection()
221 ASSERT(!rcu_access_pointer(conn->channels[0].call) && in rxrpc_kill_connection()
222 !rcu_access_pointer(conn->channels[1].call) && in rxrpc_kill_connection()
223 !rcu_access_pointer(conn->channels[2].call) && in rxrpc_kill_connection()
224 !rcu_access_pointer(conn->channels[3].call)); in rxrpc_kill_connection()
225 ASSERT(list_empty(&conn->cache_link)); in rxrpc_kill_connection()
228 list_del_init(&conn->proc_link); in rxrpc_kill_connection()
235 rxrpc_purge_queue(&conn->rx_queue); in rxrpc_kill_connection()
241 call_rcu(&conn->rcu, rxrpc_destroy_connection); in rxrpc_kill_connection()
248 bool rxrpc_queue_conn(struct rxrpc_connection *conn) in rxrpc_queue_conn() argument
251 int n = __atomic_add_unless(&conn->usage, 1, 0); in rxrpc_queue_conn()
254 if (rxrpc_queue_work(&conn->processor)) in rxrpc_queue_conn()
255 trace_rxrpc_conn(conn, rxrpc_conn_queued, n + 1, here); in rxrpc_queue_conn()
257 rxrpc_put_connection(conn); in rxrpc_queue_conn()
264 void rxrpc_see_connection(struct rxrpc_connection *conn) in rxrpc_see_connection() argument
267 if (conn) { in rxrpc_see_connection()
268 int n = atomic_read(&conn->usage); in rxrpc_see_connection()
270 trace_rxrpc_conn(conn, rxrpc_conn_seen, n, here); in rxrpc_see_connection()
277 void rxrpc_get_connection(struct rxrpc_connection *conn) in rxrpc_get_connection() argument
280 int n = atomic_inc_return(&conn->usage); in rxrpc_get_connection()
282 trace_rxrpc_conn(conn, rxrpc_conn_got, n, here); in rxrpc_get_connection()
289 rxrpc_get_connection_maybe(struct rxrpc_connection *conn) in rxrpc_get_connection_maybe() argument
293 if (conn) { in rxrpc_get_connection_maybe()
294 int n = __atomic_add_unless(&conn->usage, 1, 0); in rxrpc_get_connection_maybe()
296 trace_rxrpc_conn(conn, rxrpc_conn_got, n + 1, here); in rxrpc_get_connection_maybe()
298 conn = NULL; in rxrpc_get_connection_maybe()
300 return conn; in rxrpc_get_connection_maybe()
306 void rxrpc_put_service_conn(struct rxrpc_connection *conn) in rxrpc_put_service_conn() argument
312 n = atomic_dec_return(&conn->usage); in rxrpc_put_service_conn()
313 trace_rxrpc_conn(conn, rxrpc_conn_put_service, n, here); in rxrpc_put_service_conn()
316 rxnet = conn->params.local->rxnet; in rxrpc_put_service_conn()
326 struct rxrpc_connection *conn = in rxrpc_destroy_connection() local
329 _enter("{%d,u=%d}", conn->debug_id, atomic_read(&conn->usage)); in rxrpc_destroy_connection()
331 ASSERTCMP(atomic_read(&conn->usage), ==, 0); in rxrpc_destroy_connection()
333 _net("DESTROY CONN %d", conn->debug_id); in rxrpc_destroy_connection()
335 rxrpc_purge_queue(&conn->rx_queue); in rxrpc_destroy_connection()
337 conn->security->clear(conn); in rxrpc_destroy_connection()
338 key_put(conn->params.key); in rxrpc_destroy_connection()
339 key_put(conn->server_key); in rxrpc_destroy_connection()
340 rxrpc_put_peer(conn->params.peer); in rxrpc_destroy_connection()
341 rxrpc_put_local(conn->params.local); in rxrpc_destroy_connection()
343 kfree(conn); in rxrpc_destroy_connection()
352 struct rxrpc_connection *conn, *_p; in rxrpc_service_connection_reaper() local
366 list_for_each_entry_safe(conn, _p, &rxnet->service_conns, link) { in rxrpc_service_connection_reaper()
367 ASSERTCMP(atomic_read(&conn->usage), >, 0); in rxrpc_service_connection_reaper()
368 if (likely(atomic_read(&conn->usage) > 1)) in rxrpc_service_connection_reaper()
370 if (conn->state == RXRPC_CONN_SERVICE_PREALLOC) in rxrpc_service_connection_reaper()
374 idle_timestamp = READ_ONCE(conn->idle_timestamp); in rxrpc_service_connection_reaper()
376 if (conn->params.local->service_closed) in rxrpc_service_connection_reaper()
380 conn->debug_id, atomic_read(&conn->usage), in rxrpc_service_connection_reaper()
393 if (atomic_cmpxchg(&conn->usage, 1, 0) != 1) in rxrpc_service_connection_reaper()
395 trace_rxrpc_conn(conn, rxrpc_conn_reap_service, 0, 0); in rxrpc_service_connection_reaper()
397 if (rxrpc_conn_is_client(conn)) in rxrpc_service_connection_reaper()
400 rxrpc_unpublish_service_conn(conn); in rxrpc_service_connection_reaper()
402 list_move_tail(&conn->link, &graveyard); in rxrpc_service_connection_reaper()
414 conn = list_entry(graveyard.next, struct rxrpc_connection, in rxrpc_service_connection_reaper()
416 list_del_init(&conn->link); in rxrpc_service_connection_reaper()
418 ASSERTCMP(atomic_read(&conn->usage), ==, 0); in rxrpc_service_connection_reaper()
419 rxrpc_kill_connection(conn); in rxrpc_service_connection_reaper()
431 struct rxrpc_connection *conn, *_p; in rxrpc_destroy_all_connections() local
443 list_for_each_entry_safe(conn, _p, &rxnet->service_conns, link) { in rxrpc_destroy_all_connections()
445 conn, atomic_read(&conn->usage)); in rxrpc_destroy_all_connections()