xprtsock.c (7496b59f588dd52886fdbac7633608097543a0a5) xprtsock.c (2790a624d43084de590884934969e19c7a82316a)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/net/sunrpc/xprtsock.c
4 *
5 * Client-side transport implementation for sockets.
6 *
7 * TCP callback races fixes (C) 1998 Red Hat
8 * TCP send fixes (C) 1998 Red Hat

--- 766 unchanged lines hidden (view full) ---

775
776 trace_rpc_socket_nospace(req, transport);
777
778 /* Protect against races with write_space */
779 spin_lock(&xprt->transport_lock);
780
781 /* Don't race with disconnect */
782 if (xprt_connected(xprt)) {
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/net/sunrpc/xprtsock.c
4 *
5 * Client-side transport implementation for sockets.
6 *
7 * TCP callback races fixes (C) 1998 Red Hat
8 * TCP send fixes (C) 1998 Red Hat

--- 766 unchanged lines hidden (view full) ---

775
776 trace_rpc_socket_nospace(req, transport);
777
778 /* Protect against races with write_space */
779 spin_lock(&xprt->transport_lock);
780
781 /* Don't race with disconnect */
782 if (xprt_connected(xprt)) {
783 struct socket_wq *wq;
784
785 rcu_read_lock();
786 wq = rcu_dereference(sk->sk_wq);
787 set_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags);
788 rcu_read_unlock();
789
790 /* wait for more buffer space */
783 /* wait for more buffer space */
784 set_bit(XPRT_SOCK_NOSPACE, &transport->sock_state);
791 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
792 sk->sk_write_pending++;
793 xprt_wait_for_buffer_space(xprt);
794 } else
795 ret = -ENOTCONN;
796
797 spin_unlock(&xprt->transport_lock);
798 return ret;

--- 347 unchanged lines hidden (view full) ---

1146static void xs_sock_reset_state_flags(struct rpc_xprt *xprt)
1147{
1148 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
1149
1150 clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
1151 clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state);
1152 clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state);
1153 clear_bit(XPRT_SOCK_WAKE_DISCONNECT, &transport->sock_state);
785 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
786 sk->sk_write_pending++;
787 xprt_wait_for_buffer_space(xprt);
788 } else
789 ret = -ENOTCONN;
790
791 spin_unlock(&xprt->transport_lock);
792 return ret;

--- 347 unchanged lines hidden (view full) ---

1140static void xs_sock_reset_state_flags(struct rpc_xprt *xprt)
1141{
1142 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
1143
1144 clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
1145 clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state);
1146 clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state);
1147 clear_bit(XPRT_SOCK_WAKE_DISCONNECT, &transport->sock_state);
1148 clear_bit(XPRT_SOCK_NOSPACE, &transport->sock_state);
1154}
1155
1156static void xs_run_error_worker(struct sock_xprt *transport, unsigned int nr)
1157{
1158 set_bit(nr, &transport->sock_state);
1159 queue_work(xprtiod_workqueue, &transport->error_worker);
1160}
1161

--- 330 unchanged lines hidden (view full) ---

1492 clear_bit(XPRT_CLOSING, &xprt->state);
1493 /* Trigger the socket release */
1494 xs_run_error_worker(transport, XPRT_SOCK_WAKE_DISCONNECT);
1495 }
1496}
1497
1498static void xs_write_space(struct sock *sk)
1499{
1149}
1150
1151static void xs_run_error_worker(struct sock_xprt *transport, unsigned int nr)
1152{
1153 set_bit(nr, &transport->sock_state);
1154 queue_work(xprtiod_workqueue, &transport->error_worker);
1155}
1156

--- 330 unchanged lines hidden (view full) ---

1487 clear_bit(XPRT_CLOSING, &xprt->state);
1488 /* Trigger the socket release */
1489 xs_run_error_worker(transport, XPRT_SOCK_WAKE_DISCONNECT);
1490 }
1491}
1492
1493static void xs_write_space(struct sock *sk)
1494{
1500 struct socket_wq *wq;
1501 struct sock_xprt *transport;
1502 struct rpc_xprt *xprt;
1503
1504 if (!sk->sk_socket)
1505 return;
1506 clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
1507
1508 if (unlikely(!(xprt = xprt_from_sock(sk))))
1509 return;
1510 transport = container_of(xprt, struct sock_xprt, xprt);
1495 struct sock_xprt *transport;
1496 struct rpc_xprt *xprt;
1497
1498 if (!sk->sk_socket)
1499 return;
1500 clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
1501
1502 if (unlikely(!(xprt = xprt_from_sock(sk))))
1503 return;
1504 transport = container_of(xprt, struct sock_xprt, xprt);
1511 rcu_read_lock();
1512 wq = rcu_dereference(sk->sk_wq);
1513 if (!wq || test_and_clear_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags) == 0)
1514 goto out;
1515
1505 if (!test_and_clear_bit(XPRT_SOCK_NOSPACE, &transport->sock_state))
1506 return;
1516 xs_run_error_worker(transport, XPRT_SOCK_WAKE_WRITE);
1517 sk->sk_write_pending--;
1507 xs_run_error_worker(transport, XPRT_SOCK_WAKE_WRITE);
1508 sk->sk_write_pending--;
1518out:
1519 rcu_read_unlock();
1520}
1521
1522/**
1523 * xs_udp_write_space - callback invoked when socket buffer space
1524 * becomes available
1525 * @sk: socket whose state has changed
1526 *
1527 * Called when more output buffer space is available for this socket.

--- 324 unchanged lines hidden (view full) ---

1852
1853 lock_sock(sk);
1854
1855 xs_save_old_callbacks(transport, sk);
1856
1857 sk->sk_user_data = xprt;
1858 sk->sk_data_ready = xs_data_ready;
1859 sk->sk_write_space = xs_udp_write_space;
1509}
1510
1511/**
1512 * xs_udp_write_space - callback invoked when socket buffer space
1513 * becomes available
1514 * @sk: socket whose state has changed
1515 *
1516 * Called when more output buffer space is available for this socket.

--- 324 unchanged lines hidden (view full) ---

1841
1842 lock_sock(sk);
1843
1844 xs_save_old_callbacks(transport, sk);
1845
1846 sk->sk_user_data = xprt;
1847 sk->sk_data_ready = xs_data_ready;
1848 sk->sk_write_space = xs_udp_write_space;
1860 sock_set_flag(sk, SOCK_FASYNC);
1861 sk->sk_error_report = xs_error_report;
1862
1863 xprt_clear_connected(xprt);
1864
1865 /* Reset to new socket */
1866 transport->sock = sock;
1867 transport->inet = sk;
1868

--- 177 unchanged lines hidden (view full) ---

2046
2047 lock_sock(sk);
2048
2049 xs_save_old_callbacks(transport, sk);
2050
2051 sk->sk_user_data = xprt;
2052 sk->sk_data_ready = xs_data_ready;
2053 sk->sk_write_space = xs_udp_write_space;
1849 sk->sk_error_report = xs_error_report;
1850
1851 xprt_clear_connected(xprt);
1852
1853 /* Reset to new socket */
1854 transport->sock = sock;
1855 transport->inet = sk;
1856

--- 177 unchanged lines hidden (view full) ---

2034
2035 lock_sock(sk);
2036
2037 xs_save_old_callbacks(transport, sk);
2038
2039 sk->sk_user_data = xprt;
2040 sk->sk_data_ready = xs_data_ready;
2041 sk->sk_write_space = xs_udp_write_space;
2054 sock_set_flag(sk, SOCK_FASYNC);
2055
2056 xprt_set_connected(xprt);
2057
2058 /* Reset to new socket */
2059 transport->sock = sock;
2060 transport->inet = sk;
2061
2062 xs_set_memalloc(xprt);

--- 150 unchanged lines hidden (view full) ---

2213 lock_sock(sk);
2214
2215 xs_save_old_callbacks(transport, sk);
2216
2217 sk->sk_user_data = xprt;
2218 sk->sk_data_ready = xs_data_ready;
2219 sk->sk_state_change = xs_tcp_state_change;
2220 sk->sk_write_space = xs_tcp_write_space;
2042
2043 xprt_set_connected(xprt);
2044
2045 /* Reset to new socket */
2046 transport->sock = sock;
2047 transport->inet = sk;
2048
2049 xs_set_memalloc(xprt);

--- 150 unchanged lines hidden (view full) ---

2200 lock_sock(sk);
2201
2202 xs_save_old_callbacks(transport, sk);
2203
2204 sk->sk_user_data = xprt;
2205 sk->sk_data_ready = xs_data_ready;
2206 sk->sk_state_change = xs_tcp_state_change;
2207 sk->sk_write_space = xs_tcp_write_space;
2221 sock_set_flag(sk, SOCK_FASYNC);
2222 sk->sk_error_report = xs_error_report;
2223
2224 /* socket options */
2225 sock_reset_flag(sk, SOCK_LINGER);
2226
2227 xprt_clear_connected(xprt);
2228
2229 /* Reset to new socket */

--- 994 unchanged lines hidden ---
2208 sk->sk_error_report = xs_error_report;
2209
2210 /* socket options */
2211 sock_reset_flag(sk, SOCK_LINGER);
2212
2213 xprt_clear_connected(xprt);
2214
2215 /* Reset to new socket */

--- 994 unchanged lines hidden ---