Skip to content

Commit f221dcd

Browse files
committed
Merge branch 'net-smc-next'
Ursula Braun says: ==================== net/smc: patches for net-next here are some patches for net/smc. Most important are improvements for socket closing. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents c02b7a9 + 2c9c168 commit f221dcd

File tree

12 files changed

+87
-50
lines changed

12 files changed

+87
-50
lines changed

net/smc/af_smc.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ static int smc_release(struct socket *sock)
147147
schedule_delayed_work(&smc->sock_put_work,
148148
SMC_CLOSE_SOCK_PUT_DELAY);
149149
}
150-
sk->sk_prot->unhash(sk);
151150
release_sock(sk);
152151

153152
sock_put(sk);
@@ -451,6 +450,9 @@ static int smc_connect_rdma(struct smc_sock *smc)
451450
goto decline_rdma_unlock;
452451
}
453452

453+
smc_close_init(smc);
454+
smc_rx_init(smc);
455+
454456
if (local_contact == SMC_FIRST_CONTACT) {
455457
rc = smc_ib_ready_link(link);
456458
if (rc) {
@@ -477,7 +479,6 @@ static int smc_connect_rdma(struct smc_sock *smc)
477479

478480
mutex_unlock(&smc_create_lgr_pending);
479481
smc_tx_init(smc);
480-
smc_rx_init(smc);
481482

482483
out_connected:
483484
smc_copy_sock_settings_to_clc(smc);
@@ -637,7 +638,8 @@ struct sock *smc_accept_dequeue(struct sock *parent,
637638

638639
smc_accept_unlink(new_sk);
639640
if (new_sk->sk_state == SMC_CLOSED) {
640-
/* tbd in follow-on patch: close this sock */
641+
new_sk->sk_prot->unhash(new_sk);
642+
sock_put(new_sk);
641643
continue;
642644
}
643645
if (new_sock)
@@ -657,20 +659,23 @@ void smc_close_non_accepted(struct sock *sk)
657659
if (!sk->sk_lingertime)
658660
/* wait for peer closing */
659661
sk->sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT;
660-
if (!smc->use_fallback)
662+
if (smc->use_fallback) {
663+
sk->sk_state = SMC_CLOSED;
664+
} else {
661665
smc_close_active(smc);
666+
sock_set_flag(sk, SOCK_DEAD);
667+
sk->sk_shutdown |= SHUTDOWN_MASK;
668+
}
662669
if (smc->clcsock) {
663670
struct socket *tcp;
664671

665672
tcp = smc->clcsock;
666673
smc->clcsock = NULL;
667674
sock_release(tcp);
668675
}
669-
sock_set_flag(sk, SOCK_DEAD);
670-
sk->sk_shutdown |= SHUTDOWN_MASK;
671676
if (smc->use_fallback) {
672677
schedule_delayed_work(&smc->sock_put_work, TCP_TIMEWAIT_LEN);
673-
} else {
678+
} else if (sk->sk_state == SMC_CLOSED) {
674679
smc_conn_free(&smc->conn);
675680
schedule_delayed_work(&smc->sock_put_work,
676681
SMC_CLOSE_SOCK_PUT_DELAY);
@@ -800,6 +805,9 @@ static void smc_listen_work(struct work_struct *work)
800805
goto decline_rdma;
801806
}
802807

808+
smc_close_init(new_smc);
809+
smc_rx_init(new_smc);
810+
803811
rc = smc_clc_send_accept(new_smc, local_contact);
804812
if (rc)
805813
goto out_err;
@@ -839,7 +847,6 @@ static void smc_listen_work(struct work_struct *work)
839847
}
840848

841849
smc_tx_init(new_smc);
842-
smc_rx_init(new_smc);
843850

844851
out_connected:
845852
sk_refcnt_debug_inc(newsmcsk);

net/smc/smc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ struct smc_connection {
164164
#ifndef KERNEL_HAS_ATOMIC64
165165
spinlock_t acurs_lock; /* protect cursors */
166166
#endif
167+
struct work_struct close_work; /* peer sent some closing */
167168
};
168169

169170
struct smc_sock { /* smc sock container */

net/smc/smc_cdc.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,13 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
217217
smc->sk.sk_err = ECONNRESET;
218218
conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1;
219219
}
220-
if (smc_cdc_rxed_any_close_or_senddone(conn))
221-
smc_close_passive_received(smc);
220+
if (smc_cdc_rxed_any_close_or_senddone(conn)) {
221+
smc->sk.sk_shutdown |= RCV_SHUTDOWN;
222+
if (smc->clcsock && smc->clcsock->sk)
223+
smc->clcsock->sk->sk_shutdown |= RCV_SHUTDOWN;
224+
sock_set_flag(&smc->sk, SOCK_DONE);
225+
schedule_work(&conn->close_work);
226+
}
222227

223228
/* piggy backed tx info */
224229
/* trigger sndbuf consumer: RDMA write into peer RMBE and CDC */
@@ -228,8 +233,6 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
228233
smc_close_wake_tx_prepared(smc);
229234
}
230235

231-
/* subsequent patch: trigger socket release if connection closed */
232-
233236
/* socket connected but not accepted */
234237
if (!smc->sk.sk_socket)
235238
return;

net/smc/smc_close.c

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,14 @@ void smc_close_active_abort(struct smc_sock *smc)
117117
struct smc_cdc_conn_state_flags *txflags =
118118
&smc->conn.local_tx_ctrl.conn_state_flags;
119119

120-
bh_lock_sock(&smc->sk);
121120
smc->sk.sk_err = ECONNABORTED;
122121
if (smc->clcsock && smc->clcsock->sk) {
123122
smc->clcsock->sk->sk_err = ECONNABORTED;
124123
smc->clcsock->sk->sk_state_change(smc->clcsock->sk);
125124
}
126125
switch (smc->sk.sk_state) {
127126
case SMC_INIT:
127+
case SMC_ACTIVE:
128128
smc->sk.sk_state = SMC_PEERABORTWAIT;
129129
break;
130130
case SMC_APPCLOSEWAIT1:
@@ -161,10 +161,15 @@ void smc_close_active_abort(struct smc_sock *smc)
161161
}
162162

163163
sock_set_flag(&smc->sk, SOCK_DEAD);
164-
bh_unlock_sock(&smc->sk);
165164
smc->sk.sk_state_change(&smc->sk);
166165
}
167166

167+
static inline bool smc_close_sent_any_close(struct smc_connection *conn)
168+
{
169+
return conn->local_tx_ctrl.conn_state_flags.peer_conn_abort ||
170+
conn->local_tx_ctrl.conn_state_flags.peer_conn_closed;
171+
}
172+
168173
int smc_close_active(struct smc_sock *smc)
169174
{
170175
struct smc_cdc_conn_state_flags *txflags =
@@ -185,8 +190,7 @@ int smc_close_active(struct smc_sock *smc)
185190
case SMC_INIT:
186191
sk->sk_state = SMC_CLOSED;
187192
if (smc->smc_listen_work.func)
188-
flush_work(&smc->smc_listen_work);
189-
sock_put(sk);
193+
cancel_work_sync(&smc->smc_listen_work);
190194
break;
191195
case SMC_LISTEN:
192196
sk->sk_state = SMC_CLOSED;
@@ -198,7 +202,7 @@ int smc_close_active(struct smc_sock *smc)
198202
}
199203
release_sock(sk);
200204
smc_close_cleanup_listen(sk);
201-
flush_work(&smc->tcp_listen_work);
205+
cancel_work_sync(&smc->smc_listen_work);
202206
lock_sock(sk);
203207
break;
204208
case SMC_ACTIVE:
@@ -218,7 +222,7 @@ int smc_close_active(struct smc_sock *smc)
218222
case SMC_APPFINCLOSEWAIT:
219223
/* socket already shutdown wr or both (active close) */
220224
if (txflags->peer_done_writing &&
221-
!txflags->peer_conn_closed) {
225+
!smc_close_sent_any_close(conn)) {
222226
/* just shutdown wr done, send close request */
223227
rc = smc_close_final(conn);
224228
}
@@ -248,6 +252,13 @@ int smc_close_active(struct smc_sock *smc)
248252
break;
249253
case SMC_PEERCLOSEWAIT1:
250254
case SMC_PEERCLOSEWAIT2:
255+
if (txflags->peer_done_writing &&
256+
!smc_close_sent_any_close(conn)) {
257+
/* just shutdown wr done, send close request */
258+
rc = smc_close_final(conn);
259+
}
260+
/* peer sending PeerConnectionClosed will cause transition */
261+
break;
251262
case SMC_PEERFINCLOSEWAIT:
252263
/* peer sending PeerConnectionClosed will cause transition */
253264
break;
@@ -285,7 +296,7 @@ static void smc_close_passive_abort_received(struct smc_sock *smc)
285296
case SMC_PEERCLOSEWAIT1:
286297
case SMC_PEERCLOSEWAIT2:
287298
if (txflags->peer_done_writing &&
288-
!txflags->peer_conn_closed) {
299+
!smc_close_sent_any_close(&smc->conn)) {
289300
/* just shutdown, but not yet closed locally */
290301
smc_close_abort(&smc->conn);
291302
sk->sk_state = SMC_PROCESSABORT;
@@ -306,22 +317,27 @@ static void smc_close_passive_abort_received(struct smc_sock *smc)
306317

307318
/* Some kind of closing has been received: peer_conn_closed, peer_conn_abort,
308319
* or peer_done_writing.
309-
* Called under tasklet context.
310320
*/
311-
void smc_close_passive_received(struct smc_sock *smc)
321+
static void smc_close_passive_work(struct work_struct *work)
312322
{
313-
struct smc_cdc_conn_state_flags *rxflags =
314-
&smc->conn.local_rx_ctrl.conn_state_flags;
323+
struct smc_connection *conn = container_of(work,
324+
struct smc_connection,
325+
close_work);
326+
struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
327+
struct smc_cdc_conn_state_flags *rxflags;
315328
struct sock *sk = &smc->sk;
316329
int old_state;
317330

318-
sk->sk_shutdown |= RCV_SHUTDOWN;
319-
if (smc->clcsock && smc->clcsock->sk)
320-
smc->clcsock->sk->sk_shutdown |= RCV_SHUTDOWN;
321-
sock_set_flag(&smc->sk, SOCK_DONE);
322-
331+
lock_sock(&smc->sk);
323332
old_state = sk->sk_state;
324333

334+
if (!conn->alert_token_local) {
335+
/* abnormal termination */
336+
smc_close_active_abort(smc);
337+
goto wakeup;
338+
}
339+
340+
rxflags = &smc->conn.local_rx_ctrl.conn_state_flags;
325341
if (rxflags->peer_conn_abort) {
326342
smc_close_passive_abort_received(smc);
327343
goto wakeup;
@@ -331,7 +347,7 @@ void smc_close_passive_received(struct smc_sock *smc)
331347
case SMC_INIT:
332348
if (atomic_read(&smc->conn.bytes_to_rcv) ||
333349
(rxflags->peer_done_writing &&
334-
!rxflags->peer_conn_closed))
350+
!smc_cdc_rxed_any_close(conn)))
335351
sk->sk_state = SMC_APPCLOSEWAIT1;
336352
else
337353
sk->sk_state = SMC_CLOSED;
@@ -348,7 +364,7 @@ void smc_close_passive_received(struct smc_sock *smc)
348364
if (!smc_cdc_rxed_any_close(&smc->conn))
349365
break;
350366
if (sock_flag(sk, SOCK_DEAD) &&
351-
(sk->sk_shutdown == SHUTDOWN_MASK)) {
367+
smc_close_sent_any_close(conn)) {
352368
/* smc_release has already been called locally */
353369
sk->sk_state = SMC_CLOSED;
354370
} else {
@@ -367,17 +383,19 @@ void smc_close_passive_received(struct smc_sock *smc)
367383
}
368384

369385
wakeup:
370-
if (old_state != sk->sk_state)
371-
sk->sk_state_change(sk);
372386
sk->sk_data_ready(sk); /* wakeup blocked rcvbuf consumers */
373387
sk->sk_write_space(sk); /* wakeup blocked sndbuf producers */
374388

375-
if ((sk->sk_state == SMC_CLOSED) &&
376-
(sock_flag(sk, SOCK_DEAD) || (old_state == SMC_INIT))) {
377-
smc_conn_free(&smc->conn);
378-
schedule_delayed_work(&smc->sock_put_work,
379-
SMC_CLOSE_SOCK_PUT_DELAY);
389+
if (old_state != sk->sk_state) {
390+
sk->sk_state_change(sk);
391+
if ((sk->sk_state == SMC_CLOSED) &&
392+
(sock_flag(sk, SOCK_DEAD) || !sk->sk_socket)) {
393+
smc_conn_free(&smc->conn);
394+
schedule_delayed_work(&smc->sock_put_work,
395+
SMC_CLOSE_SOCK_PUT_DELAY);
396+
}
380397
}
398+
release_sock(&smc->sk);
381399
}
382400

383401
void smc_close_sock_put_work(struct work_struct *work)
@@ -442,3 +460,9 @@ int smc_close_shutdown_write(struct smc_sock *smc)
442460
sk->sk_state_change(&smc->sk);
443461
return rc;
444462
}
463+
464+
/* Initialize close properties on connection establishment. */
465+
void smc_close_init(struct smc_sock *smc)
466+
{
467+
INIT_WORK(&smc->conn.close_work, smc_close_passive_work);
468+
}

net/smc/smc_close.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
void smc_close_wake_tx_prepared(struct smc_sock *smc);
2222
void smc_close_active_abort(struct smc_sock *smc);
2323
int smc_close_active(struct smc_sock *smc);
24-
void smc_close_passive_received(struct smc_sock *smc);
2524
void smc_close_sock_put_work(struct work_struct *work);
2625
int smc_close_shutdown_write(struct smc_sock *smc);
26+
void smc_close_init(struct smc_sock *smc);
2727

2828
#endif /* SMC_CLOSE_H */

net/smc/smc_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ void smc_lgr_terminate(struct smc_link_group *lgr)
316316
smc = container_of(conn, struct smc_sock, conn);
317317
sock_hold(&smc->sk);
318318
__smc_lgr_unregister_conn(conn);
319-
smc_close_active_abort(smc);
319+
schedule_work(&conn->close_work);
320320
sock_put(&smc->sk);
321321
node = rb_first(&lgr->conns_all);
322322
}

net/smc/smc_ib.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,6 @@ static void smc_ib_global_event_handler(struct ib_event_handler *handler,
179179
u8 port_idx;
180180

181181
smcibdev = container_of(handler, struct smc_ib_device, event_handler);
182-
if (!smc_pnet_find_ib(smcibdev->ibdev->name))
183-
return;
184182

185183
switch (ibevent->event) {
186184
case IB_EVENT_PORT_ERR:
@@ -259,7 +257,6 @@ int smc_ib_create_queue_pair(struct smc_link *lnk)
259257
.max_recv_wr = SMC_WR_BUF_CNT * 3,
260258
.max_send_sge = SMC_IB_MAX_SEND_SGE,
261259
.max_recv_sge = 1,
262-
.max_inline_data = SMC_WR_TX_SIZE,
263260
},
264261
.sq_sig_type = IB_SIGNAL_REQ_WR,
265262
.qp_type = IB_QPT_RC,

net/smc/smc_pnet.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ static bool smc_pnetid_valid(const char *pnet_name, char *pnetid)
219219
}
220220

221221
/* Find an infiniband device by a given name. The device might not exist. */
222-
struct smc_ib_device *smc_pnet_find_ib(char *ib_name)
222+
static struct smc_ib_device *smc_pnet_find_ib(char *ib_name)
223223
{
224224
struct smc_ib_device *ibdev;
225225

@@ -523,8 +523,11 @@ void smc_pnet_find_roce_resource(struct sock *sk,
523523
read_lock(&smc_pnettable.lock);
524524
list_for_each_entry(pnetelem, &smc_pnettable.pnetlist, list) {
525525
if (dst->dev == pnetelem->ndev) {
526-
*smcibdev = pnetelem->smcibdev;
527-
*ibport = pnetelem->ib_port;
526+
if (smc_ib_port_active(pnetelem->smcibdev,
527+
pnetelem->ib_port)) {
528+
*smcibdev = pnetelem->smcibdev;
529+
*ibport = pnetelem->ib_port;
530+
}
528531
break;
529532
}
530533
}

net/smc/smc_pnet.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ struct smc_ib_device;
1616
int smc_pnet_init(void) __init;
1717
void smc_pnet_exit(void);
1818
int smc_pnet_remove_by_ibdev(struct smc_ib_device *ibdev);
19-
struct smc_ib_device *smc_pnet_find_ib(char *ib_name);
2019
void smc_pnet_find_roce_resource(struct sock *sk,
2120
struct smc_ib_device **smcibdev, u8 *ibport);
2221

net/smc/smc_rx.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,10 @@ static void smc_rx_data_ready(struct sock *sk)
3636
if (skwq_has_sleeper(wq))
3737
wake_up_interruptible_sync_poll(&wq->wait, POLLIN | POLLPRI |
3838
POLLRDNORM | POLLRDBAND);
39+
sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
3940
if ((sk->sk_shutdown == SHUTDOWN_MASK) ||
4041
(sk->sk_state == SMC_CLOSED))
4142
sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_HUP);
42-
else
43-
sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
4443
rcu_read_unlock();
4544
}
4645

net/smc/smc_tx.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,13 @@ static void smc_tx_work(struct work_struct *work)
431431
struct smc_connection,
432432
tx_work);
433433
struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
434+
int rc;
434435

435436
lock_sock(&smc->sk);
436-
smc_tx_sndbuf_nonempty(conn);
437+
rc = smc_tx_sndbuf_nonempty(conn);
438+
if (!rc && conn->local_rx_ctrl.prod_flags.write_blocked &&
439+
!atomic_read(&conn->bytes_to_rcv))
440+
conn->local_rx_ctrl.prod_flags.write_blocked = 0;
437441
release_sock(&smc->sk);
438442
}
439443

net/smc/smc_wr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ static void smc_wr_init_sge(struct smc_link *lnk)
447447
lnk->wr_tx_ibs[i].num_sge = 1;
448448
lnk->wr_tx_ibs[i].opcode = IB_WR_SEND;
449449
lnk->wr_tx_ibs[i].send_flags =
450-
IB_SEND_SIGNALED | IB_SEND_SOLICITED | IB_SEND_INLINE;
450+
IB_SEND_SIGNALED | IB_SEND_SOLICITED;
451451
}
452452
for (i = 0; i < lnk->wr_rx_cnt; i++) {
453453
lnk->wr_rx_sges[i].addr =

0 commit comments

Comments
 (0)