]> Git Repo - linux.git/blame - net/rxrpc/call_object.c
Linux 6.14-rc3
[linux.git] / net / rxrpc / call_object.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
17926a79
DH
2/* RxRPC individual remote procedure call handling
3 *
4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells ([email protected])
17926a79
DH
6 */
7
9b6d5398
JP
8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9
5a0e3ad6 10#include <linux/slab.h>
17926a79
DH
11#include <linux/module.h>
12#include <linux/circ_buf.h>
7727640c 13#include <linux/spinlock_types.h>
17926a79
DH
14#include <net/sock.h>
15#include <net/af_rxrpc.h>
16#include "ar-internal.h"
17
5b8848d1 18const char *const rxrpc_call_states[NR__RXRPC_CALL_STATES] = {
f5c17aae 19 [RXRPC_CALL_UNINITIALISED] = "Uninit ",
999b69f8 20 [RXRPC_CALL_CLIENT_AWAIT_CONN] = "ClWtConn",
1f8481d1
DH
21 [RXRPC_CALL_CLIENT_SEND_REQUEST] = "ClSndReq",
22 [RXRPC_CALL_CLIENT_AWAIT_REPLY] = "ClAwtRpl",
23 [RXRPC_CALL_CLIENT_RECV_REPLY] = "ClRcvRpl",
00e90712 24 [RXRPC_CALL_SERVER_PREALLOC] = "SvPrealc",
1f8481d1
DH
25 [RXRPC_CALL_SERVER_RECV_REQUEST] = "SvRcvReq",
26 [RXRPC_CALL_SERVER_ACK_REQUEST] = "SvAckReq",
27 [RXRPC_CALL_SERVER_SEND_REPLY] = "SvSndRpl",
28 [RXRPC_CALL_SERVER_AWAIT_ACK] = "SvAwtACK",
29 [RXRPC_CALL_COMPLETE] = "Complete",
f5c17aae
DH
30};
31
32const char *const rxrpc_call_completions[NR__RXRPC_CALL_COMPLETIONS] = {
33 [RXRPC_CALL_SUCCEEDED] = "Complete",
1f8481d1
DH
34 [RXRPC_CALL_REMOTELY_ABORTED] = "RmtAbort",
35 [RXRPC_CALL_LOCALLY_ABORTED] = "LocAbort",
f5c17aae 36 [RXRPC_CALL_LOCAL_ERROR] = "LocError",
1f8481d1 37 [RXRPC_CALL_NETWORK_ERROR] = "NetError",
1f8481d1
DH
38};
39
17926a79 40struct kmem_cache *rxrpc_call_jar;
17926a79 41
48380368
PZ
42static DEFINE_SEMAPHORE(rxrpc_call_limiter, 1000);
43static DEFINE_SEMAPHORE(rxrpc_kernel_call_limiter, 1000);
b7a7d674 44
15f661dc
DH
45void rxrpc_poke_call(struct rxrpc_call *call, enum rxrpc_call_poke_trace what)
46{
f3441d41 47 struct rxrpc_local *local = call->local;
15f661dc
DH
48 bool busy;
49
03fc55ad 50 if (!test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) {
a2ea9a90 51 spin_lock_irq(&local->lock);
15f661dc
DH
52 busy = !list_empty(&call->attend_link);
53 trace_rxrpc_poke_call(call, busy, what);
a33395ab
DH
54 if (!busy && !rxrpc_try_get_call(call, rxrpc_call_get_poke))
55 busy = true;
15f661dc 56 if (!busy) {
15f661dc
DH
57 list_add_tail(&call->attend_link, &local->call_attend_q);
58 }
a2ea9a90 59 spin_unlock_irq(&local->lock);
a33395ab
DH
60 if (!busy)
61 rxrpc_wake_up_io_thread(local);
15f661dc
DH
62 }
63}
64
e99e88a9 65static void rxrpc_call_timer_expired(struct timer_list *t)
248f219c 66{
e99e88a9 67 struct rxrpc_call *call = from_timer(call, t, timer);
248f219c
DH
68
69 _enter("%d", call->debug_id);
70
96b4059f 71 if (!__rxrpc_call_is_complete(call)) {
153f90a0 72 trace_rxrpc_timer_expired(call);
5e6ef4f1 73 rxrpc_poke_call(call, rxrpc_call_poke_timer);
4a7f62f9
DH
74 }
75}
76
9faaff59
DH
77static struct lock_class_key rxrpc_call_user_mutex_lock_class_key;
78
3feda9d6
DH
79static void rxrpc_destroy_call(struct work_struct *);
80
2341e077
DH
81/*
82 * find an extant server call
83 * - called in process context with IRQs enabled
84 */
85struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
86 unsigned long user_call_ID)
87{
88 struct rxrpc_call *call;
89 struct rb_node *p;
90
91 _enter("%p,%lx", rx, user_call_ID);
92
93 read_lock(&rx->call_lock);
94
95 p = rx->calls.rb_node;
96 while (p) {
97 call = rb_entry(p, struct rxrpc_call, sock_node);
98
99 if (user_call_ID < call->user_call_ID)
100 p = p->rb_left;
101 else if (user_call_ID > call->user_call_ID)
102 p = p->rb_right;
103 else
104 goto found_extant_call;
105 }
106
107 read_unlock(&rx->call_lock);
108 _leave(" = NULL");
109 return NULL;
110
111found_extant_call:
cb0fc0c9 112 rxrpc_get_call(call, rxrpc_call_get_sendmsg);
2341e077 113 read_unlock(&rx->call_lock);
a0575429 114 _leave(" = %p [%d]", call, refcount_read(&call->ref));
2341e077
DH
115 return call;
116}
117
17926a79
DH
118/*
119 * allocate a new call
120 */
a25e21f0
DH
121struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp,
122 unsigned int debug_id)
17926a79
DH
123{
124 struct rxrpc_call *call;
d3be4d24 125 struct rxrpc_net *rxnet = rxrpc_net(sock_net(&rx->sk));
17926a79
DH
126
127 call = kmem_cache_zalloc(rxrpc_call_jar, gfp);
128 if (!call)
129 return NULL;
130
540b1c48 131 mutex_init(&call->user_mutex);
9faaff59
DH
132
133 /* Prevent lockdep reporting a deadlock false positive between the afs
134 * filesystem and sys_sendmsg() via the mmap sem.
135 */
136 if (rx->sk.sk_kern_sock)
137 lockdep_set_class(&call->user_mutex,
138 &rxrpc_call_user_mutex_lock_class_key);
139
e99e88a9 140 timer_setup(&call->timer, rxrpc_call_timer_expired, 0);
3feda9d6 141 INIT_WORK(&call->destroyer, rxrpc_destroy_call);
999b69f8 142 INIT_LIST_HEAD(&call->link);
9d35d880 143 INIT_LIST_HEAD(&call->wait_link);
17926a79 144 INIT_LIST_HEAD(&call->accept_link);
248f219c
DH
145 INIT_LIST_HEAD(&call->recvmsg_link);
146 INIT_LIST_HEAD(&call->sock_link);
15f661dc 147 INIT_LIST_HEAD(&call->attend_link);
9e3cccd1 148 skb_queue_head_init(&call->rx_queue);
5d7edbc9
DH
149 skb_queue_head_init(&call->recvmsg_queue);
150 skb_queue_head_init(&call->rx_oos_queue);
45025bce 151 init_waitqueue_head(&call->waitq);
20acbd9a 152 spin_lock_init(&call->notify_lock);
a0575429 153 refcount_set(&call->ref, 1);
153f90a0
DH
154 call->debug_id = debug_id;
155 call->tx_total_len = -1;
fe24a549 156 call->tx_jumbo_max = 1;
153f90a0
DH
157 call->next_rx_timo = 20 * HZ;
158 call->next_req_timo = 1 * HZ;
159 call->ackr_window = 1;
160 call->ackr_wtop = 1;
161 call->delay_ack_at = KTIME_MAX;
7c482665 162 call->rack_timo_at = KTIME_MAX;
153f90a0
DH
163 call->ping_at = KTIME_MAX;
164 call->keepalive_at = KTIME_MAX;
165 call->expect_rx_by = KTIME_MAX;
166 call->expect_req_by = KTIME_MAX;
167 call->expect_term_by = KTIME_MAX;
17926a79
DH
168
169 memset(&call->sock_node, 0xed, sizeof(call->sock_node));
170
75e42126 171 call->rx_winsize = rxrpc_rx_window_size;
248f219c 172 call->tx_winsize = 16;
57494343 173
ba4e1038 174 call->cong_cwnd = RXRPC_MIN_CWND;
a4ea4c47 175 call->cong_ssthresh = RXRPC_TX_MAX_WINDOW;
d3be4d24 176
b40ef2b8
DH
177 rxrpc_call_init_rtt(call);
178
d3be4d24 179 call->rxnet = rxnet;
4700c4d8 180 call->rtt_avail = RXRPC_CALL_RTT_AVAIL_MASK;
d3be4d24 181 atomic_inc(&rxnet->nr_calls);
17926a79
DH
182 return call;
183}
184
185/*
999b69f8 186 * Allocate a new client call.
17926a79 187 */
9faaff59 188static struct rxrpc_call *rxrpc_alloc_client_call(struct rxrpc_sock *rx,
f3441d41
DH
189 struct rxrpc_conn_parameters *cp,
190 struct rxrpc_call_params *p,
a25e21f0
DH
191 gfp_t gfp,
192 unsigned int debug_id)
17926a79
DH
193{
194 struct rxrpc_call *call;
57494343 195 ktime_t now;
f3441d41 196 int ret;
17926a79
DH
197
198 _enter("");
199
a25e21f0 200 call = rxrpc_alloc_call(rx, gfp, debug_id);
17926a79
DH
201 if (!call)
202 return ERR_PTR(-ENOMEM);
57494343 203 now = ktime_get_real();
f3441d41
DH
204 call->acks_latest_ts = now;
205 call->cong_tstamp = now;
72904d7b
DH
206 call->dest_srx = cp->peer->srx;
207 call->dest_srx.srx_service = cp->service_id;
f3441d41
DH
208 call->interruptibility = p->interruptibility;
209 call->tx_total_len = p->tx_total_len;
210 call->key = key_get(cp->key);
72904d7b 211 call->peer = rxrpc_get_peer(cp->peer, rxrpc_peer_get_call);
f3441d41 212 call->local = rxrpc_get_local(cp->local, rxrpc_local_get_call);
fdb99487 213 call->security_level = cp->security_level;
f3441d41
DH
214 if (p->kernel)
215 __set_bit(RXRPC_CALL_KERNEL, &call->flags);
216 if (cp->upgrade)
217 __set_bit(RXRPC_CALL_UPGRADE, &call->flags);
218 if (cp->exclusive)
219 __set_bit(RXRPC_CALL_EXCLUSIVE, &call->flags);
220
db099c62 221 if (p->timeouts.normal)
29e03ec7 222 call->next_rx_timo = umin(p->timeouts.normal, 1);
db099c62 223 if (p->timeouts.idle)
29e03ec7 224 call->next_req_timo = umin(p->timeouts.idle, 1);
db099c62 225 if (p->timeouts.hard)
153f90a0 226 call->hard_timo = p->timeouts.hard;
db099c62 227
f3441d41
DH
228 ret = rxrpc_init_client_call_security(call);
229 if (ret < 0) {
96b4059f 230 rxrpc_prefail_call(call, RXRPC_CALL_LOCAL_ERROR, ret);
f3441d41
DH
231 rxrpc_put_call(call, rxrpc_call_put_discard_error);
232 return ERR_PTR(ret);
233 }
234
96b4059f
DH
235 rxrpc_set_call_state(call, RXRPC_CALL_CLIENT_AWAIT_CONN);
236
f3441d41
DH
237 trace_rxrpc_call(call->debug_id, refcount_read(&call->ref),
238 p->user_call_ID, rxrpc_call_new_client);
999b69f8
DH
239
240 _leave(" = %p", call);
241 return call;
242}
243
244/*
248f219c 245 * Initiate the call ack/resend/expiry timer.
999b69f8 246 */
9d35d880 247void rxrpc_start_call_timer(struct rxrpc_call *call)
999b69f8 248{
153f90a0
DH
249 if (call->hard_timo) {
250 ktime_t delay = ms_to_ktime(call->hard_timo * 1000);
251
252 call->expect_term_by = ktime_add(ktime_get_real(), delay);
253 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_hard);
254 }
255 call->timer.expires = jiffies;
17926a79
DH
256}
257
b7a7d674
DH
258/*
259 * Wait for a call slot to become available.
260 */
261static struct semaphore *rxrpc_get_call_slot(struct rxrpc_call_params *p, gfp_t gfp)
262{
263 struct semaphore *limiter = &rxrpc_call_limiter;
264
265 if (p->kernel)
266 limiter = &rxrpc_kernel_call_limiter;
267 if (p->interruptibility == RXRPC_UNINTERRUPTIBLE) {
268 down(limiter);
269 return limiter;
270 }
271 return down_interruptible(limiter) < 0 ? NULL : limiter;
272}
273
274/*
275 * Release a call slot.
276 */
277static void rxrpc_put_call_slot(struct rxrpc_call *call)
278{
279 struct semaphore *limiter = &rxrpc_call_limiter;
280
281 if (test_bit(RXRPC_CALL_KERNEL, &call->flags))
282 limiter = &rxrpc_kernel_call_limiter;
283 up(limiter);
284}
285
9d35d880
DH
286/*
287 * Start the process of connecting a call. We obtain a peer and a connection
288 * bundle, but the actual association of a call with a connection is offloaded
289 * to the I/O thread to simplify locking.
290 */
291static int rxrpc_connect_call(struct rxrpc_call *call, gfp_t gfp)
292{
293 struct rxrpc_local *local = call->local;
01644a1f 294 int ret = -ENOMEM;
9d35d880
DH
295
296 _enter("{%d,%lx},", call->debug_id, call->user_call_ID);
297
9d35d880
DH
298 ret = rxrpc_look_up_bundle(call, gfp);
299 if (ret < 0)
300 goto error;
301
302 trace_rxrpc_client(NULL, -1, rxrpc_client_queue_new_call);
303 rxrpc_get_call(call, rxrpc_call_get_io_thread);
a2ea9a90 304 spin_lock_irq(&local->client_call_lock);
9d35d880 305 list_add_tail(&call->wait_link, &local->new_client_calls);
a2ea9a90 306 spin_unlock_irq(&local->client_call_lock);
9d35d880
DH
307 rxrpc_wake_up_io_thread(local);
308 return 0;
309
310error:
311 __set_bit(RXRPC_CALL_DISCONNECTED, &call->flags);
312 return ret;
313}
314
17926a79 315/*
540b1c48
DH
316 * Set up a call for the given parameters.
317 * - Called with the socket lock held, which it must release.
318 * - If it returns a call, the call's lock will need releasing by the caller.
17926a79 319 */
2341e077 320struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
19ffa01c 321 struct rxrpc_conn_parameters *cp,
48124178 322 struct rxrpc_call_params *p,
a25e21f0
DH
323 gfp_t gfp,
324 unsigned int debug_id)
540b1c48 325 __releases(&rx->sk.sk_lock.slock)
88f2a825 326 __acquires(&call->user_mutex)
17926a79 327{
2341e077 328 struct rxrpc_call *call, *xcall;
d3be4d24 329 struct rxrpc_net *rxnet;
b7a7d674 330 struct semaphore *limiter;
2341e077 331 struct rb_node *parent, **pp;
999b69f8 332 int ret;
17926a79 333
48124178 334 _enter("%p,%lx", rx, p->user_call_ID);
17926a79 335
72904d7b
DH
336 if (WARN_ON_ONCE(!cp->peer)) {
337 release_sock(&rx->sk);
338 return ERR_PTR(-EIO);
339 }
340
b7a7d674 341 limiter = rxrpc_get_call_slot(p, gfp);
b0f571ec
DH
342 if (!limiter) {
343 release_sock(&rx->sk);
b7a7d674 344 return ERR_PTR(-ERESTARTSYS);
b0f571ec 345 }
b7a7d674 346
72904d7b 347 call = rxrpc_alloc_client_call(rx, cp, p, gfp, debug_id);
2341e077 348 if (IS_ERR(call)) {
540b1c48 349 release_sock(&rx->sk);
b7a7d674 350 up(limiter);
2341e077
DH
351 _leave(" = %ld", PTR_ERR(call));
352 return call;
17926a79
DH
353 }
354
540b1c48
DH
355 /* We need to protect a partially set up call against the user as we
356 * will be acting outside the socket lock.
357 */
358 mutex_lock(&call->user_mutex);
359
999b69f8 360 /* Publish the call, even though it is incompletely set up as yet */
17926a79
DH
361 write_lock(&rx->call_lock);
362
363 pp = &rx->calls.rb_node;
364 parent = NULL;
365 while (*pp) {
366 parent = *pp;
2341e077 367 xcall = rb_entry(parent, struct rxrpc_call, sock_node);
17926a79 368
48124178 369 if (p->user_call_ID < xcall->user_call_ID)
17926a79 370 pp = &(*pp)->rb_left;
48124178 371 else if (p->user_call_ID > xcall->user_call_ID)
17926a79
DH
372 pp = &(*pp)->rb_right;
373 else
357f5ef6 374 goto error_dup_user_ID;
17926a79
DH
375 }
376
248f219c 377 rcu_assign_pointer(call->socket, rx);
48124178 378 call->user_call_ID = p->user_call_ID;
357f5ef6 379 __set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
cb0fc0c9 380 rxrpc_get_call(call, rxrpc_call_get_userid);
17926a79
DH
381 rb_link_node(&call->sock_node, parent, pp);
382 rb_insert_color(&call->sock_node, &rx->calls);
248f219c
DH
383 list_add(&call->sock_link, &rx->sock_calls);
384
17926a79
DH
385 write_unlock(&rx->call_lock);
386
d3be4d24 387 rxnet = call->rxnet;
3dd9c8b5 388 spin_lock(&rxnet->call_lock);
ad25f5cb 389 list_add_tail_rcu(&call->link, &rxnet->calls);
3dd9c8b5 390 spin_unlock(&rxnet->call_lock);
17926a79 391
540b1c48
DH
392 /* From this point on, the call is protected by its own lock. */
393 release_sock(&rx->sk);
394
248f219c
DH
395 /* Set up or get a connection record and set the protocol parameters,
396 * including channel number and call ID.
397 */
1bab27af 398 ret = rxrpc_connect_call(call, gfp);
999b69f8 399 if (ret < 0)
65550098 400 goto error_attached_to_socket;
999b69f8 401
17926a79
DH
402 _leave(" = %p [new]", call);
403 return call;
404
2341e077
DH
405 /* We unexpectedly found the user ID in the list after taking
406 * the call_lock. This shouldn't happen unless the user races
407 * with itself and tries to add the same user ID twice at the
408 * same time in different threads.
409 */
357f5ef6 410error_dup_user_ID:
17926a79 411 write_unlock(&rx->call_lock);
540b1c48 412 release_sock(&rx->sk);
96b4059f 413 rxrpc_prefail_call(call, RXRPC_CALL_LOCAL_ERROR, -EEXIST);
cb0fc0c9
DH
414 trace_rxrpc_call(call->debug_id, refcount_read(&call->ref), 0,
415 rxrpc_call_see_userid_exists);
540b1c48 416 mutex_unlock(&call->user_mutex);
cb0fc0c9 417 rxrpc_put_call(call, rxrpc_call_put_userid_exists);
65550098
DH
418 _leave(" = -EEXIST");
419 return ERR_PTR(-EEXIST);
420
421 /* We got an error, but the call is attached to the socket and is in
9d35d880
DH
422 * need of release. However, we might now race with recvmsg() when it
423 * completion notifies the socket. Return 0 from sys_sendmsg() and
65550098
DH
424 * leave the error to recvmsg() to deal with.
425 */
426error_attached_to_socket:
cb0fc0c9
DH
427 trace_rxrpc_call(call->debug_id, refcount_read(&call->ref), ret,
428 rxrpc_call_see_connect_failed);
9d35d880 429 rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, 0, ret);
65550098
DH
430 _leave(" = c=%08x [err]", call->debug_id);
431 return call;
17926a79
DH
432}
433
434/*
248f219c 435 * Set up an incoming call. call->conn points to the connection.
a2ea9a90 436 * This is called with interrupts disabled and isn't allowed to fail.
17926a79 437 */
248f219c
DH
438void rxrpc_incoming_call(struct rxrpc_sock *rx,
439 struct rxrpc_call *call,
440 struct sk_buff *skb)
17926a79 441{
248f219c 442 struct rxrpc_connection *conn = call->conn;
42886ffe 443 struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
248f219c 444 u32 chan;
17926a79 445
248f219c 446 _enter(",%d", call->conn->debug_id);
e34d4234 447
248f219c
DH
448 rcu_assign_pointer(call->socket, rx);
449 call->call_id = sp->hdr.callNumber;
f3441d41 450 call->dest_srx.srx_service = sp->hdr.serviceId;
248f219c 451 call->cid = sp->hdr.cid;
57494343 452 call->cong_tstamp = skb->tstamp;
248f219c 453
a343b174 454 __set_bit(RXRPC_CALL_EXPOSED, &call->flags);
41b996ce 455 rxrpc_set_call_state(call, RXRPC_CALL_SERVER_RECV_REQUEST);
a343b174 456
5e6ef4f1
DH
457 spin_lock(&conn->state_lock);
458
459 switch (conn->state) {
460 case RXRPC_CONN_SERVICE_UNSECURED:
461 case RXRPC_CONN_SERVICE_CHALLENGING:
41b996ce 462 __set_bit(RXRPC_CALL_CONN_CHALLENGING, &call->flags);
5e6ef4f1
DH
463 break;
464 case RXRPC_CONN_SERVICE:
5e6ef4f1
DH
465 break;
466
a00ce28b 467 case RXRPC_CONN_ABORTED:
96b4059f
DH
468 rxrpc_set_call_completion(call, conn->completion,
469 conn->abort_code, conn->error);
5e6ef4f1 470 break;
5e6ef4f1
DH
471 default:
472 BUG();
473 }
474
5040011d
DH
475 rxrpc_get_call(call, rxrpc_call_get_io_thread);
476
248f219c
DH
477 /* Set the channel for this call. We don't get channel_lock as we're
478 * only defending against the data_ready handler (which we're called
479 * from) and the RESPONSE packet parser (which is only really
480 * interested in call_counter and can cope with a disagreement with the
481 * call pointer).
a1399f8b 482 */
248f219c
DH
483 chan = sp->hdr.cid & RXRPC_CHANNELMASK;
484 conn->channels[chan].call_counter = call->call_id;
485 conn->channels[chan].call_id = call->call_id;
9d35d880 486 conn->channels[chan].call = call;
5e6ef4f1 487 spin_unlock(&conn->state_lock);
17926a79 488
2cc80086 489 spin_lock(&conn->peer->lock);
29fb4ec3 490 hlist_add_head(&call->error_link, &conn->peer->error_targets);
2cc80086 491 spin_unlock(&conn->peer->lock);
17926a79 492
248f219c
DH
493 rxrpc_start_call_timer(call);
494 _leave("");
17926a79
DH
495}
496
e34d4234
DH
497/*
498 * Note the re-emergence of a call.
499 */
cb0fc0c9 500void rxrpc_see_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
e34d4234 501{
e34d4234 502 if (call) {
cb0fc0c9 503 int r = refcount_read(&call->ref);
e34d4234 504
cb0fc0c9 505 trace_rxrpc_call(call->debug_id, r, 0, why);
e34d4234
DH
506 }
507}
508
5e6ef4f1
DH
509struct rxrpc_call *rxrpc_try_get_call(struct rxrpc_call *call,
510 enum rxrpc_call_trace why)
4a7f62f9 511{
cb0fc0c9 512 int r;
4a7f62f9 513
5e6ef4f1
DH
514 if (!call || !__refcount_inc_not_zero(&call->ref, &r))
515 return NULL;
cb0fc0c9 516 trace_rxrpc_call(call->debug_id, r + 1, 0, why);
5e6ef4f1 517 return call;
4a7f62f9
DH
518}
519
e34d4234
DH
520/*
521 * Note the addition of a ref on a call.
522 */
cb0fc0c9 523void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
e34d4234 524{
cb0fc0c9 525 int r;
e34d4234 526
cb0fc0c9
DH
527 __refcount_inc(&call->ref, &r);
528 trace_rxrpc_call(call->debug_id, r + 1, 0, why);
e34d4234
DH
529}
530
a641fd00 531/*
b341a026 532 * Clean up the transmission buffers.
a641fd00 533 */
b341a026
DH
534static void rxrpc_cleanup_tx_buffers(struct rxrpc_call *call)
535{
536 struct rxrpc_txqueue *tq, *next;
537
538 for (tq = call->tx_queue; tq; tq = next) {
539 next = tq->next;
540 for (int i = 0; i < RXRPC_NR_TXQUEUE; i++)
541 if (tq->bufs[i])
542 rxrpc_put_txbuf(tq->bufs[i], rxrpc_txbuf_put_cleaned);
543 trace_rxrpc_tq(call, tq, 0, rxrpc_tq_cleaned);
544 kfree(tq);
545 }
546}
547
548/*
549 * Clean up the receive buffers.
550 */
551static void rxrpc_cleanup_rx_buffers(struct rxrpc_call *call)
a641fd00 552{
4fc68c4c 553 rxrpc_purge_queue(&call->recvmsg_queue);
9e3cccd1 554 rxrpc_purge_queue(&call->rx_queue);
4fc68c4c 555 rxrpc_purge_queue(&call->rx_oos_queue);
a641fd00
DH
556}
557
e34d4234 558/*
248f219c 559 * Detach a call from its owning socket.
e34d4234 560 */
248f219c 561void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
e34d4234 562{
248f219c 563 struct rxrpc_connection *conn = call->conn;
9d35d880 564 bool put = false, putu = false;
e34d4234 565
a0575429 566 _enter("{%d,%d}", call->debug_id, refcount_read(&call->ref));
e34d4234 567
cb0fc0c9
DH
568 trace_rxrpc_call(call->debug_id, refcount_read(&call->ref),
569 call->flags, rxrpc_call_see_release);
17926a79 570
17926a79
DH
571 if (test_and_set_bit(RXRPC_CALL_RELEASED, &call->flags))
572 BUG();
17926a79 573
b7a7d674 574 rxrpc_put_call_slot(call);
17926a79 575
248f219c 576 /* Make sure we don't get any more notifications */
a2ea9a90 577 spin_lock_irq(&rx->recvmsg_lock);
e653cfe4 578
248f219c 579 if (!list_empty(&call->recvmsg_link)) {
17926a79
DH
580 _debug("unlinking once-pending call %p { e=%lx f=%lx }",
581 call, call->events, call->flags);
248f219c
DH
582 list_del(&call->recvmsg_link);
583 put = true;
584 }
585
586 /* list_empty() must return false in rxrpc_notify_socket() */
587 call->recvmsg_link.next = NULL;
588 call->recvmsg_link.prev = NULL;
589
a2ea9a90 590 spin_unlock_irq(&rx->recvmsg_lock);
248f219c 591 if (put)
cb0fc0c9 592 rxrpc_put_call(call, rxrpc_call_put_unnotify);
248f219c
DH
593
594 write_lock(&rx->call_lock);
595
596 if (test_and_clear_bit(RXRPC_CALL_HAS_USERID, &call->flags)) {
17926a79
DH
597 rb_erase(&call->sock_node, &rx->calls);
598 memset(&call->sock_node, 0xdd, sizeof(call->sock_node));
9d35d880 599 putu = true;
17926a79 600 }
17926a79 601
248f219c
DH
602 list_del(&call->sock_link);
603 write_unlock(&rx->call_lock);
604
605 _debug("RELEASE CALL %p (%d CONN %p)", call, call->debug_id, conn);
606
9d35d880
DH
607 if (putu)
608 rxrpc_put_call(call, rxrpc_call_put_userid);
609
17926a79
DH
610 _leave("");
611}
612
17926a79
DH
613/*
614 * release all the calls associated with a socket
615 */
616void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx)
617{
618 struct rxrpc_call *call;
17926a79
DH
619
620 _enter("%p", rx);
621
0360da6d
DH
622 while (!list_empty(&rx->to_be_accepted)) {
623 call = list_entry(rx->to_be_accepted.next,
624 struct rxrpc_call, accept_link);
625 list_del(&call->accept_link);
57af281e
DH
626 rxrpc_propose_abort(call, RX_CALL_DEAD, -ECONNRESET,
627 rxrpc_abort_call_sock_release_tba);
cb0fc0c9 628 rxrpc_put_call(call, rxrpc_call_put_release_sock_tba);
0360da6d
DH
629 }
630
248f219c
DH
631 while (!list_empty(&rx->sock_calls)) {
632 call = list_entry(rx->sock_calls.next,
633 struct rxrpc_call, sock_link);
cb0fc0c9 634 rxrpc_get_call(call, rxrpc_call_get_release_sock);
57af281e
DH
635 rxrpc_propose_abort(call, RX_CALL_DEAD, -ECONNRESET,
636 rxrpc_abort_call_sock_release);
8d94aa38 637 rxrpc_release_call(rx, call);
cb0fc0c9 638 rxrpc_put_call(call, rxrpc_call_put_release_sock);
f36b5e44
DH
639 }
640
17926a79
DH
641 _leave("");
642}
643
644/*
645 * release a call
646 */
cb0fc0c9 647void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
17926a79 648{
d3be4d24 649 struct rxrpc_net *rxnet = call->rxnet;
48c9e0ec 650 unsigned int debug_id = call->debug_id;
a0575429 651 bool dead;
cb0fc0c9 652 int r;
17926a79 653
e34d4234 654 ASSERT(call != NULL);
17926a79 655
cb0fc0c9
DH
656 dead = __refcount_dec_and_test(&call->ref, &r);
657 trace_rxrpc_call(debug_id, r - 1, 0, why);
a0575429 658 if (dead) {
96b4059f 659 ASSERTCMP(__rxrpc_call_state(call), ==, RXRPC_CALL_COMPLETE);
17926a79 660
2baec2c3 661 if (!list_empty(&call->link)) {
3dd9c8b5 662 spin_lock(&rxnet->call_lock);
2baec2c3 663 list_del_init(&call->link);
3dd9c8b5 664 spin_unlock(&rxnet->call_lock);
2baec2c3 665 }
e34d4234 666
8d94aa38 667 rxrpc_cleanup_call(call);
17926a79 668 }
17926a79
DH
669}
670
dee46364 671/*
3feda9d6 672 * Free up the call under RCU.
dee46364 673 */
3feda9d6 674static void rxrpc_rcu_free_call(struct rcu_head *rcu)
dee46364 675{
3feda9d6
DH
676 struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu);
677 struct rxrpc_net *rxnet = READ_ONCE(call->rxnet);
4a7f62f9 678
dee46364 679 kmem_cache_free(rxrpc_call_jar, call);
d3be4d24 680 if (atomic_dec_and_test(&rxnet->nr_calls))
5bb053be 681 wake_up_var(&rxnet->nr_calls);
dee46364
DH
682}
683
963485d4 684/*
3feda9d6 685 * Final call destruction - but must be done in process context.
963485d4 686 */
3feda9d6 687static void rxrpc_destroy_call(struct work_struct *work)
963485d4 688{
3feda9d6 689 struct rxrpc_call *call = container_of(work, struct rxrpc_call, destroyer);
963485d4 690
3feda9d6
DH
691 del_timer_sync(&call->timer);
692
b341a026
DH
693 rxrpc_cleanup_tx_buffers(call);
694 rxrpc_cleanup_rx_buffers(call);
3feda9d6 695 rxrpc_put_txbuf(call->tx_pending, rxrpc_txbuf_put_cleaned);
3feda9d6 696 rxrpc_put_connection(call->conn, rxrpc_conn_put_call);
1bab27af
DH
697 rxrpc_deactivate_bundle(call->bundle);
698 rxrpc_put_bundle(call->bundle, rxrpc_bundle_put_call);
3feda9d6 699 rxrpc_put_peer(call->peer, rxrpc_peer_put_call);
f3441d41 700 rxrpc_put_local(call->local, rxrpc_local_put_call);
3feda9d6 701 call_rcu(&call->rcu, rxrpc_rcu_free_call);
963485d4
DH
702}
703
17926a79
DH
704/*
705 * clean up a call
706 */
00e90712 707void rxrpc_cleanup_call(struct rxrpc_call *call)
17926a79 708{
17926a79
DH
709 memset(&call->sock_node, 0xcd, sizeof(call->sock_node));
710
96b4059f 711 ASSERTCMP(__rxrpc_call_state(call), ==, RXRPC_CALL_COMPLETE);
17926a79 712 ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags));
17926a79 713
5e6ef4f1 714 del_timer(&call->timer);
17926a79 715
5e6ef4f1 716 if (rcu_read_lock_held())
3feda9d6
DH
717 /* Can't use the rxrpc workqueue as we need to cancel/flush
718 * something that may be running/waiting there.
719 */
720 schedule_work(&call->destroyer);
721 else
722 rxrpc_destroy_call(&call->destroyer);
17926a79
DH
723}
724
725/*
2baec2c3
DH
726 * Make sure that all calls are gone from a network namespace. To reach this
727 * point, any open UDP sockets in that namespace must have been closed, so any
728 * outstanding calls cannot be doing I/O.
17926a79 729 */
2baec2c3 730void rxrpc_destroy_all_calls(struct rxrpc_net *rxnet)
17926a79
DH
731{
732 struct rxrpc_call *call;
733
734 _enter("");
8d94aa38 735
b1302342 736 if (!list_empty(&rxnet->calls)) {
3dd9c8b5 737 spin_lock(&rxnet->call_lock);
248f219c 738
b1302342
DH
739 while (!list_empty(&rxnet->calls)) {
740 call = list_entry(rxnet->calls.next,
741 struct rxrpc_call, link);
742 _debug("Zapping call %p", call);
17926a79 743
cb0fc0c9 744 rxrpc_see_call(call, rxrpc_call_see_zap);
b1302342 745 list_del_init(&call->link);
17926a79 746
b1302342 747 pr_err("Call %p still in use (%d,%s,%lx,%lx)!\n",
a0575429 748 call, refcount_read(&call->ref),
96b4059f 749 rxrpc_call_states[__rxrpc_call_state(call)],
b1302342 750 call->flags, call->events);
17926a79 751
3dd9c8b5 752 spin_unlock(&rxnet->call_lock);
b1302342 753 cond_resched();
3dd9c8b5 754 spin_lock(&rxnet->call_lock);
b1302342 755 }
17926a79 756
3dd9c8b5 757 spin_unlock(&rxnet->call_lock);
17926a79
DH
758 }
759
d3be4d24 760 atomic_dec(&rxnet->nr_calls);
5bb053be 761 wait_var_event(&rxnet->nr_calls, !atomic_read(&rxnet->nr_calls));
17926a79 762}
This page took 1.183609 seconds and 5 git commands to generate.