net/smc: support extended GID in SMC-D lgr netlink attribute
authorWen Gu <guwen@linux.alibaba.com>
Tue, 19 Dec 2023 14:26:14 +0000 (22:26 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 Dec 2023 20:24:33 +0000 (20:24 +0000)
Virtual ISM devices introduced in SMCv2.1 requires a 128 bit extended
GID vs. the existing ISM 64bit GID. So the 2nd 64 bit of extended GID
should be included in SMC-D linkgroup netlink attribute as well.

Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/smc.h
include/uapi/linux/smc_diag.h
net/smc/smc_core.c
net/smc/smc_diag.c

index 837fcd4b0abcc9e047ba237a1799ef006c2b9b8e..b531e3ef011a4f6b50358daf6d82aa12c4bded48 100644 (file)
@@ -160,6 +160,8 @@ enum {
        SMC_NLA_LGR_D_CHID,             /* u16 */
        SMC_NLA_LGR_D_PAD,              /* flag */
        SMC_NLA_LGR_D_V2_COMMON,        /* nest */
+       SMC_NLA_LGR_D_EXT_GID,          /* u64 */
+       SMC_NLA_LGR_D_PEER_EXT_GID,     /* u64 */
        __SMC_NLA_LGR_D_MAX,
        SMC_NLA_LGR_D_MAX = __SMC_NLA_LGR_D_MAX - 1
 };
index 8cb3a6fef55301e8432ea99421b60b7d96ecad45..58eceb7f5df260b878303e84424eb6bf6faddc00 100644 (file)
@@ -107,6 +107,8 @@ struct smcd_diag_dmbinfo {          /* SMC-D Socket internals */
        __aligned_u64   my_gid;         /* My GID */
        __aligned_u64   token;          /* Token of DMB */
        __aligned_u64   peer_token;     /* Token of remote DMBE */
+       __aligned_u64   peer_gid_ext;   /* Peer GID (extended part) */
+       __aligned_u64   my_gid_ext;     /* My GID (extended part) */
 };
 
 #endif /* _UAPI_SMC_DIAG_H_ */
index 672eff0877328d2a265acc5f6fcf3d7f2da7f1c3..95cc95458e2d8d2c2c3578088544ee1abe0ea8a6 100644 (file)
@@ -526,9 +526,15 @@ static int smc_nl_fill_smcd_lgr(struct smc_link_group *lgr,
        if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_GID,
                              smcd_gid.gid, SMC_NLA_LGR_D_PAD))
                goto errattr;
+       if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_EXT_GID,
+                             smcd_gid.gid_ext, SMC_NLA_LGR_D_PAD))
+               goto errattr;
        if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_PEER_GID, lgr->peer_gid.gid,
                              SMC_NLA_LGR_D_PAD))
                goto errattr;
+       if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_PEER_EXT_GID,
+                             lgr->peer_gid.gid_ext, SMC_NLA_LGR_D_PAD))
+               goto errattr;
        if (nla_put_u8(skb, SMC_NLA_LGR_D_VLAN_ID, lgr->vlan_id))
                goto errattr;
        if (nla_put_u32(skb, SMC_NLA_LGR_D_CONNS_NUM, lgr->conns_num))
index c180c180d0d15788d96e39ba9dc31383c5156c9b..3fbe14e09ad8c74800fbde9d7d9f989bba3f1473 100644 (file)
@@ -175,8 +175,10 @@ static int __smc_diag_dump(struct sock *sk, struct sk_buff *skb,
 
                dinfo.linkid = *((u32 *)conn->lgr->id);
                dinfo.peer_gid = conn->lgr->peer_gid.gid;
+               dinfo.peer_gid_ext = conn->lgr->peer_gid.gid_ext;
                smcd->ops->get_local_gid(smcd, &smcd_gid);
                dinfo.my_gid = smcd_gid.gid;
+               dinfo.my_gid_ext = smcd_gid.gid_ext;
                dinfo.token = conn->rmb_desc->token;
                dinfo.peer_token = conn->peer_token;