Lines Matching refs:kcm

124 static void kcm_rcv_ready(struct kcm_sock *kcm)  in kcm_rcv_ready()  argument
126 struct kcm_mux *mux = kcm->mux; in kcm_rcv_ready()
130 if (unlikely(kcm->rx_wait || kcm->rx_psock || kcm->rx_disabled)) in kcm_rcv_ready()
134 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in kcm_rcv_ready()
137 WARN_ON(!sk_rmem_alloc_get(&kcm->sk)); in kcm_rcv_ready()
146 if (kcm_queue_rcv_skb(&kcm->sk, psock->ready_rx_msg)) { in kcm_rcv_ready()
148 WARN_ON(!sk_rmem_alloc_get(&kcm->sk)); in kcm_rcv_ready()
165 list_add_tail(&kcm->wait_rx_list, in kcm_rcv_ready()
166 &kcm->mux->kcm_rx_waiters); in kcm_rcv_ready()
167 kcm->rx_wait = true; in kcm_rcv_ready()
173 struct kcm_sock *kcm = kcm_sk(sk); in kcm_rfree() local
174 struct kcm_mux *mux = kcm->mux; in kcm_rfree()
183 if (!kcm->rx_wait && !kcm->rx_psock && in kcm_rfree()
186 kcm_rcv_ready(kcm); in kcm_rfree()
224 struct kcm_sock *kcm; in requeue_rx_msgs() local
236 kcm = list_first_entry(&mux->kcm_rx_waiters, in requeue_rx_msgs()
239 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in requeue_rx_msgs()
241 list_del(&kcm->wait_rx_list); in requeue_rx_msgs()
242 kcm->rx_wait = false; in requeue_rx_msgs()
257 struct kcm_sock *kcm; in reserve_rx_kcm() local
282 kcm = list_first_entry(&mux->kcm_rx_waiters, in reserve_rx_kcm()
284 list_del(&kcm->wait_rx_list); in reserve_rx_kcm()
285 kcm->rx_wait = false; in reserve_rx_kcm()
287 psock->rx_kcm = kcm; in reserve_rx_kcm()
288 kcm->rx_psock = psock; in reserve_rx_kcm()
292 return kcm; in reserve_rx_kcm()
295 static void kcm_done(struct kcm_sock *kcm);
306 struct kcm_sock *kcm = psock->rx_kcm; in unreserve_rx_kcm() local
309 if (!kcm) in unreserve_rx_kcm()
315 kcm->rx_psock = NULL; in unreserve_rx_kcm()
322 if (unlikely(kcm->done)) { in unreserve_rx_kcm()
328 INIT_WORK(&kcm->done_work, kcm_done_work); in unreserve_rx_kcm()
329 schedule_work(&kcm->done_work); in unreserve_rx_kcm()
333 if (unlikely(kcm->rx_disabled)) { in unreserve_rx_kcm()
334 requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); in unreserve_rx_kcm()
335 } else if (rcv_ready || unlikely(!sk_rmem_alloc_get(&kcm->sk))) { in unreserve_rx_kcm()
339 kcm_rcv_ready(kcm); in unreserve_rx_kcm()
362 struct kcm_sock *kcm; in kcm_rcv_strparser() local
365 kcm = reserve_rx_kcm(psock, skb); in kcm_rcv_strparser()
366 if (!kcm) { in kcm_rcv_strparser()
373 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in kcm_rcv_strparser()
411 struct kcm_sock *kcm; in psock_write_space() local
423 kcm = psock->tx_kcm; in psock_write_space()
424 if (kcm && !unlikely(kcm->tx_stopped)) in psock_write_space()
425 queue_work(kcm_wq, &kcm->tx_work); in psock_write_space()
432 static void unreserve_psock(struct kcm_sock *kcm);
435 static struct kcm_psock *reserve_psock(struct kcm_sock *kcm) in reserve_psock() argument
437 struct kcm_mux *mux = kcm->mux; in reserve_psock()
440 psock = kcm->tx_psock; in reserve_psock()
445 WARN_ON(kcm->tx_wait); in reserve_psock()
447 unreserve_psock(kcm); in reserve_psock()
449 return kcm->tx_psock; in reserve_psock()
457 psock = kcm->tx_psock; in reserve_psock()
459 WARN_ON(kcm->tx_wait); in reserve_psock()
461 return kcm->tx_psock; in reserve_psock()
469 if (kcm->tx_wait) { in reserve_psock()
470 list_del(&kcm->wait_psock_list); in reserve_psock()
471 kcm->tx_wait = false; in reserve_psock()
473 kcm->tx_psock = psock; in reserve_psock()
474 psock->tx_kcm = kcm; in reserve_psock()
476 } else if (!kcm->tx_wait) { in reserve_psock()
477 list_add_tail(&kcm->wait_psock_list, in reserve_psock()
479 kcm->tx_wait = true; in reserve_psock()
491 struct kcm_sock *kcm; in psock_now_avail() local
497 kcm = list_first_entry(&mux->kcm_tx_waiters, in psock_now_avail()
500 list_del(&kcm->wait_psock_list); in psock_now_avail()
501 kcm->tx_wait = false; in psock_now_avail()
502 psock->tx_kcm = kcm; in psock_now_avail()
509 kcm->tx_psock = psock; in psock_now_avail()
511 queue_work(kcm_wq, &kcm->tx_work); in psock_now_avail()
516 static void unreserve_psock(struct kcm_sock *kcm) in unreserve_psock() argument
519 struct kcm_mux *mux = kcm->mux; in unreserve_psock()
523 psock = kcm->tx_psock; in unreserve_psock()
534 WARN_ON(kcm->tx_wait); in unreserve_psock()
536 kcm->tx_psock = NULL; in unreserve_psock()
562 static void kcm_report_tx_retry(struct kcm_sock *kcm) in kcm_report_tx_retry() argument
564 struct kcm_mux *mux = kcm->mux; in kcm_report_tx_retry()
574 static int kcm_write_msgs(struct kcm_sock *kcm) in kcm_write_msgs() argument
576 struct sock *sk = &kcm->sk; in kcm_write_msgs()
584 kcm->tx_wait_more = false; in kcm_write_msgs()
585 psock = kcm->tx_psock; in kcm_write_msgs()
590 unreserve_psock(kcm); in kcm_write_msgs()
591 kcm_report_tx_retry(kcm); in kcm_write_msgs()
619 psock = reserve_psock(kcm); in kcm_write_msgs()
672 unreserve_psock(kcm); in kcm_write_msgs()
675 kcm_report_tx_retry(kcm); in kcm_write_msgs()
711 unreserve_psock(kcm); in kcm_write_msgs()
722 struct kcm_sock *kcm = container_of(w, struct kcm_sock, tx_work); in kcm_tx_work() local
723 struct sock *sk = &kcm->sk; in kcm_tx_work()
731 err = kcm_write_msgs(kcm); in kcm_tx_work()
735 report_csk_error(&kcm->sk, -err); in kcm_tx_work()
750 static void kcm_push(struct kcm_sock *kcm) in kcm_push() argument
752 if (kcm->tx_wait_more) in kcm_push()
753 kcm_write_msgs(kcm); in kcm_push()
761 struct kcm_sock *kcm = kcm_sk(sk); in kcm_sendpage() local
782 if (kcm->seq_skb) { in kcm_sendpage()
784 head = kcm->seq_skb; in kcm_sendpage()
799 kcm_push(kcm); in kcm_sendpage()
817 kcm_push(kcm); in kcm_sendpage()
826 kcm_push(kcm); in kcm_sendpage()
858 kcm->seq_skb = NULL; in kcm_sendpage()
859 KCM_STATS_INCR(kcm->stats.tx_msgs); in kcm_sendpage()
862 kcm->tx_wait_more = true; in kcm_sendpage()
863 } else if (kcm->tx_wait_more || not_busy) { in kcm_sendpage()
864 err = kcm_write_msgs(kcm); in kcm_sendpage()
872 report_csk_error(&kcm->sk, -err); in kcm_sendpage()
877 kcm->seq_skb = head; in kcm_sendpage()
881 KCM_STATS_ADD(kcm->stats.tx_bytes, size); in kcm_sendpage()
887 kcm_push(kcm); in kcm_sendpage()
902 struct kcm_sock *kcm = kcm_sk(sk); in kcm_sendmsg() local
918 if (kcm->seq_skb) { in kcm_sendmsg()
920 head = kcm->seq_skb; in kcm_sendmsg()
927 kcm_push(kcm); in kcm_sendmsg()
938 kcm_push(kcm); in kcm_sendmsg()
1016 kcm_push(kcm); in kcm_sendmsg()
1028 kcm->seq_skb = NULL; in kcm_sendmsg()
1029 KCM_STATS_INCR(kcm->stats.tx_msgs); in kcm_sendmsg()
1033 kcm->tx_wait_more = true; in kcm_sendmsg()
1034 } else if (kcm->tx_wait_more || not_busy) { in kcm_sendmsg()
1035 err = kcm_write_msgs(kcm); in kcm_sendmsg()
1043 report_csk_error(&kcm->sk, -err); in kcm_sendmsg()
1050 kcm->seq_skb = head; in kcm_sendmsg()
1055 KCM_STATS_ADD(kcm->stats.tx_bytes, copied); in kcm_sendmsg()
1061 kcm_push(kcm); in kcm_sendmsg()
1070 if (head != kcm->seq_skb) in kcm_sendmsg()
1118 struct kcm_sock *kcm = kcm_sk(sk); in kcm_recvmsg() local
1146 KCM_STATS_ADD(kcm->stats.rx_bytes, copied); in kcm_recvmsg()
1159 KCM_STATS_INCR(kcm->stats.rx_msgs); in kcm_recvmsg()
1176 struct kcm_sock *kcm = kcm_sk(sk); in kcm_splice_read() local
1206 KCM_STATS_ADD(kcm->stats.rx_bytes, copied); in kcm_splice_read()
1228 static void kcm_recv_disable(struct kcm_sock *kcm) in kcm_recv_disable() argument
1230 struct kcm_mux *mux = kcm->mux; in kcm_recv_disable()
1232 if (kcm->rx_disabled) in kcm_recv_disable()
1237 kcm->rx_disabled = 1; in kcm_recv_disable()
1240 if (!kcm->rx_psock) { in kcm_recv_disable()
1241 if (kcm->rx_wait) { in kcm_recv_disable()
1242 list_del(&kcm->wait_rx_list); in kcm_recv_disable()
1243 kcm->rx_wait = false; in kcm_recv_disable()
1246 requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); in kcm_recv_disable()
1253 static void kcm_recv_enable(struct kcm_sock *kcm) in kcm_recv_enable() argument
1255 struct kcm_mux *mux = kcm->mux; in kcm_recv_enable()
1257 if (!kcm->rx_disabled) in kcm_recv_enable()
1262 kcm->rx_disabled = 0; in kcm_recv_enable()
1263 kcm_rcv_ready(kcm); in kcm_recv_enable()
1271 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_setsockopt() local
1288 lock_sock(&kcm->sk); in kcm_setsockopt()
1290 kcm_recv_disable(kcm); in kcm_setsockopt()
1292 kcm_recv_enable(kcm); in kcm_setsockopt()
1293 release_sock(&kcm->sk); in kcm_setsockopt()
1305 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_getsockopt() local
1320 val = kcm->rx_disabled; in kcm_getsockopt()
1333 static void init_kcm_sock(struct kcm_sock *kcm, struct kcm_mux *mux) in init_kcm_sock() argument
1343 kcm->sk.sk_state = TCP_ESTABLISHED; in init_kcm_sock()
1346 kcm->mux = mux; in init_kcm_sock()
1357 list_add(&kcm->kcm_sock_list, head); in init_kcm_sock()
1358 kcm->index = index; in init_kcm_sock()
1363 INIT_WORK(&kcm->tx_work, kcm_tx_work); in init_kcm_sock()
1366 kcm_rcv_ready(kcm); in init_kcm_sock()
1373 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_attach() local
1374 struct kcm_mux *mux = kcm->mux; in kcm_attach()
1602 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_unattach_ioctl() local
1603 struct kcm_mux *mux = kcm->mux; in kcm_unattach_ioctl()
1779 static void kcm_done(struct kcm_sock *kcm) in kcm_done() argument
1781 struct kcm_mux *mux = kcm->mux; in kcm_done()
1782 struct sock *sk = &kcm->sk; in kcm_done()
1786 if (kcm->rx_psock) { in kcm_done()
1788 WARN_ON(kcm->done); in kcm_done()
1789 kcm->rx_disabled = 1; in kcm_done()
1790 kcm->done = 1; in kcm_done()
1795 if (kcm->rx_wait) { in kcm_done()
1796 list_del(&kcm->wait_rx_list); in kcm_done()
1797 kcm->rx_wait = false; in kcm_done()
1810 list_del(&kcm->kcm_sock_list); in kcm_done()
1821 WARN_ON(kcm->rx_wait); in kcm_done()
1823 sock_put(&kcm->sk); in kcm_done()
1832 struct kcm_sock *kcm; in kcm_release() local
1839 kcm = kcm_sk(sk); in kcm_release()
1840 mux = kcm->mux; in kcm_release()
1843 kfree_skb(kcm->seq_skb); in kcm_release()
1856 kcm->tx_stopped = 1; in kcm_release()
1861 if (kcm->tx_wait) { in kcm_release()
1865 list_del(&kcm->wait_psock_list); in kcm_release()
1866 kcm->tx_wait = false; in kcm_release()
1873 cancel_work_sync(&kcm->tx_work); in kcm_release()
1876 psock = kcm->tx_psock; in kcm_release()
1883 unreserve_psock(kcm); in kcm_release()
1887 WARN_ON(kcm->tx_wait); in kcm_release()
1888 WARN_ON(kcm->tx_psock); in kcm_release()
1892 kcm_done(kcm); in kcm_release()