Lines Matching refs:kcm

121 static void kcm_rcv_ready(struct kcm_sock *kcm)  in kcm_rcv_ready()  argument
123 struct kcm_mux *mux = kcm->mux; in kcm_rcv_ready()
127 if (unlikely(kcm->rx_wait || kcm->rx_psock || kcm->rx_disabled)) in kcm_rcv_ready()
131 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in kcm_rcv_ready()
134 WARN_ON(!sk_rmem_alloc_get(&kcm->sk)); in kcm_rcv_ready()
143 if (kcm_queue_rcv_skb(&kcm->sk, psock->ready_rx_msg)) { in kcm_rcv_ready()
145 WARN_ON(!sk_rmem_alloc_get(&kcm->sk)); in kcm_rcv_ready()
162 list_add_tail(&kcm->wait_rx_list, in kcm_rcv_ready()
163 &kcm->mux->kcm_rx_waiters); in kcm_rcv_ready()
164 kcm->rx_wait = true; in kcm_rcv_ready()
170 struct kcm_sock *kcm = kcm_sk(sk); in kcm_rfree() local
171 struct kcm_mux *mux = kcm->mux; in kcm_rfree()
180 if (!kcm->rx_wait && !kcm->rx_psock && in kcm_rfree()
183 kcm_rcv_ready(kcm); in kcm_rfree()
221 struct kcm_sock *kcm; in requeue_rx_msgs() local
233 kcm = list_first_entry(&mux->kcm_rx_waiters, in requeue_rx_msgs()
236 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in requeue_rx_msgs()
238 list_del(&kcm->wait_rx_list); in requeue_rx_msgs()
239 kcm->rx_wait = false; in requeue_rx_msgs()
254 struct kcm_sock *kcm; in reserve_rx_kcm() local
279 kcm = list_first_entry(&mux->kcm_rx_waiters, in reserve_rx_kcm()
281 list_del(&kcm->wait_rx_list); in reserve_rx_kcm()
282 kcm->rx_wait = false; in reserve_rx_kcm()
284 psock->rx_kcm = kcm; in reserve_rx_kcm()
285 kcm->rx_psock = psock; in reserve_rx_kcm()
289 return kcm; in reserve_rx_kcm()
292 static void kcm_done(struct kcm_sock *kcm);
303 struct kcm_sock *kcm = psock->rx_kcm; in unreserve_rx_kcm() local
306 if (!kcm) in unreserve_rx_kcm()
312 kcm->rx_psock = NULL; in unreserve_rx_kcm()
319 if (unlikely(kcm->done)) { in unreserve_rx_kcm()
325 INIT_WORK(&kcm->done_work, kcm_done_work); in unreserve_rx_kcm()
326 schedule_work(&kcm->done_work); in unreserve_rx_kcm()
330 if (unlikely(kcm->rx_disabled)) { in unreserve_rx_kcm()
331 requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); in unreserve_rx_kcm()
332 } else if (rcv_ready || unlikely(!sk_rmem_alloc_get(&kcm->sk))) { in unreserve_rx_kcm()
336 kcm_rcv_ready(kcm); in unreserve_rx_kcm()
359 struct kcm_sock *kcm; in kcm_rcv_strparser() local
362 kcm = reserve_rx_kcm(psock, skb); in kcm_rcv_strparser()
363 if (!kcm) { in kcm_rcv_strparser()
370 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in kcm_rcv_strparser()
410 struct kcm_sock *kcm; in psock_write_space() local
422 kcm = psock->tx_kcm; in psock_write_space()
423 if (kcm && !unlikely(kcm->tx_stopped)) in psock_write_space()
424 queue_work(kcm_wq, &kcm->tx_work); in psock_write_space()
431 static void unreserve_psock(struct kcm_sock *kcm);
434 static struct kcm_psock *reserve_psock(struct kcm_sock *kcm) in reserve_psock() argument
436 struct kcm_mux *mux = kcm->mux; in reserve_psock()
439 psock = kcm->tx_psock; in reserve_psock()
444 WARN_ON(kcm->tx_wait); in reserve_psock()
446 unreserve_psock(kcm); in reserve_psock()
448 return kcm->tx_psock; in reserve_psock()
456 psock = kcm->tx_psock; in reserve_psock()
458 WARN_ON(kcm->tx_wait); in reserve_psock()
460 return kcm->tx_psock; in reserve_psock()
468 if (kcm->tx_wait) { in reserve_psock()
469 list_del(&kcm->wait_psock_list); in reserve_psock()
470 kcm->tx_wait = false; in reserve_psock()
472 kcm->tx_psock = psock; in reserve_psock()
473 psock->tx_kcm = kcm; in reserve_psock()
475 } else if (!kcm->tx_wait) { in reserve_psock()
476 list_add_tail(&kcm->wait_psock_list, in reserve_psock()
478 kcm->tx_wait = true; in reserve_psock()
490 struct kcm_sock *kcm; in psock_now_avail() local
496 kcm = list_first_entry(&mux->kcm_tx_waiters, in psock_now_avail()
499 list_del(&kcm->wait_psock_list); in psock_now_avail()
500 kcm->tx_wait = false; in psock_now_avail()
501 psock->tx_kcm = kcm; in psock_now_avail()
508 kcm->tx_psock = psock; in psock_now_avail()
510 queue_work(kcm_wq, &kcm->tx_work); in psock_now_avail()
515 static void unreserve_psock(struct kcm_sock *kcm) in unreserve_psock() argument
518 struct kcm_mux *mux = kcm->mux; in unreserve_psock()
522 psock = kcm->tx_psock; in unreserve_psock()
533 WARN_ON(kcm->tx_wait); in unreserve_psock()
535 kcm->tx_psock = NULL; in unreserve_psock()
561 static void kcm_report_tx_retry(struct kcm_sock *kcm) in kcm_report_tx_retry() argument
563 struct kcm_mux *mux = kcm->mux; in kcm_report_tx_retry()
573 static int kcm_write_msgs(struct kcm_sock *kcm) in kcm_write_msgs() argument
575 struct sock *sk = &kcm->sk; in kcm_write_msgs()
583 kcm->tx_wait_more = false; in kcm_write_msgs()
584 psock = kcm->tx_psock; in kcm_write_msgs()
589 unreserve_psock(kcm); in kcm_write_msgs()
590 kcm_report_tx_retry(kcm); in kcm_write_msgs()
618 psock = reserve_psock(kcm); in kcm_write_msgs()
671 unreserve_psock(kcm); in kcm_write_msgs()
674 kcm_report_tx_retry(kcm); in kcm_write_msgs()
710 unreserve_psock(kcm); in kcm_write_msgs()
721 struct kcm_sock *kcm = container_of(w, struct kcm_sock, tx_work); in kcm_tx_work() local
722 struct sock *sk = &kcm->sk; in kcm_tx_work()
730 err = kcm_write_msgs(kcm); in kcm_tx_work()
734 report_csk_error(&kcm->sk, -err); in kcm_tx_work()
749 static void kcm_push(struct kcm_sock *kcm) in kcm_push() argument
751 if (kcm->tx_wait_more) in kcm_push()
752 kcm_write_msgs(kcm); in kcm_push()
760 struct kcm_sock *kcm = kcm_sk(sk); in kcm_sendpage() local
781 if (kcm->seq_skb) { in kcm_sendpage()
783 head = kcm->seq_skb; in kcm_sendpage()
798 kcm_push(kcm); in kcm_sendpage()
816 kcm_push(kcm); in kcm_sendpage()
825 kcm_push(kcm); in kcm_sendpage()
857 kcm->seq_skb = NULL; in kcm_sendpage()
858 KCM_STATS_INCR(kcm->stats.tx_msgs); in kcm_sendpage()
861 kcm->tx_wait_more = true; in kcm_sendpage()
862 } else if (kcm->tx_wait_more || not_busy) { in kcm_sendpage()
863 err = kcm_write_msgs(kcm); in kcm_sendpage()
871 report_csk_error(&kcm->sk, -err); in kcm_sendpage()
876 kcm->seq_skb = head; in kcm_sendpage()
880 KCM_STATS_ADD(kcm->stats.tx_bytes, size); in kcm_sendpage()
886 kcm_push(kcm); in kcm_sendpage()
901 struct kcm_sock *kcm = kcm_sk(sk); in kcm_sendmsg() local
917 if (kcm->seq_skb) { in kcm_sendmsg()
919 head = kcm->seq_skb; in kcm_sendmsg()
926 kcm_push(kcm); in kcm_sendmsg()
937 kcm_push(kcm); in kcm_sendmsg()
1015 kcm_push(kcm); in kcm_sendmsg()
1027 kcm->seq_skb = NULL; in kcm_sendmsg()
1028 KCM_STATS_INCR(kcm->stats.tx_msgs); in kcm_sendmsg()
1032 kcm->tx_wait_more = true; in kcm_sendmsg()
1033 } else if (kcm->tx_wait_more || not_busy) { in kcm_sendmsg()
1034 err = kcm_write_msgs(kcm); in kcm_sendmsg()
1042 report_csk_error(&kcm->sk, -err); in kcm_sendmsg()
1049 kcm->seq_skb = head; in kcm_sendmsg()
1054 KCM_STATS_ADD(kcm->stats.tx_bytes, copied); in kcm_sendmsg()
1060 kcm_push(kcm); in kcm_sendmsg()
1069 if (head != kcm->seq_skb) in kcm_sendmsg()
1117 struct kcm_sock *kcm = kcm_sk(sk); in kcm_recvmsg() local
1145 KCM_STATS_ADD(kcm->stats.rx_bytes, copied); in kcm_recvmsg()
1158 KCM_STATS_INCR(kcm->stats.rx_msgs); in kcm_recvmsg()
1175 struct kcm_sock *kcm = kcm_sk(sk); in kcm_splice_read() local
1205 KCM_STATS_ADD(kcm->stats.rx_bytes, copied); in kcm_splice_read()
1227 static void kcm_recv_disable(struct kcm_sock *kcm) in kcm_recv_disable() argument
1229 struct kcm_mux *mux = kcm->mux; in kcm_recv_disable()
1231 if (kcm->rx_disabled) in kcm_recv_disable()
1236 kcm->rx_disabled = 1; in kcm_recv_disable()
1239 if (!kcm->rx_psock) { in kcm_recv_disable()
1240 if (kcm->rx_wait) { in kcm_recv_disable()
1241 list_del(&kcm->wait_rx_list); in kcm_recv_disable()
1242 kcm->rx_wait = false; in kcm_recv_disable()
1245 requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); in kcm_recv_disable()
1252 static void kcm_recv_enable(struct kcm_sock *kcm) in kcm_recv_enable() argument
1254 struct kcm_mux *mux = kcm->mux; in kcm_recv_enable()
1256 if (!kcm->rx_disabled) in kcm_recv_enable()
1261 kcm->rx_disabled = 0; in kcm_recv_enable()
1262 kcm_rcv_ready(kcm); in kcm_recv_enable()
1270 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_setsockopt() local
1287 lock_sock(&kcm->sk); in kcm_setsockopt()
1289 kcm_recv_disable(kcm); in kcm_setsockopt()
1291 kcm_recv_enable(kcm); in kcm_setsockopt()
1292 release_sock(&kcm->sk); in kcm_setsockopt()
1304 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_getsockopt() local
1319 val = kcm->rx_disabled; in kcm_getsockopt()
1332 static void init_kcm_sock(struct kcm_sock *kcm, struct kcm_mux *mux) in init_kcm_sock() argument
1342 kcm->sk.sk_state = TCP_ESTABLISHED; in init_kcm_sock()
1345 kcm->mux = mux; in init_kcm_sock()
1356 list_add(&kcm->kcm_sock_list, head); in init_kcm_sock()
1357 kcm->index = index; in init_kcm_sock()
1362 INIT_WORK(&kcm->tx_work, kcm_tx_work); in init_kcm_sock()
1365 kcm_rcv_ready(kcm); in init_kcm_sock()
1372 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_attach() local
1373 struct kcm_mux *mux = kcm->mux; in kcm_attach()
1601 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_unattach_ioctl() local
1602 struct kcm_mux *mux = kcm->mux; in kcm_unattach_ioctl()
1778 static void kcm_done(struct kcm_sock *kcm) in kcm_done() argument
1780 struct kcm_mux *mux = kcm->mux; in kcm_done()
1781 struct sock *sk = &kcm->sk; in kcm_done()
1785 if (kcm->rx_psock) { in kcm_done()
1787 WARN_ON(kcm->done); in kcm_done()
1788 kcm->rx_disabled = 1; in kcm_done()
1789 kcm->done = 1; in kcm_done()
1794 if (kcm->rx_wait) { in kcm_done()
1795 list_del(&kcm->wait_rx_list); in kcm_done()
1796 kcm->rx_wait = false; in kcm_done()
1809 list_del(&kcm->kcm_sock_list); in kcm_done()
1820 WARN_ON(kcm->rx_wait); in kcm_done()
1822 sock_put(&kcm->sk); in kcm_done()
1831 struct kcm_sock *kcm; in kcm_release() local
1838 kcm = kcm_sk(sk); in kcm_release()
1839 mux = kcm->mux; in kcm_release()
1842 kfree_skb(kcm->seq_skb); in kcm_release()
1855 kcm->tx_stopped = 1; in kcm_release()
1860 if (kcm->tx_wait) { in kcm_release()
1864 list_del(&kcm->wait_psock_list); in kcm_release()
1865 kcm->tx_wait = false; in kcm_release()
1872 cancel_work_sync(&kcm->tx_work); in kcm_release()
1875 psock = kcm->tx_psock; in kcm_release()
1882 unreserve_psock(kcm); in kcm_release()
1886 WARN_ON(kcm->tx_wait); in kcm_release()
1887 WARN_ON(kcm->tx_psock); in kcm_release()
1891 kcm_done(kcm); in kcm_release()