diff options
author | Ursula Braun <ubraun@linux.vnet.ibm.com> | 2018-01-24 04:28:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-24 10:52:57 -0500 |
commit | 8429c1343519d7452b8ccd9af9716147512831c9 (patch) | |
tree | 0be2dcdf192d6b130fadbe38fdd0427358acbdd2 | |
parent | 35a6b17847175c4a6bdb0a16c1692627ca56b7f1 (diff) |
net/smc: get rid of tx_pend waits in socket closing
There is no need to wait for confirmation of pending tx requests
for a closing connection, since pending tx slots are dismissed
when finishing a connection.
Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/smc/smc_cdc.c | 11 | ||||
-rw-r--r-- | net/smc/smc_cdc.h | 1 | ||||
-rw-r--r-- | net/smc/smc_close.c | 25 | ||||
-rw-r--r-- | net/smc/smc_wr.c | 18 | ||||
-rw-r--r-- | net/smc/smc_wr.h | 2 |
5 files changed, 0 insertions, 57 deletions
diff --git a/net/smc/smc_cdc.c b/net/smc/smc_cdc.c index d4155ff6acde..51805334e001 100644 --- a/net/smc/smc_cdc.c +++ b/net/smc/smc_cdc.c | |||
@@ -57,9 +57,6 @@ static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd, | |||
57 | cdcpend->conn); | 57 | cdcpend->conn); |
58 | } | 58 | } |
59 | smc_tx_sndbuf_nonfull(smc); | 59 | smc_tx_sndbuf_nonfull(smc); |
60 | if (smc->sk.sk_state != SMC_ACTIVE) | ||
61 | /* wake up smc_close_wait_tx_pends() */ | ||
62 | smc->sk.sk_state_change(&smc->sk); | ||
63 | bh_unlock_sock(&smc->sk); | 60 | bh_unlock_sock(&smc->sk); |
64 | } | 61 | } |
65 | 62 | ||
@@ -155,14 +152,6 @@ void smc_cdc_tx_dismiss_slots(struct smc_connection *conn) | |||
155 | (unsigned long)conn); | 152 | (unsigned long)conn); |
156 | } | 153 | } |
157 | 154 | ||
158 | bool smc_cdc_tx_has_pending(struct smc_connection *conn) | ||
159 | { | ||
160 | struct smc_link *link = &conn->lgr->lnk[SMC_SINGLE_LINK]; | ||
161 | |||
162 | return smc_wr_tx_has_pending(link, SMC_CDC_MSG_TYPE, | ||
163 | smc_cdc_tx_filter, (unsigned long)conn); | ||
164 | } | ||
165 | |||
166 | /********************************* receive ***********************************/ | 155 | /********************************* receive ***********************************/ |
167 | 156 | ||
168 | static inline bool smc_cdc_before(u16 seq1, u16 seq2) | 157 | static inline bool smc_cdc_before(u16 seq1, u16 seq2) |
diff --git a/net/smc/smc_cdc.h b/net/smc/smc_cdc.h index 149ceda1b088..ab240b37ad11 100644 --- a/net/smc/smc_cdc.h +++ b/net/smc/smc_cdc.h | |||
@@ -214,7 +214,6 @@ void smc_cdc_tx_dismiss_slots(struct smc_connection *conn); | |||
214 | int smc_cdc_msg_send(struct smc_connection *conn, struct smc_wr_buf *wr_buf, | 214 | int smc_cdc_msg_send(struct smc_connection *conn, struct smc_wr_buf *wr_buf, |
215 | struct smc_cdc_tx_pend *pend); | 215 | struct smc_cdc_tx_pend *pend); |
216 | int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn); | 216 | int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn); |
217 | bool smc_cdc_tx_has_pending(struct smc_connection *conn); | ||
218 | int smc_cdc_init(void) __init; | 217 | int smc_cdc_init(void) __init; |
219 | 218 | ||
220 | #endif /* SMC_CDC_H */ | 219 | #endif /* SMC_CDC_H */ |
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c index 11793912f001..bc539ccb8fa0 100644 --- a/net/smc/smc_close.c +++ b/net/smc/smc_close.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #include "smc_cdc.h" | 19 | #include "smc_cdc.h" |
20 | #include "smc_close.h" | 20 | #include "smc_close.h" |
21 | 21 | ||
22 | #define SMC_CLOSE_WAIT_TX_PENDS_TIME (5 * HZ) | ||
23 | |||
24 | static void smc_close_cleanup_listen(struct sock *parent) | 22 | static void smc_close_cleanup_listen(struct sock *parent) |
25 | { | 23 | { |
26 | struct sock *sk; | 24 | struct sock *sk; |
@@ -30,26 +28,6 @@ static void smc_close_cleanup_listen(struct sock *parent) | |||
30 | smc_close_non_accepted(sk); | 28 | smc_close_non_accepted(sk); |
31 | } | 29 | } |
32 | 30 | ||
33 | static void smc_close_wait_tx_pends(struct smc_sock *smc) | ||
34 | { | ||
35 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | ||
36 | struct sock *sk = &smc->sk; | ||
37 | signed long timeout; | ||
38 | |||
39 | timeout = SMC_CLOSE_WAIT_TX_PENDS_TIME; | ||
40 | add_wait_queue(sk_sleep(sk), &wait); | ||
41 | while (!signal_pending(current) && timeout) { | ||
42 | int rc; | ||
43 | |||
44 | rc = sk_wait_event(sk, &timeout, | ||
45 | !smc_cdc_tx_has_pending(&smc->conn), | ||
46 | &wait); | ||
47 | if (rc) | ||
48 | break; | ||
49 | } | ||
50 | remove_wait_queue(sk_sleep(sk), &wait); | ||
51 | } | ||
52 | |||
53 | /* wait for sndbuf data being transmitted */ | 31 | /* wait for sndbuf data being transmitted */ |
54 | static void smc_close_stream_wait(struct smc_sock *smc, long timeout) | 32 | static void smc_close_stream_wait(struct smc_sock *smc, long timeout) |
55 | { | 33 | { |
@@ -230,7 +208,6 @@ again: | |||
230 | rc = smc_close_final(conn); | 208 | rc = smc_close_final(conn); |
231 | } | 209 | } |
232 | sk->sk_state = SMC_CLOSED; | 210 | sk->sk_state = SMC_CLOSED; |
233 | smc_close_wait_tx_pends(smc); | ||
234 | break; | 211 | break; |
235 | case SMC_APPCLOSEWAIT1: | 212 | case SMC_APPCLOSEWAIT1: |
236 | case SMC_APPCLOSEWAIT2: | 213 | case SMC_APPCLOSEWAIT2: |
@@ -251,7 +228,6 @@ again: | |||
251 | else | 228 | else |
252 | /* peer has just issued a shutdown write */ | 229 | /* peer has just issued a shutdown write */ |
253 | sk->sk_state = SMC_PEERFINCLOSEWAIT; | 230 | sk->sk_state = SMC_PEERFINCLOSEWAIT; |
254 | smc_close_wait_tx_pends(smc); | ||
255 | break; | 231 | break; |
256 | case SMC_PEERCLOSEWAIT1: | 232 | case SMC_PEERCLOSEWAIT1: |
257 | case SMC_PEERCLOSEWAIT2: | 233 | case SMC_PEERCLOSEWAIT2: |
@@ -271,7 +247,6 @@ again: | |||
271 | lock_sock(sk); | 247 | lock_sock(sk); |
272 | smc_close_abort(conn); | 248 | smc_close_abort(conn); |
273 | sk->sk_state = SMC_CLOSED; | 249 | sk->sk_state = SMC_CLOSED; |
274 | smc_close_wait_tx_pends(smc); | ||
275 | break; | 250 | break; |
276 | case SMC_PEERABORTWAIT: | 251 | case SMC_PEERABORTWAIT: |
277 | case SMC_CLOSED: | 252 | case SMC_CLOSED: |
diff --git a/net/smc/smc_wr.c b/net/smc/smc_wr.c index de4537f66832..a4477b4a9c18 100644 --- a/net/smc/smc_wr.c +++ b/net/smc/smc_wr.c | |||
@@ -319,24 +319,6 @@ void smc_wr_tx_dismiss_slots(struct smc_link *link, u8 wr_rx_hdr_type, | |||
319 | } | 319 | } |
320 | } | 320 | } |
321 | 321 | ||
322 | bool smc_wr_tx_has_pending(struct smc_link *link, u8 wr_rx_hdr_type, | ||
323 | smc_wr_tx_filter filter, unsigned long data) | ||
324 | { | ||
325 | struct smc_wr_tx_pend_priv *tx_pend; | ||
326 | struct smc_wr_rx_hdr *wr_rx; | ||
327 | int i; | ||
328 | |||
329 | for_each_set_bit(i, link->wr_tx_mask, link->wr_tx_cnt) { | ||
330 | wr_rx = (struct smc_wr_rx_hdr *)&link->wr_rx_bufs[i]; | ||
331 | if (wr_rx->type != wr_rx_hdr_type) | ||
332 | continue; | ||
333 | tx_pend = &link->wr_tx_pends[i].priv; | ||
334 | if (filter(tx_pend, data)) | ||
335 | return true; | ||
336 | } | ||
337 | return false; | ||
338 | } | ||
339 | |||
340 | /****************************** receive queue ********************************/ | 322 | /****************************** receive queue ********************************/ |
341 | 323 | ||
342 | int smc_wr_rx_register_handler(struct smc_wr_rx_handler *handler) | 324 | int smc_wr_rx_register_handler(struct smc_wr_rx_handler *handler) |
diff --git a/net/smc/smc_wr.h b/net/smc/smc_wr.h index 2acf12b06063..ef0c3494c9cb 100644 --- a/net/smc/smc_wr.h +++ b/net/smc/smc_wr.h | |||
@@ -93,8 +93,6 @@ int smc_wr_tx_put_slot(struct smc_link *link, | |||
93 | int smc_wr_tx_send(struct smc_link *link, | 93 | int smc_wr_tx_send(struct smc_link *link, |
94 | struct smc_wr_tx_pend_priv *wr_pend_priv); | 94 | struct smc_wr_tx_pend_priv *wr_pend_priv); |
95 | void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context); | 95 | void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context); |
96 | bool smc_wr_tx_has_pending(struct smc_link *link, u8 wr_rx_hdr_type, | ||
97 | smc_wr_tx_filter filter, unsigned long data); | ||
98 | void smc_wr_tx_dismiss_slots(struct smc_link *lnk, u8 wr_rx_hdr_type, | 96 | void smc_wr_tx_dismiss_slots(struct smc_link *lnk, u8 wr_rx_hdr_type, |
99 | smc_wr_tx_filter filter, | 97 | smc_wr_tx_filter filter, |
100 | smc_wr_tx_dismisser dismisser, | 98 | smc_wr_tx_dismisser dismisser, |