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()
165 WRITE_ONCE(kcm->rx_wait, true); in kcm_rcv_ready()
171 struct kcm_sock *kcm = kcm_sk(sk); in kcm_rfree() local
172 struct kcm_mux *mux = kcm->mux; in kcm_rfree()
181 if (!READ_ONCE(kcm->rx_wait) && !READ_ONCE(kcm->rx_psock) && in kcm_rfree()
184 kcm_rcv_ready(kcm); in kcm_rfree()
222 struct kcm_sock *kcm; in requeue_rx_msgs() local
234 kcm = list_first_entry(&mux->kcm_rx_waiters, in requeue_rx_msgs()
237 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in requeue_rx_msgs()
239 list_del(&kcm->wait_rx_list); in requeue_rx_msgs()
241 WRITE_ONCE(kcm->rx_wait, false); in requeue_rx_msgs()
256 struct kcm_sock *kcm; in reserve_rx_kcm() local
281 kcm = list_first_entry(&mux->kcm_rx_waiters, in reserve_rx_kcm()
283 list_del(&kcm->wait_rx_list); in reserve_rx_kcm()
285 WRITE_ONCE(kcm->rx_wait, false); in reserve_rx_kcm()
287 psock->rx_kcm = kcm; in reserve_rx_kcm()
289 WRITE_ONCE(kcm->rx_psock, psock); in reserve_rx_kcm()
293 return kcm; in reserve_rx_kcm()
296 static void kcm_done(struct kcm_sock *kcm);
307 struct kcm_sock *kcm = psock->rx_kcm; in unreserve_rx_kcm() local
310 if (!kcm) in unreserve_rx_kcm()
317 WRITE_ONCE(kcm->rx_psock, NULL); in unreserve_rx_kcm()
324 if (unlikely(kcm->done)) { in unreserve_rx_kcm()
330 INIT_WORK(&kcm->done_work, kcm_done_work); in unreserve_rx_kcm()
331 schedule_work(&kcm->done_work); in unreserve_rx_kcm()
335 if (unlikely(kcm->rx_disabled)) { in unreserve_rx_kcm()
336 requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); in unreserve_rx_kcm()
337 } else if (rcv_ready || unlikely(!sk_rmem_alloc_get(&kcm->sk))) { in unreserve_rx_kcm()
341 kcm_rcv_ready(kcm); in unreserve_rx_kcm()
364 struct kcm_sock *kcm; in kcm_rcv_strparser() local
367 kcm = reserve_rx_kcm(psock, skb); in kcm_rcv_strparser()
368 if (!kcm) { in kcm_rcv_strparser()
375 if (kcm_queue_rcv_skb(&kcm->sk, skb)) { in kcm_rcv_strparser()
415 struct kcm_sock *kcm; in psock_write_space() local
427 kcm = psock->tx_kcm; in psock_write_space()
428 if (kcm && !unlikely(kcm->tx_stopped)) in psock_write_space()
429 queue_work(kcm_wq, &kcm->tx_work); in psock_write_space()
436 static void unreserve_psock(struct kcm_sock *kcm);
439 static struct kcm_psock *reserve_psock(struct kcm_sock *kcm) in reserve_psock() argument
441 struct kcm_mux *mux = kcm->mux; in reserve_psock()
444 psock = kcm->tx_psock; in reserve_psock()
449 WARN_ON(kcm->tx_wait); in reserve_psock()
451 unreserve_psock(kcm); in reserve_psock()
453 return kcm->tx_psock; in reserve_psock()
461 psock = kcm->tx_psock; in reserve_psock()
463 WARN_ON(kcm->tx_wait); in reserve_psock()
465 return kcm->tx_psock; in reserve_psock()
473 if (kcm->tx_wait) { in reserve_psock()
474 list_del(&kcm->wait_psock_list); in reserve_psock()
475 kcm->tx_wait = false; in reserve_psock()
477 kcm->tx_psock = psock; in reserve_psock()
478 psock->tx_kcm = kcm; in reserve_psock()
480 } else if (!kcm->tx_wait) { in reserve_psock()
481 list_add_tail(&kcm->wait_psock_list, in reserve_psock()
483 kcm->tx_wait = true; in reserve_psock()
495 struct kcm_sock *kcm; in psock_now_avail() local
501 kcm = list_first_entry(&mux->kcm_tx_waiters, in psock_now_avail()
504 list_del(&kcm->wait_psock_list); in psock_now_avail()
505 kcm->tx_wait = false; in psock_now_avail()
506 psock->tx_kcm = kcm; in psock_now_avail()
513 kcm->tx_psock = psock; in psock_now_avail()
515 queue_work(kcm_wq, &kcm->tx_work); in psock_now_avail()
520 static void unreserve_psock(struct kcm_sock *kcm) in unreserve_psock() argument
523 struct kcm_mux *mux = kcm->mux; in unreserve_psock()
527 psock = kcm->tx_psock; in unreserve_psock()
538 WARN_ON(kcm->tx_wait); in unreserve_psock()
540 kcm->tx_psock = NULL; in unreserve_psock()
566 static void kcm_report_tx_retry(struct kcm_sock *kcm) in kcm_report_tx_retry() argument
568 struct kcm_mux *mux = kcm->mux; in kcm_report_tx_retry()
578 static int kcm_write_msgs(struct kcm_sock *kcm) in kcm_write_msgs() argument
580 struct sock *sk = &kcm->sk; in kcm_write_msgs()
588 kcm->tx_wait_more = false; in kcm_write_msgs()
589 psock = kcm->tx_psock; in kcm_write_msgs()
594 unreserve_psock(kcm); in kcm_write_msgs()
595 kcm_report_tx_retry(kcm); in kcm_write_msgs()
623 psock = reserve_psock(kcm); in kcm_write_msgs()
676 unreserve_psock(kcm); in kcm_write_msgs()
679 kcm_report_tx_retry(kcm); in kcm_write_msgs()
715 unreserve_psock(kcm); in kcm_write_msgs()
726 struct kcm_sock *kcm = container_of(w, struct kcm_sock, tx_work); in kcm_tx_work() local
727 struct sock *sk = &kcm->sk; in kcm_tx_work()
735 err = kcm_write_msgs(kcm); in kcm_tx_work()
739 report_csk_error(&kcm->sk, -err); in kcm_tx_work()
754 static void kcm_push(struct kcm_sock *kcm) in kcm_push() argument
756 if (kcm->tx_wait_more) in kcm_push()
757 kcm_write_msgs(kcm); in kcm_push()
765 struct kcm_sock *kcm = kcm_sk(sk); in kcm_sendpage() local
786 if (kcm->seq_skb) { in kcm_sendpage()
788 head = kcm->seq_skb; in kcm_sendpage()
803 kcm_push(kcm); in kcm_sendpage()
821 kcm_push(kcm); in kcm_sendpage()
830 kcm_push(kcm); in kcm_sendpage()
862 kcm->seq_skb = NULL; in kcm_sendpage()
863 KCM_STATS_INCR(kcm->stats.tx_msgs); in kcm_sendpage()
866 kcm->tx_wait_more = true; in kcm_sendpage()
867 } else if (kcm->tx_wait_more || not_busy) { in kcm_sendpage()
868 err = kcm_write_msgs(kcm); in kcm_sendpage()
876 report_csk_error(&kcm->sk, -err); in kcm_sendpage()
881 kcm->seq_skb = head; in kcm_sendpage()
885 KCM_STATS_ADD(kcm->stats.tx_bytes, size); in kcm_sendpage()
891 kcm_push(kcm); in kcm_sendpage()
906 struct kcm_sock *kcm = kcm_sk(sk); in kcm_sendmsg() local
922 if (kcm->seq_skb) { in kcm_sendmsg()
924 head = kcm->seq_skb; in kcm_sendmsg()
931 kcm_push(kcm); in kcm_sendmsg()
942 kcm_push(kcm); in kcm_sendmsg()
1020 kcm_push(kcm); in kcm_sendmsg()
1032 kcm->seq_skb = NULL; in kcm_sendmsg()
1033 KCM_STATS_INCR(kcm->stats.tx_msgs); in kcm_sendmsg()
1037 kcm->tx_wait_more = true; in kcm_sendmsg()
1038 } else if (kcm->tx_wait_more || not_busy) { in kcm_sendmsg()
1039 err = kcm_write_msgs(kcm); in kcm_sendmsg()
1047 report_csk_error(&kcm->sk, -err); in kcm_sendmsg()
1054 kcm->seq_skb = head; in kcm_sendmsg()
1059 KCM_STATS_ADD(kcm->stats.tx_bytes, copied); in kcm_sendmsg()
1065 kcm_push(kcm); in kcm_sendmsg()
1074 if (head != kcm->seq_skb) in kcm_sendmsg()
1092 struct kcm_sock *kcm = kcm_sk(sk); in kcm_recvmsg() local
1115 KCM_STATS_ADD(kcm->stats.rx_bytes, copied); in kcm_recvmsg()
1128 KCM_STATS_INCR(kcm->stats.rx_msgs); in kcm_recvmsg()
1143 struct kcm_sock *kcm = kcm_sk(sk); in kcm_splice_read() local
1168 KCM_STATS_ADD(kcm->stats.rx_bytes, copied); in kcm_splice_read()
1188 static void kcm_recv_disable(struct kcm_sock *kcm) in kcm_recv_disable() argument
1190 struct kcm_mux *mux = kcm->mux; in kcm_recv_disable()
1192 if (kcm->rx_disabled) in kcm_recv_disable()
1197 kcm->rx_disabled = 1; in kcm_recv_disable()
1200 if (!kcm->rx_psock) { in kcm_recv_disable()
1201 if (kcm->rx_wait) { in kcm_recv_disable()
1202 list_del(&kcm->wait_rx_list); in kcm_recv_disable()
1204 WRITE_ONCE(kcm->rx_wait, false); in kcm_recv_disable()
1207 requeue_rx_msgs(mux, &kcm->sk.sk_receive_queue); in kcm_recv_disable()
1214 static void kcm_recv_enable(struct kcm_sock *kcm) in kcm_recv_enable() argument
1216 struct kcm_mux *mux = kcm->mux; in kcm_recv_enable()
1218 if (!kcm->rx_disabled) in kcm_recv_enable()
1223 kcm->rx_disabled = 0; in kcm_recv_enable()
1224 kcm_rcv_ready(kcm); in kcm_recv_enable()
1232 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_setsockopt() local
1249 lock_sock(&kcm->sk); in kcm_setsockopt()
1251 kcm_recv_disable(kcm); in kcm_setsockopt()
1253 kcm_recv_enable(kcm); in kcm_setsockopt()
1254 release_sock(&kcm->sk); in kcm_setsockopt()
1266 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_getsockopt() local
1281 val = kcm->rx_disabled; in kcm_getsockopt()
1294 static void init_kcm_sock(struct kcm_sock *kcm, struct kcm_mux *mux) in init_kcm_sock() argument
1304 kcm->sk.sk_state = TCP_ESTABLISHED; in init_kcm_sock()
1307 kcm->mux = mux; in init_kcm_sock()
1318 list_add(&kcm->kcm_sock_list, head); in init_kcm_sock()
1319 kcm->index = index; in init_kcm_sock()
1324 INIT_WORK(&kcm->tx_work, kcm_tx_work); in init_kcm_sock()
1327 kcm_rcv_ready(kcm); in init_kcm_sock()
1334 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_attach() local
1335 struct kcm_mux *mux = kcm->mux; in kcm_attach()
1562 struct kcm_sock *kcm = kcm_sk(sock->sk); in kcm_unattach_ioctl() local
1563 struct kcm_mux *mux = kcm->mux; in kcm_unattach_ioctl()
1739 static void kcm_done(struct kcm_sock *kcm) in kcm_done() argument
1741 struct kcm_mux *mux = kcm->mux; in kcm_done()
1742 struct sock *sk = &kcm->sk; in kcm_done()
1746 if (kcm->rx_psock) { in kcm_done()
1748 WARN_ON(kcm->done); in kcm_done()
1749 kcm->rx_disabled = 1; in kcm_done()
1750 kcm->done = 1; in kcm_done()
1755 if (kcm->rx_wait) { in kcm_done()
1756 list_del(&kcm->wait_rx_list); in kcm_done()
1758 WRITE_ONCE(kcm->rx_wait, false); in kcm_done()
1771 list_del(&kcm->kcm_sock_list); in kcm_done()
1782 WARN_ON(kcm->rx_wait); in kcm_done()
1784 sock_put(&kcm->sk); in kcm_done()
1793 struct kcm_sock *kcm; in kcm_release() local
1800 kcm = kcm_sk(sk); in kcm_release()
1801 mux = kcm->mux; in kcm_release()
1805 kfree_skb(kcm->seq_skb); in kcm_release()
1817 kcm->tx_stopped = 1; in kcm_release()
1822 if (kcm->tx_wait) { in kcm_release()
1826 list_del(&kcm->wait_psock_list); in kcm_release()
1827 kcm->tx_wait = false; in kcm_release()
1834 cancel_work_sync(&kcm->tx_work); in kcm_release()
1837 psock = kcm->tx_psock; in kcm_release()
1844 unreserve_psock(kcm); in kcm_release()
1848 WARN_ON(kcm->tx_wait); in kcm_release()
1849 WARN_ON(kcm->tx_psock); in kcm_release()
1853 kcm_done(kcm); in kcm_release()