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