Lines Matching refs:local
35 static long rxrpc_local_cmp_key(const struct rxrpc_local *local, in rxrpc_local_cmp_key() argument
40 diff = ((local->srx.transport_type - srx->transport_type) ?: in rxrpc_local_cmp_key()
41 (local->srx.transport_len - srx->transport_len) ?: in rxrpc_local_cmp_key()
42 (local->srx.transport.family - srx->transport.family)); in rxrpc_local_cmp_key()
51 return ((u16 __force)local->srx.transport.sin.sin_port - in rxrpc_local_cmp_key()
53 memcmp(&local->srx.transport.sin.sin_addr, in rxrpc_local_cmp_key()
61 return ((u16 __force)local->srx.transport.sin6.sin6_port - in rxrpc_local_cmp_key()
63 memcmp(&local->srx.transport.sin6.sin6_addr, in rxrpc_local_cmp_key()
78 struct rxrpc_local *local; in rxrpc_alloc_local() local
80 local = kzalloc(sizeof(struct rxrpc_local), GFP_KERNEL); in rxrpc_alloc_local()
81 if (local) { in rxrpc_alloc_local()
82 atomic_set(&local->usage, 1); in rxrpc_alloc_local()
83 atomic_set(&local->active_users, 1); in rxrpc_alloc_local()
84 local->rxnet = rxnet; in rxrpc_alloc_local()
85 INIT_LIST_HEAD(&local->link); in rxrpc_alloc_local()
86 INIT_WORK(&local->processor, rxrpc_local_processor); in rxrpc_alloc_local()
87 init_rwsem(&local->defrag_sem); in rxrpc_alloc_local()
88 skb_queue_head_init(&local->reject_queue); in rxrpc_alloc_local()
89 skb_queue_head_init(&local->event_queue); in rxrpc_alloc_local()
90 local->client_bundles = RB_ROOT; in rxrpc_alloc_local()
91 spin_lock_init(&local->client_bundles_lock); in rxrpc_alloc_local()
92 spin_lock_init(&local->lock); in rxrpc_alloc_local()
93 rwlock_init(&local->services_lock); in rxrpc_alloc_local()
94 local->debug_id = atomic_inc_return(&rxrpc_debug_id); in rxrpc_alloc_local()
95 memcpy(&local->srx, srx, sizeof(*srx)); in rxrpc_alloc_local()
96 local->srx.srx_service = 0; in rxrpc_alloc_local()
97 trace_rxrpc_local(local->debug_id, rxrpc_local_new, 1, NULL); in rxrpc_alloc_local()
100 _leave(" = %p", local); in rxrpc_alloc_local()
101 return local; in rxrpc_alloc_local()
108 static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) in rxrpc_open_socket() argument
111 struct sockaddr_rxrpc *srx = &local->srx; in rxrpc_open_socket()
117 local, srx->transport_type, srx->transport.family); in rxrpc_open_socket()
129 ret = udp_sock_create(net, &udp_conf, &local->socket); in rxrpc_open_socket()
137 tuncfg.sk_user_data = local; in rxrpc_open_socket()
138 setup_udp_tunnel_sock(net, local->socket, &tuncfg); in rxrpc_open_socket()
141 usk = local->socket->sk; in rxrpc_open_socket()
178 struct rxrpc_local *local; in rxrpc_lookup_local() local
193 local = list_entry(cursor, struct rxrpc_local, link); in rxrpc_lookup_local()
195 diff = rxrpc_local_cmp_key(local, srx); in rxrpc_lookup_local()
207 local = NULL; in rxrpc_lookup_local()
215 if (!rxrpc_use_local(local)) in rxrpc_lookup_local()
222 local = rxrpc_alloc_local(rxnet, srx); in rxrpc_lookup_local()
223 if (!local) in rxrpc_lookup_local()
226 ret = rxrpc_open_socket(local, net); in rxrpc_lookup_local()
231 list_replace_init(cursor, &local->link); in rxrpc_lookup_local()
233 list_add_tail(&local->link, cursor); in rxrpc_lookup_local()
240 age, local->debug_id, &local->srx.transport); in rxrpc_lookup_local()
242 _leave(" = %p", local); in rxrpc_lookup_local()
243 return local; in rxrpc_lookup_local()
249 if (local) in rxrpc_lookup_local()
250 call_rcu(&local->rcu, rxrpc_local_rcu); in rxrpc_lookup_local()
263 struct rxrpc_local *rxrpc_get_local(struct rxrpc_local *local) in rxrpc_get_local() argument
268 n = atomic_inc_return(&local->usage); in rxrpc_get_local()
269 trace_rxrpc_local(local->debug_id, rxrpc_local_got, n, here); in rxrpc_get_local()
270 return local; in rxrpc_get_local()
276 struct rxrpc_local *rxrpc_get_local_maybe(struct rxrpc_local *local) in rxrpc_get_local_maybe() argument
280 if (local) { in rxrpc_get_local_maybe()
281 int n = atomic_fetch_add_unless(&local->usage, 1, 0); in rxrpc_get_local_maybe()
283 trace_rxrpc_local(local->debug_id, rxrpc_local_got, in rxrpc_get_local_maybe()
286 local = NULL; in rxrpc_get_local_maybe()
288 return local; in rxrpc_get_local_maybe()
294 void rxrpc_queue_local(struct rxrpc_local *local) in rxrpc_queue_local() argument
297 unsigned int debug_id = local->debug_id; in rxrpc_queue_local()
298 int n = atomic_read(&local->usage); in rxrpc_queue_local()
300 if (rxrpc_queue_work(&local->processor)) in rxrpc_queue_local()
303 rxrpc_put_local(local); in rxrpc_queue_local()
309 void rxrpc_put_local(struct rxrpc_local *local) in rxrpc_put_local() argument
315 if (local) { in rxrpc_put_local()
316 debug_id = local->debug_id; in rxrpc_put_local()
318 n = atomic_dec_return(&local->usage); in rxrpc_put_local()
322 call_rcu(&local->rcu, rxrpc_local_rcu); in rxrpc_put_local()
329 struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local) in rxrpc_use_local() argument
331 local = rxrpc_get_local_maybe(local); in rxrpc_use_local()
332 if (!local) in rxrpc_use_local()
335 if (!__rxrpc_use_local(local)) { in rxrpc_use_local()
336 rxrpc_put_local(local); in rxrpc_use_local()
340 return local; in rxrpc_use_local()
347 void rxrpc_unuse_local(struct rxrpc_local *local) in rxrpc_unuse_local() argument
349 if (local) { in rxrpc_unuse_local()
350 if (__rxrpc_unuse_local(local)) { in rxrpc_unuse_local()
351 rxrpc_get_local(local); in rxrpc_unuse_local()
352 rxrpc_queue_local(local); in rxrpc_unuse_local()
364 static void rxrpc_local_destroyer(struct rxrpc_local *local) in rxrpc_local_destroyer() argument
366 struct socket *socket = local->socket; in rxrpc_local_destroyer()
367 struct rxrpc_net *rxnet = local->rxnet; in rxrpc_local_destroyer()
369 _enter("%d", local->debug_id); in rxrpc_local_destroyer()
371 local->dead = true; in rxrpc_local_destroyer()
374 list_del_init(&local->link); in rxrpc_local_destroyer()
377 rxrpc_clean_up_local_conns(local); in rxrpc_local_destroyer()
379 ASSERT(!local->service); in rxrpc_local_destroyer()
382 local->socket = NULL; in rxrpc_local_destroyer()
391 rxrpc_purge_queue(&local->reject_queue); in rxrpc_local_destroyer()
392 rxrpc_purge_queue(&local->event_queue); in rxrpc_local_destroyer()
401 struct rxrpc_local *local = in rxrpc_local_processor() local
405 trace_rxrpc_local(local->debug_id, rxrpc_local_processing, in rxrpc_local_processor()
406 atomic_read(&local->usage), NULL); in rxrpc_local_processor()
410 if (!__rxrpc_use_local(local)) { in rxrpc_local_processor()
411 rxrpc_local_destroyer(local); in rxrpc_local_processor()
415 if (!skb_queue_empty(&local->reject_queue)) { in rxrpc_local_processor()
416 rxrpc_reject_packets(local); in rxrpc_local_processor()
420 if (!skb_queue_empty(&local->event_queue)) { in rxrpc_local_processor()
421 rxrpc_process_local_events(local); in rxrpc_local_processor()
425 __rxrpc_unuse_local(local); in rxrpc_local_processor()
428 rxrpc_put_local(local); in rxrpc_local_processor()
436 struct rxrpc_local *local = container_of(rcu, struct rxrpc_local, rcu); in rxrpc_local_rcu() local
438 _enter("%d", local->debug_id); in rxrpc_local_rcu()
440 ASSERT(!work_pending(&local->processor)); in rxrpc_local_rcu()
442 _net("DESTROY LOCAL %d", local->debug_id); in rxrpc_local_rcu()
443 kfree(local); in rxrpc_local_rcu()
452 struct rxrpc_local *local; in rxrpc_destroy_all_locals() local
460 list_for_each_entry(local, &rxnet->local_endpoints, link) { in rxrpc_destroy_all_locals()
462 local, atomic_read(&local->usage)); in rxrpc_destroy_all_locals()