Skip to content

Commit f06f095

Browse files
committed
Merge branch 'smc-next'
Ursula Braun says: ==================== net/smc: patches 2019-02-07 here are patches for SMC: * patches 1, 3, and 6 are cleanups without functional change * patch 2 postpones closing of internal clcsock * patches 4 and 5 improve link group creation locking * patch 7 restores AF_SMC as diag_family field ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents fc4aa1c + 232dc8e commit f06f095

File tree

7 files changed

+74
-51
lines changed

7 files changed

+74
-51
lines changed

arch/s390/include/asm/pnet.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,5 @@
1111
#include <linux/device.h>
1212
#include <linux/types.h>
1313

14-
#define PNETIDS_LEN 64 /* Total utility string length in bytes
15-
* to cover up to 4 PNETIDs of 16 bytes
16-
* for up to 4 device ports
17-
*/
18-
#define MAX_PNETID_LEN 16 /* Max.length of a single port PNETID */
19-
#define MAX_PNETID_PORTS (PNETIDS_LEN / MAX_PNETID_LEN)
20-
/* Max. # of ports with a PNETID */
21-
2214
int pnet_id_by_dev_port(struct device *dev, unsigned short port, u8 *pnetid);
2315
#endif /* _ASM_S390_PNET_H */

arch/s390/net/pnet.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@
1313
#include <asm/ccwdev.h>
1414
#include <asm/pnet.h>
1515

16+
#define PNETIDS_LEN 64 /* Total utility string length in bytes
17+
* to cover up to 4 PNETIDs of 16 bytes
18+
* for up to 4 device ports
19+
*/
20+
#define MAX_PNETID_LEN 16 /* Max.length of a single port PNETID */
21+
#define MAX_PNETID_PORTS (PNETIDS_LEN / MAX_PNETID_LEN)
22+
/* Max. # of ports with a PNETID */
23+
1624
/*
1725
* Get the PNETIDs from a device.
1826
* s390 hardware supports the definition of a so-called Physical Network

net/smc/af_smc.c

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@
4242
#include "smc_rx.h"
4343
#include "smc_close.h"
4444

45-
static DEFINE_MUTEX(smc_create_lgr_pending); /* serialize link group
46-
* creation
45+
static DEFINE_MUTEX(smc_server_lgr_pending); /* serialize link group
46+
* creation on server
47+
*/
48+
static DEFINE_MUTEX(smc_client_lgr_pending); /* serialize link group
49+
* creation on client
4750
*/
4851

4952
static void smc_tcp_listen_work(struct work_struct *);
@@ -145,32 +148,33 @@ static int smc_release(struct socket *sock)
145148
rc = smc_close_active(smc);
146149
sock_set_flag(sk, SOCK_DEAD);
147150
sk->sk_shutdown |= SHUTDOWN_MASK;
148-
}
149-
150-
sk->sk_prot->unhash(sk);
151-
152-
if (smc->clcsock) {
153-
if (smc->use_fallback && sk->sk_state == SMC_LISTEN) {
151+
} else {
152+
if (sk->sk_state != SMC_LISTEN && sk->sk_state != SMC_INIT)
153+
sock_put(sk); /* passive closing */
154+
if (sk->sk_state == SMC_LISTEN) {
154155
/* wake up clcsock accept */
155156
rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR);
156157
}
157-
mutex_lock(&smc->clcsock_release_lock);
158-
sock_release(smc->clcsock);
159-
smc->clcsock = NULL;
160-
mutex_unlock(&smc->clcsock_release_lock);
161-
}
162-
if (smc->use_fallback) {
163-
if (sk->sk_state != SMC_LISTEN && sk->sk_state != SMC_INIT)
164-
sock_put(sk); /* passive closing */
165158
sk->sk_state = SMC_CLOSED;
166159
sk->sk_state_change(sk);
167160
}
168161

162+
sk->sk_prot->unhash(sk);
163+
164+
if (sk->sk_state == SMC_CLOSED) {
165+
if (smc->clcsock) {
166+
mutex_lock(&smc->clcsock_release_lock);
167+
sock_release(smc->clcsock);
168+
smc->clcsock = NULL;
169+
mutex_unlock(&smc->clcsock_release_lock);
170+
}
171+
if (!smc->use_fallback)
172+
smc_conn_free(&smc->conn);
173+
}
174+
169175
/* detach socket */
170176
sock_orphan(sk);
171177
sock->sk = NULL;
172-
if (!smc->use_fallback && sk->sk_state == SMC_CLOSED)
173-
smc_conn_free(&smc->conn);
174178
release_sock(sk);
175179

176180
sock_put(sk); /* final sock_put */
@@ -476,7 +480,12 @@ static int smc_connect_abort(struct smc_sock *smc, int reason_code,
476480
{
477481
if (local_contact == SMC_FIRST_CONTACT)
478482
smc_lgr_forget(smc->conn.lgr);
479-
mutex_unlock(&smc_create_lgr_pending);
483+
if (smc->conn.lgr->is_smcd)
484+
/* there is only one lgr role for SMC-D; use server lock */
485+
mutex_unlock(&smc_server_lgr_pending);
486+
else
487+
mutex_unlock(&smc_client_lgr_pending);
488+
480489
smc_conn_free(&smc->conn);
481490
return reason_code;
482491
}
@@ -561,7 +570,7 @@ static int smc_connect_rdma(struct smc_sock *smc,
561570
struct smc_link *link;
562571
int reason_code = 0;
563572

564-
mutex_lock(&smc_create_lgr_pending);
573+
mutex_lock(&smc_client_lgr_pending);
565574
local_contact = smc_conn_create(smc, false, aclc->hdr.flag, ibdev,
566575
ibport, ntoh24(aclc->qpn), &aclc->lcl,
567576
NULL, 0);
@@ -572,7 +581,8 @@ static int smc_connect_rdma(struct smc_sock *smc,
572581
reason_code = SMC_CLC_DECL_SYNCERR; /* synchr. error */
573582
else
574583
reason_code = SMC_CLC_DECL_INTERR; /* other error */
575-
return smc_connect_abort(smc, reason_code, 0);
584+
mutex_unlock(&smc_client_lgr_pending);
585+
return reason_code;
576586
}
577587
link = &smc->conn.lgr->lnk[SMC_SINGLE_LINK];
578588

@@ -616,7 +626,7 @@ static int smc_connect_rdma(struct smc_sock *smc,
616626
return smc_connect_abort(smc, reason_code,
617627
local_contact);
618628
}
619-
mutex_unlock(&smc_create_lgr_pending);
629+
mutex_unlock(&smc_client_lgr_pending);
620630

621631
smc_copy_sock_settings_to_clc(smc);
622632
if (smc->sk.sk_state == SMC_INIT)
@@ -633,11 +643,14 @@ static int smc_connect_ism(struct smc_sock *smc,
633643
int local_contact = SMC_FIRST_CONTACT;
634644
int rc = 0;
635645

636-
mutex_lock(&smc_create_lgr_pending);
646+
/* there is only one lgr role for SMC-D; use server lock */
647+
mutex_lock(&smc_server_lgr_pending);
637648
local_contact = smc_conn_create(smc, true, aclc->hdr.flag, NULL, 0, 0,
638649
NULL, ismdev, aclc->gid);
639-
if (local_contact < 0)
640-
return smc_connect_abort(smc, SMC_CLC_DECL_MEM, 0);
650+
if (local_contact < 0) {
651+
mutex_unlock(&smc_server_lgr_pending);
652+
return SMC_CLC_DECL_MEM;
653+
}
641654

642655
/* Create send and receive buffers */
643656
if (smc_buf_create(smc, true))
@@ -651,7 +664,7 @@ static int smc_connect_ism(struct smc_sock *smc,
651664
rc = smc_clc_send_confirm(smc);
652665
if (rc)
653666
return smc_connect_abort(smc, rc, local_contact);
654-
mutex_unlock(&smc_create_lgr_pending);
667+
mutex_unlock(&smc_server_lgr_pending);
655668

656669
smc_copy_sock_settings_to_clc(smc);
657670
if (smc->sk.sk_state == SMC_INIT)
@@ -1250,7 +1263,7 @@ static void smc_listen_work(struct work_struct *work)
12501263
return;
12511264
}
12521265

1253-
mutex_lock(&smc_create_lgr_pending);
1266+
mutex_lock(&smc_server_lgr_pending);
12541267
smc_close_init(new_smc);
12551268
smc_rx_init(new_smc);
12561269
smc_tx_init(new_smc);
@@ -1272,7 +1285,7 @@ static void smc_listen_work(struct work_struct *work)
12721285
&local_contact) ||
12731286
smc_listen_rdma_reg(new_smc, local_contact))) {
12741287
/* SMC not supported, decline */
1275-
mutex_unlock(&smc_create_lgr_pending);
1288+
mutex_unlock(&smc_server_lgr_pending);
12761289
smc_listen_decline(new_smc, SMC_CLC_DECL_MODEUNSUPP,
12771290
local_contact);
12781291
return;
@@ -1281,29 +1294,33 @@ static void smc_listen_work(struct work_struct *work)
12811294
/* send SMC Accept CLC message */
12821295
rc = smc_clc_send_accept(new_smc, local_contact);
12831296
if (rc) {
1284-
mutex_unlock(&smc_create_lgr_pending);
1297+
mutex_unlock(&smc_server_lgr_pending);
12851298
smc_listen_decline(new_smc, rc, local_contact);
12861299
return;
12871300
}
12881301

1302+
/* SMC-D does not need this lock any more */
1303+
if (ism_supported)
1304+
mutex_unlock(&smc_server_lgr_pending);
1305+
12891306
/* receive SMC Confirm CLC message */
12901307
reason_code = smc_clc_wait_msg(new_smc, &cclc, sizeof(cclc),
12911308
SMC_CLC_CONFIRM, CLC_WAIT_TIME);
12921309
if (reason_code) {
1293-
mutex_unlock(&smc_create_lgr_pending);
1310+
if (!ism_supported)
1311+
mutex_unlock(&smc_server_lgr_pending);
12941312
smc_listen_decline(new_smc, reason_code, local_contact);
12951313
return;
12961314
}
12971315

12981316
/* finish worker */
12991317
if (!ism_supported) {
1300-
if (smc_listen_rdma_finish(new_smc, &cclc, local_contact)) {
1301-
mutex_unlock(&smc_create_lgr_pending);
1318+
rc = smc_listen_rdma_finish(new_smc, &cclc, local_contact);
1319+
mutex_unlock(&smc_server_lgr_pending);
1320+
if (rc)
13021321
return;
1303-
}
13041322
}
13051323
smc_conn_save_peer_info(new_smc, &cclc);
1306-
mutex_unlock(&smc_create_lgr_pending);
13071324
smc_listen_out_connected(new_smc);
13081325
}
13091326

net/smc/smc_cdc.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,17 +245,18 @@ static inline void smcr_cdc_msg_to_host(struct smc_host_cdc_msg *local,
245245
}
246246

247247
static inline void smcd_cdc_msg_to_host(struct smc_host_cdc_msg *local,
248-
struct smcd_cdc_msg *peer)
248+
struct smcd_cdc_msg *peer,
249+
struct smc_connection *conn)
249250
{
250251
union smc_host_cursor temp;
251252

252253
temp.wrap = peer->prod.wrap;
253254
temp.count = peer->prod.count;
254-
atomic64_set(&local->prod.acurs, atomic64_read(&temp.acurs));
255+
smc_curs_copy(&local->prod, &temp, conn);
255256

256257
temp.wrap = peer->cons.wrap;
257258
temp.count = peer->cons.count;
258-
atomic64_set(&local->cons.acurs, atomic64_read(&temp.acurs));
259+
smc_curs_copy(&local->cons, &temp, conn);
259260
local->prod_flags = peer->cons.prod_flags;
260261
local->conn_state_flags = peer->cons.conn_state_flags;
261262
}
@@ -265,7 +266,7 @@ static inline void smc_cdc_msg_to_host(struct smc_host_cdc_msg *local,
265266
struct smc_connection *conn)
266267
{
267268
if (conn->lgr->is_smcd)
268-
smcd_cdc_msg_to_host(local, (struct smcd_cdc_msg *)peer);
269+
smcd_cdc_msg_to_host(local, (struct smcd_cdc_msg *)peer, conn);
269270
else
270271
smcr_cdc_msg_to_host(local, peer, conn);
271272
}

net/smc/smc_close.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,13 @@ static void smc_close_passive_work(struct work_struct *work)
405405
if (old_state != sk->sk_state) {
406406
sk->sk_state_change(sk);
407407
if ((sk->sk_state == SMC_CLOSED) &&
408-
(sock_flag(sk, SOCK_DEAD) || !sk->sk_socket))
408+
(sock_flag(sk, SOCK_DEAD) || !sk->sk_socket)) {
409409
smc_conn_free(conn);
410+
if (smc->clcsock) {
411+
sock_release(smc->clcsock);
412+
smc->clcsock = NULL;
413+
}
414+
}
410415
}
411416
release_sock(sk);
412417
sock_put(sk); /* sock_hold done by schedulers of close_work */

net/smc/smc_core.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ static void __smc_lgr_unregister_conn(struct smc_connection *conn)
118118
rb_erase(&conn->alert_node, &lgr->conns_all);
119119
lgr->conns_num--;
120120
conn->alert_token_local = 0;
121-
conn->lgr = NULL;
122121
sock_put(&smc->sk); /* sock_hold in smc_lgr_register_conn() */
123122
}
124123

@@ -331,8 +330,9 @@ void smc_conn_free(struct smc_connection *conn)
331330
} else {
332331
smc_cdc_tx_dismiss_slots(conn);
333332
}
334-
smc_lgr_unregister_conn(conn); /* unsets conn->lgr */
333+
smc_lgr_unregister_conn(conn);
335334
smc_buf_unuse(conn, lgr); /* allow buffer reuse */
335+
conn->lgr = NULL;
336336

337337
if (!lgr->conns_num)
338338
smc_lgr_schedule_free_work(lgr);
@@ -462,6 +462,7 @@ static void __smc_lgr_terminate(struct smc_link_group *lgr)
462462
sock_hold(&smc->sk); /* sock_put in close work */
463463
conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1;
464464
__smc_lgr_unregister_conn(conn);
465+
conn->lgr = NULL;
465466
write_unlock_bh(&lgr->conns_lock);
466467
if (!schedule_work(&conn->close_work))
467468
sock_put(&smc->sk);

net/smc/smc_diag.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,20 @@ static void smc_diag_msg_common_fill(struct smc_diag_msg *r, struct sock *sk)
3838
{
3939
struct smc_sock *smc = smc_sk(sk);
4040

41+
r->diag_family = sk->sk_family;
4142
if (!smc->clcsock)
4243
return;
4344
r->id.idiag_sport = htons(smc->clcsock->sk->sk_num);
4445
r->id.idiag_dport = smc->clcsock->sk->sk_dport;
4546
r->id.idiag_if = smc->clcsock->sk->sk_bound_dev_if;
4647
sock_diag_save_cookie(sk, r->id.idiag_cookie);
4748
if (sk->sk_protocol == SMCPROTO_SMC) {
48-
r->diag_family = PF_INET;
4949
memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
5050
memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
5151
r->id.idiag_src[0] = smc->clcsock->sk->sk_rcv_saddr;
5252
r->id.idiag_dst[0] = smc->clcsock->sk->sk_daddr;
5353
#if IS_ENABLED(CONFIG_IPV6)
5454
} else if (sk->sk_protocol == SMCPROTO_SMC6) {
55-
r->diag_family = PF_INET6;
5655
memcpy(&r->id.idiag_src, &smc->clcsock->sk->sk_v6_rcv_saddr,
5756
sizeof(smc->clcsock->sk->sk_v6_rcv_saddr));
5857
memcpy(&r->id.idiag_dst, &smc->clcsock->sk->sk_v6_daddr,

0 commit comments

Comments
 (0)