Lines Matching refs:call

23 bool rxrpc_propose_abort(struct rxrpc_call *call, s32 abort_code, int error,  in rxrpc_propose_abort()  argument
26 _enter("{%d},%d,%d,%u", call->debug_id, abort_code, error, why); in rxrpc_propose_abort()
28 if (!call->send_abort && !rxrpc_call_is_complete(call)) { in rxrpc_propose_abort()
29 call->send_abort_why = why; in rxrpc_propose_abort()
30 call->send_abort_err = error; in rxrpc_propose_abort()
31 call->send_abort_seq = 0; in rxrpc_propose_abort()
33 smp_store_release(&call->send_abort, abort_code); in rxrpc_propose_abort()
34 rxrpc_poke_call(call, rxrpc_call_poke_abort); in rxrpc_propose_abort()
45 static int rxrpc_wait_to_be_connected(struct rxrpc_call *call, long *timeo) in rxrpc_wait_to_be_connected() argument
50 _enter("%d", call->debug_id); in rxrpc_wait_to_be_connected()
52 if (rxrpc_call_state(call) != RXRPC_CALL_CLIENT_AWAIT_CONN) in rxrpc_wait_to_be_connected()
55 add_wait_queue_exclusive(&call->waitq, &myself); in rxrpc_wait_to_be_connected()
58 switch (call->interruptibility) { in rxrpc_wait_to_be_connected()
69 if (rxrpc_call_state(call) != RXRPC_CALL_CLIENT_AWAIT_CONN) in rxrpc_wait_to_be_connected()
71 if ((call->interruptibility == RXRPC_INTERRUPTIBLE || in rxrpc_wait_to_be_connected()
72 call->interruptibility == RXRPC_PREINTERRUPTIBLE) && in rxrpc_wait_to_be_connected()
80 remove_wait_queue(&call->waitq, &myself); in rxrpc_wait_to_be_connected()
84 if (ret == 0 && rxrpc_call_is_complete(call)) in rxrpc_wait_to_be_connected()
85 ret = call->error; in rxrpc_wait_to_be_connected()
94 static bool rxrpc_check_tx_space(struct rxrpc_call *call, rxrpc_seq_t *_tx_win) in rxrpc_check_tx_space() argument
97 *_tx_win = call->tx_bottom; in rxrpc_check_tx_space()
98 return call->tx_prepared - call->tx_bottom < 256; in rxrpc_check_tx_space()
105 struct rxrpc_call *call, in rxrpc_wait_for_tx_window_intr() argument
110 if (rxrpc_check_tx_space(call, NULL)) in rxrpc_wait_for_tx_window_intr()
113 if (rxrpc_call_is_complete(call)) in rxrpc_wait_for_tx_window_intr()
114 return call->error; in rxrpc_wait_for_tx_window_intr()
119 trace_rxrpc_txqueue(call, rxrpc_txqueue_wait); in rxrpc_wait_for_tx_window_intr()
129 struct rxrpc_call *call) in rxrpc_wait_for_tx_window_waitall() argument
134 rtt = READ_ONCE(call->peer->srtt_us) >> 3; in rxrpc_wait_for_tx_window_waitall()
140 tx_start = smp_load_acquire(&call->acks_hard_ack); in rxrpc_wait_for_tx_window_waitall()
145 if (rxrpc_check_tx_space(call, &tx_win)) in rxrpc_wait_for_tx_window_waitall()
148 if (rxrpc_call_is_complete(call)) in rxrpc_wait_for_tx_window_waitall()
149 return call->error; in rxrpc_wait_for_tx_window_waitall()
160 trace_rxrpc_txqueue(call, rxrpc_txqueue_wait); in rxrpc_wait_for_tx_window_waitall()
169 struct rxrpc_call *call, in rxrpc_wait_for_tx_window_nonintr() argument
174 if (rxrpc_check_tx_space(call, NULL)) in rxrpc_wait_for_tx_window_nonintr()
177 if (rxrpc_call_is_complete(call)) in rxrpc_wait_for_tx_window_nonintr()
178 return call->error; in rxrpc_wait_for_tx_window_nonintr()
180 trace_rxrpc_txqueue(call, rxrpc_txqueue_wait); in rxrpc_wait_for_tx_window_nonintr()
190 struct rxrpc_call *call, in rxrpc_wait_for_tx_window() argument
198 call->tx_bottom, call->acks_hard_ack, call->tx_top, call->tx_winsize); in rxrpc_wait_for_tx_window()
200 add_wait_queue(&call->waitq, &myself); in rxrpc_wait_for_tx_window()
202 switch (call->interruptibility) { in rxrpc_wait_for_tx_window()
205 ret = rxrpc_wait_for_tx_window_waitall(rx, call); in rxrpc_wait_for_tx_window()
207 ret = rxrpc_wait_for_tx_window_intr(rx, call, timeo); in rxrpc_wait_for_tx_window()
212 ret = rxrpc_wait_for_tx_window_nonintr(rx, call, timeo); in rxrpc_wait_for_tx_window()
216 remove_wait_queue(&call->waitq, &myself); in rxrpc_wait_for_tx_window()
226 static void rxrpc_notify_end_tx(struct rxrpc_sock *rx, struct rxrpc_call *call, in rxrpc_notify_end_tx() argument
230 notify_end_tx(&rx->sk, call, call->user_call_ID); in rxrpc_notify_end_tx()
238 static void rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call, in rxrpc_queue_packet() argument
245 rxrpc_inc_stat(call->rxnet, stat_tx_data); in rxrpc_queue_packet()
247 ASSERTCMP(txb->seq, ==, call->tx_prepared + 1); in rxrpc_queue_packet()
255 trace_rxrpc_txqueue(call, rxrpc_txqueue_queue_last); in rxrpc_queue_packet()
257 trace_rxrpc_txqueue(call, rxrpc_txqueue_queue); in rxrpc_queue_packet()
260 spin_lock(&call->tx_lock); in rxrpc_queue_packet()
261 poke = list_empty(&call->tx_sendmsg); in rxrpc_queue_packet()
262 list_add_tail(&txb->call_link, &call->tx_sendmsg); in rxrpc_queue_packet()
263 call->tx_prepared = seq; in rxrpc_queue_packet()
265 rxrpc_notify_end_tx(rx, call, notify_end_tx); in rxrpc_queue_packet()
266 spin_unlock(&call->tx_lock); in rxrpc_queue_packet()
269 rxrpc_poke_call(call, rxrpc_call_poke_start); in rxrpc_queue_packet()
278 struct rxrpc_call *call, in rxrpc_send_data() argument
292 ret = rxrpc_wait_to_be_connected(call, &timeo); in rxrpc_send_data()
296 if (call->conn->state == RXRPC_CONN_CLIENT_UNSECURED) { in rxrpc_send_data()
297 ret = rxrpc_init_client_conn_security(call->conn); in rxrpc_send_data()
306 txb = call->tx_pending; in rxrpc_send_data()
307 call->tx_pending = NULL; in rxrpc_send_data()
314 state = rxrpc_call_state(call); in rxrpc_send_data()
323 trace_rxrpc_abort(call->debug_id, rxrpc_sendmsg_late_send, in rxrpc_send_data()
324 call->cid, call->call_id, call->rx_consumed, in rxrpc_send_data()
330 if (call->tx_total_len != -1) { in rxrpc_send_data()
331 if (len - copied > call->tx_total_len) in rxrpc_send_data()
333 if (!more && len - copied != call->tx_total_len) in rxrpc_send_data()
343 if (!rxrpc_check_tx_space(call, NULL)) in rxrpc_send_data()
351 txb = call->conn->security->alloc_txbuf(call, remain, sk->sk_allocation); in rxrpc_send_data()
373 if (call->tx_total_len != -1) in rxrpc_send_data()
374 call->tx_total_len -= copy; in rxrpc_send_data()
379 if (rxrpc_call_is_complete(call)) in rxrpc_send_data()
387 else if (call->tx_top - call->acks_hard_ack < in rxrpc_send_data()
388 call->tx_winsize) in rxrpc_send_data()
391 ret = call->security->secure_packet(call, txb); in rxrpc_send_data()
397 rxrpc_queue_packet(rx, call, txb, notify_end_tx); in rxrpc_send_data()
404 if (rxrpc_call_is_complete(call) && in rxrpc_send_data()
405 call->error < 0) in rxrpc_send_data()
406 ret = call->error; in rxrpc_send_data()
408 call->tx_pending = txb; in rxrpc_send_data()
414 _leave(" = %d", call->error); in rxrpc_send_data()
415 return call->error; in rxrpc_send_data()
430 mutex_unlock(&call->user_mutex); in rxrpc_send_data()
432 ret = rxrpc_wait_for_tx_window(rx, call, &timeo, in rxrpc_send_data()
436 if (call->interruptibility == RXRPC_INTERRUPTIBLE) { in rxrpc_send_data()
437 if (mutex_lock_interruptible(&call->user_mutex) < 0) { in rxrpc_send_data()
442 mutex_lock(&call->user_mutex); in rxrpc_send_data()
476 p->call.user_call_ID = *(u32 *)CMSG_DATA(cmsg); in rxrpc_sendmsg_cmsg()
480 p->call.user_call_ID = *(unsigned long *) in rxrpc_sendmsg_cmsg()
518 if (p->call.tx_total_len != -1 || len != sizeof(__s64)) in rxrpc_sendmsg_cmsg()
520 p->call.tx_total_len = *(__s64 *)CMSG_DATA(cmsg); in rxrpc_sendmsg_cmsg()
521 if (p->call.tx_total_len < 0) in rxrpc_sendmsg_cmsg()
528 memcpy(&p->call.timeouts, CMSG_DATA(cmsg), len); in rxrpc_sendmsg_cmsg()
529 p->call.nr_timeouts = len / 4; in rxrpc_sendmsg_cmsg()
530 if (p->call.timeouts.hard > INT_MAX / HZ) in rxrpc_sendmsg_cmsg()
532 if (p->call.nr_timeouts >= 2 && p->call.timeouts.idle > 60 * 60 * 1000) in rxrpc_sendmsg_cmsg()
534 if (p->call.nr_timeouts >= 3 && p->call.timeouts.normal > 60 * 60 * 1000) in rxrpc_sendmsg_cmsg()
545 if (p->call.tx_total_len != -1 && p->command != RXRPC_CMD_SEND_DATA) in rxrpc_sendmsg_cmsg()
560 __acquires(&call->user_mutex) in rxrpc_new_client_call_for_sendmsg()
564 struct rxrpc_call *call; in rxrpc_new_client_call_for_sendmsg() local
594 call = rxrpc_new_client_call(rx, &cp, &p->call, GFP_KERNEL, in rxrpc_new_client_call_for_sendmsg()
599 _leave(" = %p\n", call); in rxrpc_new_client_call_for_sendmsg()
600 return call; in rxrpc_new_client_call_for_sendmsg()
611 struct rxrpc_call *call; in rxrpc_do_sendmsg() local
616 .call.tx_total_len = -1, in rxrpc_do_sendmsg()
617 .call.user_call_ID = 0, in rxrpc_do_sendmsg()
618 .call.nr_timeouts = 0, in rxrpc_do_sendmsg()
619 .call.interruptibility = RXRPC_INTERRUPTIBLE, in rxrpc_do_sendmsg()
636 ret = rxrpc_user_charge_accept(rx, p.call.user_call_ID); in rxrpc_do_sendmsg()
640 call = rxrpc_find_call_by_user_ID(rx, p.call.user_call_ID); in rxrpc_do_sendmsg()
641 if (!call) { in rxrpc_do_sendmsg()
645 call = rxrpc_new_client_call_for_sendmsg(rx, msg, &p); in rxrpc_do_sendmsg()
647 if (IS_ERR(call)) in rxrpc_do_sendmsg()
648 return PTR_ERR(call); in rxrpc_do_sendmsg()
650 p.call.nr_timeouts = 0; in rxrpc_do_sendmsg()
652 if (rxrpc_call_is_complete(call)) in rxrpc_do_sendmsg()
655 switch (rxrpc_call_state(call)) { in rxrpc_do_sendmsg()
663 rxrpc_put_call(call, rxrpc_call_put_sendmsg); in rxrpc_do_sendmsg()
670 ret = mutex_lock_interruptible(&call->user_mutex); in rxrpc_do_sendmsg()
677 if (p.call.tx_total_len != -1) { in rxrpc_do_sendmsg()
679 if (call->tx_total_len != -1 || in rxrpc_do_sendmsg()
680 call->tx_pending || in rxrpc_do_sendmsg()
681 call->tx_top != 0) in rxrpc_do_sendmsg()
683 call->tx_total_len = p.call.tx_total_len; in rxrpc_do_sendmsg()
687 switch (p.call.nr_timeouts) { in rxrpc_do_sendmsg()
689 WRITE_ONCE(call->next_rx_timo, p.call.timeouts.normal); in rxrpc_do_sendmsg()
692 WRITE_ONCE(call->next_req_timo, p.call.timeouts.idle); in rxrpc_do_sendmsg()
695 if (p.call.timeouts.hard > 0) { in rxrpc_do_sendmsg()
696 ktime_t delay = ms_to_ktime(p.call.timeouts.hard * MSEC_PER_SEC); in rxrpc_do_sendmsg()
698 WRITE_ONCE(call->expect_term_by, in rxrpc_do_sendmsg()
699 ktime_add(p.call.timeouts.hard, in rxrpc_do_sendmsg()
701 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_hard); in rxrpc_do_sendmsg()
702 rxrpc_poke_call(call, rxrpc_call_poke_set_timeout); in rxrpc_do_sendmsg()
708 if (rxrpc_call_is_complete(call)) { in rxrpc_do_sendmsg()
712 rxrpc_propose_abort(call, p.abort_code, -ECONNABORTED, in rxrpc_do_sendmsg()
718 ret = rxrpc_send_data(rx, call, msg, len, NULL, &dropped_lock); in rxrpc_do_sendmsg()
723 mutex_unlock(&call->user_mutex); in rxrpc_do_sendmsg()
725 rxrpc_put_call(call, rxrpc_call_put_sendmsg); in rxrpc_do_sendmsg()
747 int rxrpc_kernel_send_data(struct socket *sock, struct rxrpc_call *call, in rxrpc_kernel_send_data() argument
754 _enter("{%d},", call->debug_id); in rxrpc_kernel_send_data()
759 mutex_lock(&call->user_mutex); in rxrpc_kernel_send_data()
761 ret = rxrpc_send_data(rxrpc_sk(sock->sk), call, msg, len, in rxrpc_kernel_send_data()
764 ret = call->error; in rxrpc_kernel_send_data()
767 mutex_unlock(&call->user_mutex); in rxrpc_kernel_send_data()
784 bool rxrpc_kernel_abort_call(struct socket *sock, struct rxrpc_call *call, in rxrpc_kernel_abort_call() argument
789 _enter("{%d},%d,%d,%u", call->debug_id, abort_code, error, why); in rxrpc_kernel_abort_call()
791 mutex_lock(&call->user_mutex); in rxrpc_kernel_abort_call()
792 aborted = rxrpc_propose_abort(call, abort_code, error, why); in rxrpc_kernel_abort_call()
793 mutex_unlock(&call->user_mutex); in rxrpc_kernel_abort_call()
810 void rxrpc_kernel_set_tx_length(struct socket *sock, struct rxrpc_call *call, in rxrpc_kernel_set_tx_length() argument
813 WARN_ON(call->tx_total_len != -1); in rxrpc_kernel_set_tx_length()
814 call->tx_total_len = tx_total_len; in rxrpc_kernel_set_tx_length()