Skip to content

Commit 04e073d

Browse files
author
CKI KWF Bot
committed
Merge: Upgrade SMC driver
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7579 JIRA: https://issues.redhat.com/browse/RHEL-99989 Conflicts: Conflicts due to change in line numbers between 5.14 & 6.17 kernel, no functional changes Commitids: ``` ae2be35 2fe5273 1018825 5a79575 d37307e 0908503 d27a835 0a3e693 d386d59 e0d1035 98d4435 f8406a2 6fd27ea cd959bf 25c12b4 82ac39e d293958 0541db8 2c7f14e 27ef6a9 10bc976 a4b6539 bfc6c67 752e221 199561a c3ee72d 091d019 ae2402b 4814f91 60ada4f d9cef55 ba1e942 ``` Omitted-fix: 60ada4f Signed-off-by: Mete Durlu <mdurlu@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 15cc018 + 5e3ed29 commit 04e073d

File tree

19 files changed

+341
-121
lines changed

19 files changed

+341
-121
lines changed

drivers/s390/net/ism_drv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id)
615615
ism->dev.parent = &pdev->dev;
616616
ism->dev.release = ism_dev_release;
617617
device_initialize(&ism->dev);
618-
dev_set_name(&ism->dev, dev_name(&pdev->dev));
618+
dev_set_name(&ism->dev, "%s", dev_name(&pdev->dev));
619619
ret = device_add(&ism->dev);
620620
if (ret)
621621
goto err_dev;

include/uapi/linux/smc.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ enum {
127127
SMC_NLA_LGR_R_NET_COOKIE, /* u64 */
128128
SMC_NLA_LGR_R_PAD, /* flag */
129129
SMC_NLA_LGR_R_BUF_TYPE, /* u8 */
130+
SMC_NLA_LGR_R_SNDBUF_ALLOC, /* uint */
131+
SMC_NLA_LGR_R_RMB_ALLOC, /* uint */
130132
__SMC_NLA_LGR_R_MAX,
131133
SMC_NLA_LGR_R_MAX = __SMC_NLA_LGR_R_MAX - 1
132134
};
@@ -162,6 +164,8 @@ enum {
162164
SMC_NLA_LGR_D_V2_COMMON, /* nest */
163165
SMC_NLA_LGR_D_EXT_GID, /* u64 */
164166
SMC_NLA_LGR_D_PEER_EXT_GID, /* u64 */
167+
SMC_NLA_LGR_D_SNDBUF_ALLOC, /* uint */
168+
SMC_NLA_LGR_D_DMB_ALLOC, /* uint */
165169
__SMC_NLA_LGR_D_MAX,
166170
SMC_NLA_LGR_D_MAX = __SMC_NLA_LGR_D_MAX - 1
167171
};
@@ -249,6 +253,8 @@ enum {
249253
SMC_NLA_STATS_T_TX_BYTES, /* u64 */
250254
SMC_NLA_STATS_T_RX_CNT, /* u64 */
251255
SMC_NLA_STATS_T_TX_CNT, /* u64 */
256+
SMC_NLA_STATS_T_RX_RMB_USAGE, /* uint */
257+
SMC_NLA_STATS_T_TX_RMB_USAGE, /* uint */
252258
__SMC_NLA_STATS_T_MAX,
253259
SMC_NLA_STATS_T_MAX = __SMC_NLA_STATS_T_MAX - 1
254260
};

net/smc/af_smc.c

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
#include <linux/ctype.h>
3030

3131
#include <net/sock.h>
32+
#include <net/inet_common.h>
33+
#if IS_ENABLED(CONFIG_IPV6)
34+
#include <net/ipv6.h>
35+
#endif
3236
#include <net/tcp.h>
3337
#include <net/smc.h>
3438
#include <asm/ioctls.h>
@@ -361,8 +365,21 @@ static void smc_destruct(struct sock *sk)
361365
return;
362366

363367
sk_refcnt_debug_dec(sk);
368+
switch (sk->sk_family) {
369+
case AF_INET:
370+
inet_sock_destruct(sk);
371+
break;
372+
#if IS_ENABLED(CONFIG_IPV6)
373+
case AF_INET6:
374+
inet6_sock_destruct(sk);
375+
break;
376+
#endif
377+
}
364378
}
365379

380+
static struct lock_class_key smc_key;
381+
static struct lock_class_key smc_slock_key;
382+
366383
void smc_sk_init(struct net *net, struct sock *sk, int protocol)
367384
{
368385
struct smc_sock *smc = smc_sk(sk);
@@ -374,6 +391,8 @@ void smc_sk_init(struct net *net, struct sock *sk, int protocol)
374391
INIT_WORK(&smc->connect_work, smc_connect_work);
375392
INIT_DELAYED_WORK(&smc->conn.tx_work, smc_tx_work);
376393
INIT_LIST_HEAD(&smc->accept_q);
394+
sock_lock_init_class_and_name(sk, "slock-AF_SMC", &smc_slock_key,
395+
"sk_lock-AF_SMC", &smc_key);
377396
spin_lock_init(&smc->accept_q_lock);
378397
spin_lock_init(&smc->conn.send_lock);
379398
sk->sk_prot->hash(sk);
@@ -383,6 +402,7 @@ void smc_sk_init(struct net *net, struct sock *sk, int protocol)
383402
smc->limit_smc_hs = net->smc.limit_smc_hs;
384403
smc->use_fallback = false; /* assume rdma capability first */
385404
smc->fallback_rsn = 0;
405+
smc_close_init(smc);
386406
}
387407

388408
static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,
@@ -1289,7 +1309,6 @@ static int smc_connect_rdma(struct smc_sock *smc,
12891309
goto connect_abort;
12901310
}
12911311

1292-
smc_close_init(smc);
12931312
smc_rx_init(smc);
12941313

12951314
if (ini->first_contact_local) {
@@ -1417,7 +1436,14 @@ static int smc_connect_ism(struct smc_sock *smc,
14171436
}
14181437

14191438
smc_conn_save_peer_info(smc, aclc);
1420-
smc_close_init(smc);
1439+
1440+
if (smc_ism_support_dmb_nocopy(smc->conn.lgr->smcd)) {
1441+
rc = smcd_buf_attach(smc);
1442+
if (rc) {
1443+
rc = SMC_CLC_DECL_MEM; /* try to fallback */
1444+
goto connect_abort;
1445+
}
1446+
}
14211447
smc_rx_init(smc);
14221448
smc_tx_init(smc);
14231449

@@ -1448,10 +1474,6 @@ static int smc_connect_ism(struct smc_sock *smc,
14481474
static int smc_connect_check_aclc(struct smc_init_info *ini,
14491475
struct smc_clc_msg_accept_confirm *aclc)
14501476
{
1451-
if (aclc->hdr.typev1 != SMC_TYPE_R &&
1452-
aclc->hdr.typev1 != SMC_TYPE_D)
1453-
return SMC_CLC_DECL_MODEUNSUPP;
1454-
14551477
if (aclc->hdr.version >= SMC_V2) {
14561478
if ((aclc->hdr.typev1 == SMC_TYPE_R &&
14571479
!smcr_indicated(ini->smc_type_v2)) ||
@@ -1505,10 +1527,6 @@ static int __smc_connect(struct smc_sock *smc)
15051527
ini->smcd_version &= ~SMC_V1;
15061528
ini->smcr_version = 0;
15071529
ini->smc_type_v1 = SMC_TYPE_N;
1508-
if (!ini->smcd_version) {
1509-
rc = SMC_CLC_DECL_GETVLANERR;
1510-
goto fallback;
1511-
}
15121530
}
15131531

15141532
rc = smc_find_proposal_devices(smc, ini);
@@ -1891,6 +1909,7 @@ static void smc_listen_out(struct smc_sock *new_smc)
18911909
if (tcp_sk(new_smc->clcsock->sk)->syn_smc)
18921910
atomic_dec(&lsmc->queued_smc_hs);
18931911

1912+
release_sock(newsmcsk); /* lock in smc_listen_work() */
18941913
if (lsmc->sk.sk_state == SMC_LISTEN) {
18951914
lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING);
18961915
smc_accept_enqueue(&lsmc->sk, newsmcsk);
@@ -2419,6 +2438,7 @@ static void smc_listen_work(struct work_struct *work)
24192438
u8 accept_version;
24202439
int rc = 0;
24212440

2441+
lock_sock(&new_smc->sk); /* release in smc_listen_out() */
24222442
if (new_smc->listen_smc->sk.sk_state != SMC_LISTEN)
24232443
return smc_listen_out_err(new_smc);
24242444

@@ -2476,7 +2496,6 @@ static void smc_listen_work(struct work_struct *work)
24762496
goto out_decl;
24772497

24782498
mutex_lock(&smc_server_lgr_pending);
2479-
smc_close_init(new_smc);
24802499
smc_rx_init(new_smc);
24812500
smc_tx_init(new_smc);
24822501

@@ -2528,8 +2547,17 @@ static void smc_listen_work(struct work_struct *work)
25282547
mutex_unlock(&smc_server_lgr_pending);
25292548
}
25302549
smc_conn_save_peer_info(new_smc, cclc);
2531-
smc_listen_out_connected(new_smc);
2550+
2551+
if (ini->is_smcd &&
2552+
smc_ism_support_dmb_nocopy(new_smc->conn.lgr->smcd)) {
2553+
rc = smcd_buf_attach(new_smc);
2554+
if (rc)
2555+
goto out_decl;
2556+
}
2557+
25322558
SMC_STAT_SERV_SUCC_INC(sock_net(newclcsock->sk), ini);
2559+
/* smc_listen_out() will release smcsk */
2560+
smc_listen_out_connected(new_smc);
25332561
goto out_free;
25342562

25352563
out_unlock:
@@ -2711,8 +2739,7 @@ int smc_accept(struct socket *sock, struct socket *new_sock,
27112739

27122740
if (lsmc->sockopt_defer_accept && !(arg->flags & O_NONBLOCK)) {
27132741
/* wait till data arrives on the socket */
2714-
timeo = msecs_to_jiffies(lsmc->sockopt_defer_accept *
2715-
MSEC_PER_SEC);
2742+
timeo = secs_to_jiffies(lsmc->sockopt_defer_accept);
27162743
if (smc_sk(nsk)->use_fallback) {
27172744
struct sock *clcsk = smc_sk(nsk)->clcsock->sk;
27182745

@@ -2722,7 +2749,7 @@ int smc_accept(struct socket *sock, struct socket *new_sock,
27222749
release_sock(clcsk);
27232750
} else if (!atomic_read(&smc_sk(nsk)->conn.bytes_to_rcv)) {
27242751
lock_sock(nsk);
2725-
smc_rx_wait(smc_sk(nsk), &timeo, smc_rx_data_available);
2752+
smc_rx_wait(smc_sk(nsk), &timeo, 0, smc_rx_data_available);
27262753
release_sock(nsk);
27272754
}
27282755
}
@@ -3338,10 +3365,8 @@ int smc_create_clcsk(struct net *net, struct sock *sk, int family)
33383365

33393366
rc = sock_create_kern(net, family, SOCK_STREAM, IPPROTO_TCP,
33403367
&smc->clcsock);
3341-
if (rc) {
3342-
sk_common_release(sk);
3368+
if (rc)
33433369
return rc;
3344-
}
33453370

33463371
/* smc_clcsock_release() does not wait smc->clcsock->sk's
33473372
* destruction; its sk_state might not be TCP_CLOSE after
@@ -3389,6 +3414,11 @@ static int __smc_create(struct net *net, struct socket *sock, int protocol,
33893414
rc = smc_create_clcsk(net, sk, family);
33903415
smc->sk.sk_sndbuf = max(smc->clcsock->sk->sk_sndbuf, SMC_BUF_MIN_SIZE);
33913416
smc->sk.sk_rcvbuf = max(smc->clcsock->sk->sk_rcvbuf, SMC_BUF_MIN_SIZE);
3417+
3418+
if (rc) {
3419+
sk_common_release(sk);
3420+
sock->sk = NULL;
3421+
}
33923422
out:
33933423
return rc;
33943424
}

net/smc/smc.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,15 @@ struct smc_connection {
278278
*/
279279
u64 peer_token; /* SMC-D token of peer */
280280
u8 killed : 1; /* abnormal termination */
281-
u8 freed : 1; /* normal termiation */
281+
u8 freed : 1; /* normal termination */
282282
u8 out_of_sync : 1; /* out of sync with peer */
283283
};
284284

285285
struct smc_sock { /* smc sock container */
286-
struct sock sk;
286+
union {
287+
struct sock sk;
288+
struct inet_sock icsk_inet;
289+
};
287290
struct socket *clcsock; /* internal tcp socket */
288291
void (*clcsk_state_change)(struct sock *sk);
289292
/* original stat_change fct. */

net/smc/smc_clc.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ struct smc_clc_v2_extension {
145145
);
146146
u8 user_eids[][SMC_MAX_EID_LEN];
147147
};
148+
static_assert(offsetof(struct smc_clc_v2_extension, user_eids) == sizeof(struct smc_clc_v2_extension_fixed),
149+
"struct member likely outside of struct_group_tagged()");
148150

149151
struct smc_clc_msg_proposal_prefix { /* prefix part of clc proposal message*/
150152
__be32 outgoing_subnet; /* subnet mask */
@@ -154,7 +156,7 @@ struct smc_clc_msg_proposal_prefix { /* prefix part of clc proposal message*/
154156
} __aligned(4);
155157

156158
struct smc_clc_msg_smcd { /* SMC-D GID information */
157-
struct smc_clc_smcd_gid_chid ism; /* ISM native GID+CHID of requestor */
159+
struct smc_clc_smcd_gid_chid ism; /* ISM native GID+CHID of requester */
158160
__be16 v2_ext_offset; /* SMC Version 2 Extension Offset */
159161
u8 vendor_oui[3]; /* vendor organizationally unique identifier */
160162
u8 vendor_exp_options[5];
@@ -169,6 +171,8 @@ struct smc_clc_smcd_v2_extension {
169171
);
170172
struct smc_clc_smcd_gid_chid gidchid[];
171173
};
174+
static_assert(offsetof(struct smc_clc_smcd_v2_extension, gidchid) == sizeof(struct smc_clc_smcd_v2_extension_fixed),
175+
"struct member likely outside of struct_group_tagged()");
172176

173177
struct smc_clc_msg_proposal { /* clc proposal message sent by Linux */
174178
struct smc_clc_msg_hdr hdr;

0 commit comments

Comments
 (0)