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 --- |