diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-05-02 11:21:08 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-07-06 14:54:48 -0400 |
commit | b5e924191f87239e555f3ef3b8d8e697bb95e7dc (patch) | |
tree | 1e7a2207cc4b5c6f794dba99d2618e0803d1a31f /net/sunrpc/xprtsock.c | |
parent | 4f8943f8088348ec01456b075d44ad19dce3d698 (diff) |
SUNRPC: Remove the bh-safe lock requirement on xprt->transport_lock
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r-- | net/sunrpc/xprtsock.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 92af57019b96..97c15d47f343 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -880,7 +880,7 @@ static int xs_nospace(struct rpc_rqst *req) | |||
880 | req->rq_slen); | 880 | req->rq_slen); |
881 | 881 | ||
882 | /* Protect against races with write_space */ | 882 | /* Protect against races with write_space */ |
883 | spin_lock_bh(&xprt->transport_lock); | 883 | spin_lock(&xprt->transport_lock); |
884 | 884 | ||
885 | /* Don't race with disconnect */ | 885 | /* Don't race with disconnect */ |
886 | if (xprt_connected(xprt)) { | 886 | if (xprt_connected(xprt)) { |
@@ -890,7 +890,7 @@ static int xs_nospace(struct rpc_rqst *req) | |||
890 | } else | 890 | } else |
891 | ret = -ENOTCONN; | 891 | ret = -ENOTCONN; |
892 | 892 | ||
893 | spin_unlock_bh(&xprt->transport_lock); | 893 | spin_unlock(&xprt->transport_lock); |
894 | 894 | ||
895 | /* Race breaker in case memory is freed before above code is called */ | 895 | /* Race breaker in case memory is freed before above code is called */ |
896 | if (ret == -EAGAIN) { | 896 | if (ret == -EAGAIN) { |
@@ -1344,6 +1344,7 @@ static void xs_destroy(struct rpc_xprt *xprt) | |||
1344 | cancel_delayed_work_sync(&transport->connect_worker); | 1344 | cancel_delayed_work_sync(&transport->connect_worker); |
1345 | xs_close(xprt); | 1345 | xs_close(xprt); |
1346 | cancel_work_sync(&transport->recv_worker); | 1346 | cancel_work_sync(&transport->recv_worker); |
1347 | cancel_work_sync(&transport->error_worker); | ||
1347 | xs_xprt_free(xprt); | 1348 | xs_xprt_free(xprt); |
1348 | module_put(THIS_MODULE); | 1349 | module_put(THIS_MODULE); |
1349 | } | 1350 | } |
@@ -1397,9 +1398,9 @@ static void xs_udp_data_read_skb(struct rpc_xprt *xprt, | |||
1397 | } | 1398 | } |
1398 | 1399 | ||
1399 | 1400 | ||
1400 | spin_lock_bh(&xprt->transport_lock); | 1401 | spin_lock(&xprt->transport_lock); |
1401 | xprt_adjust_cwnd(xprt, task, copied); | 1402 | xprt_adjust_cwnd(xprt, task, copied); |
1402 | spin_unlock_bh(&xprt->transport_lock); | 1403 | spin_unlock(&xprt->transport_lock); |
1403 | spin_lock(&xprt->queue_lock); | 1404 | spin_lock(&xprt->queue_lock); |
1404 | xprt_complete_rqst(task, copied); | 1405 | xprt_complete_rqst(task, copied); |
1405 | __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS); | 1406 | __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS); |
@@ -1509,7 +1510,6 @@ static void xs_tcp_state_change(struct sock *sk) | |||
1509 | trace_rpc_socket_state_change(xprt, sk->sk_socket); | 1510 | trace_rpc_socket_state_change(xprt, sk->sk_socket); |
1510 | switch (sk->sk_state) { | 1511 | switch (sk->sk_state) { |
1511 | case TCP_ESTABLISHED: | 1512 | case TCP_ESTABLISHED: |
1512 | spin_lock(&xprt->transport_lock); | ||
1513 | if (!xprt_test_and_set_connected(xprt)) { | 1513 | if (!xprt_test_and_set_connected(xprt)) { |
1514 | xprt->connect_cookie++; | 1514 | xprt->connect_cookie++; |
1515 | clear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state); | 1515 | clear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state); |
@@ -1520,7 +1520,6 @@ static void xs_tcp_state_change(struct sock *sk) | |||
1520 | xprt->stat.connect_start; | 1520 | xprt->stat.connect_start; |
1521 | xs_run_error_worker(transport, XPRT_SOCK_WAKE_PENDING); | 1521 | xs_run_error_worker(transport, XPRT_SOCK_WAKE_PENDING); |
1522 | } | 1522 | } |
1523 | spin_unlock(&xprt->transport_lock); | ||
1524 | break; | 1523 | break; |
1525 | case TCP_FIN_WAIT1: | 1524 | case TCP_FIN_WAIT1: |
1526 | /* The client initiated a shutdown of the socket */ | 1525 | /* The client initiated a shutdown of the socket */ |
@@ -1677,9 +1676,9 @@ static void xs_udp_set_buffer_size(struct rpc_xprt *xprt, size_t sndsize, size_t | |||
1677 | */ | 1676 | */ |
1678 | static void xs_udp_timer(struct rpc_xprt *xprt, struct rpc_task *task) | 1677 | static void xs_udp_timer(struct rpc_xprt *xprt, struct rpc_task *task) |
1679 | { | 1678 | { |
1680 | spin_lock_bh(&xprt->transport_lock); | 1679 | spin_lock(&xprt->transport_lock); |
1681 | xprt_adjust_cwnd(xprt, task, -ETIMEDOUT); | 1680 | xprt_adjust_cwnd(xprt, task, -ETIMEDOUT); |
1682 | spin_unlock_bh(&xprt->transport_lock); | 1681 | spin_unlock(&xprt->transport_lock); |
1683 | } | 1682 | } |
1684 | 1683 | ||
1685 | static int xs_get_random_port(void) | 1684 | static int xs_get_random_port(void) |
@@ -2214,13 +2213,13 @@ static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt, | |||
2214 | unsigned int opt_on = 1; | 2213 | unsigned int opt_on = 1; |
2215 | unsigned int timeo; | 2214 | unsigned int timeo; |
2216 | 2215 | ||
2217 | spin_lock_bh(&xprt->transport_lock); | 2216 | spin_lock(&xprt->transport_lock); |
2218 | keepidle = DIV_ROUND_UP(xprt->timeout->to_initval, HZ); | 2217 | keepidle = DIV_ROUND_UP(xprt->timeout->to_initval, HZ); |
2219 | keepcnt = xprt->timeout->to_retries + 1; | 2218 | keepcnt = xprt->timeout->to_retries + 1; |
2220 | timeo = jiffies_to_msecs(xprt->timeout->to_initval) * | 2219 | timeo = jiffies_to_msecs(xprt->timeout->to_initval) * |
2221 | (xprt->timeout->to_retries + 1); | 2220 | (xprt->timeout->to_retries + 1); |
2222 | clear_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); | 2221 | clear_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); |
2223 | spin_unlock_bh(&xprt->transport_lock); | 2222 | spin_unlock(&xprt->transport_lock); |
2224 | 2223 | ||
2225 | /* TCP Keepalive options */ | 2224 | /* TCP Keepalive options */ |
2226 | kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, | 2225 | kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, |
@@ -2245,7 +2244,7 @@ static void xs_tcp_set_connect_timeout(struct rpc_xprt *xprt, | |||
2245 | struct rpc_timeout to; | 2244 | struct rpc_timeout to; |
2246 | unsigned long initval; | 2245 | unsigned long initval; |
2247 | 2246 | ||
2248 | spin_lock_bh(&xprt->transport_lock); | 2247 | spin_lock(&xprt->transport_lock); |
2249 | if (reconnect_timeout < xprt->max_reconnect_timeout) | 2248 | if (reconnect_timeout < xprt->max_reconnect_timeout) |
2250 | xprt->max_reconnect_timeout = reconnect_timeout; | 2249 | xprt->max_reconnect_timeout = reconnect_timeout; |
2251 | if (connect_timeout < xprt->connect_timeout) { | 2250 | if (connect_timeout < xprt->connect_timeout) { |
@@ -2262,7 +2261,7 @@ static void xs_tcp_set_connect_timeout(struct rpc_xprt *xprt, | |||
2262 | xprt->connect_timeout = connect_timeout; | 2261 | xprt->connect_timeout = connect_timeout; |
2263 | } | 2262 | } |
2264 | set_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); | 2263 | set_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); |
2265 | spin_unlock_bh(&xprt->transport_lock); | 2264 | spin_unlock(&xprt->transport_lock); |
2266 | } | 2265 | } |
2267 | 2266 | ||
2268 | static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | 2267 | static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) |