aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUrsula Braun <ubraun@linux.vnet.ibm.com>2018-01-24 04:28:14 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-24 10:52:57 -0500
commit8429c1343519d7452b8ccd9af9716147512831c9 (patch)
tree0be2dcdf192d6b130fadbe38fdd0427358acbdd2
parent35a6b17847175c4a6bdb0a16c1692627ca56b7f1 (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.c11
-rw-r--r--net/smc/smc_cdc.h1
-rw-r--r--net/smc/smc_close.c25
-rw-r--r--net/smc/smc_wr.c18
-rw-r--r--net/smc/smc_wr.h2
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
158bool 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
168static inline bool smc_cdc_before(u16 seq1, u16 seq2) 157static 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);
214int smc_cdc_msg_send(struct smc_connection *conn, struct smc_wr_buf *wr_buf, 214int 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);
216int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn); 216int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn);
217bool smc_cdc_tx_has_pending(struct smc_connection *conn);
218int smc_cdc_init(void) __init; 217int 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
24static void smc_close_cleanup_listen(struct sock *parent) 22static 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
33static 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 */
54static void smc_close_stream_wait(struct smc_sock *smc, long timeout) 32static 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
322bool 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
342int smc_wr_rx_register_handler(struct smc_wr_rx_handler *handler) 324int 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,
93int smc_wr_tx_send(struct smc_link *link, 93int 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);
95void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context); 95void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context);
96bool smc_wr_tx_has_pending(struct smc_link *link, u8 wr_rx_hdr_type,
97 smc_wr_tx_filter filter, unsigned long data);
98void smc_wr_tx_dismiss_slots(struct smc_link *lnk, u8 wr_rx_hdr_type, 96void 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,