Hi all, On Fri, 27 Jul 2018 13:28:47 +1000 Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx> wrote: > > I applied this merge fix patch: The final conflict resolution actually looks like this: (the rdma tree changes to net/smc/smc_core.c are dropped) c1d4bb2af93573ee4a21538a1a97b568a2344499 diff --cc net/smc/smc_ib.c index 74f29f814ec1,2cc64bc8ae20..debc6e44f738 --- a/net/smc/smc_ib.c +++ b/net/smc/smc_ib.c @@@ -144,6 -142,93 +143,95 @@@ out return rc; } + static int smc_ib_fill_mac(struct smc_ib_device *smcibdev, u8 ibport) + { - struct ib_gid_attr gattr; - union ib_gid gid; - int rc; ++ const struct ib_gid_attr *gattr; ++ int rc = 0; + - rc = ib_query_gid(smcibdev->ibdev, ibport, 0, &gid, &gattr); - if (rc || !gattr.ndev) - return -ENODEV; ++ gattr = rdma_get_gid_attr(smcibdev->ibdev, ibport, 0); ++ if (IS_ERR(gattr)) ++ return PTR_ERR(gattr); ++ if (!gattr->ndev) { ++ rc = -ENODEV; ++ goto done; ++ } + - memcpy(smcibdev->mac[ibport - 1], gattr.ndev->dev_addr, ETH_ALEN); - dev_put(gattr.ndev); - return 0; ++ memcpy(smcibdev->mac[ibport - 1], gattr->ndev->dev_addr, ETH_ALEN); ++done: ++ rdma_put_gid_attr(gattr); ++ return rc; + } + + /* Create an identifier unique for this instance of SMC-R. + * The MAC-address of the first active registered IB device + * plus a random 2-byte number is used to create this identifier. + * This name is delivered to the peer during connection initialization. + */ + static inline void smc_ib_define_local_systemid(struct smc_ib_device *smcibdev, + u8 ibport) + { + memcpy(&local_systemid[2], &smcibdev->mac[ibport - 1], + sizeof(smcibdev->mac[ibport - 1])); + get_random_bytes(&local_systemid[0], 2); + } + + bool smc_ib_port_active(struct smc_ib_device *smcibdev, u8 ibport) + { + return smcibdev->pattr[ibport - 1].state == IB_PORT_ACTIVE; + } + + /* determine the gid for an ib-device port and vlan id */ + int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport, + unsigned short vlan_id, u8 gid[], u8 *sgid_index) + { - struct ib_gid_attr gattr; - union ib_gid _gid; ++ const struct ib_gid_attr *gattr; + int i; + + for (i = 0; i < smcibdev->pattr[ibport - 1].gid_tbl_len; i++) { - memset(&_gid, 0, SMC_GID_SIZE); - memset(&gattr, 0, sizeof(gattr)); - if (ib_query_gid(smcibdev->ibdev, ibport, i, &_gid, &gattr)) ++ gattr = rdma_get_gid_attr(smcibdev->ibdev, ibport, i); ++ if (IS_ERR(gattr)) + continue; - if (!gattr.ndev) ++ if (!gattr->ndev) + continue; - if (((!vlan_id && !is_vlan_dev(gattr.ndev)) || - (vlan_id && is_vlan_dev(gattr.ndev) && - vlan_dev_vlan_id(gattr.ndev) == vlan_id)) && - gattr.gid_type == IB_GID_TYPE_IB) { ++ if (((!vlan_id && !is_vlan_dev(gattr->ndev)) || ++ (vlan_id && is_vlan_dev(gattr->ndev) && ++ vlan_dev_vlan_id(gattr->ndev) == vlan_id)) && ++ gattr->gid_type == IB_GID_TYPE_IB) { + if (gid) - memcpy(gid, &_gid, SMC_GID_SIZE); ++ memcpy(gid, &gattr->gid, SMC_GID_SIZE); + if (sgid_index) + *sgid_index = i; - dev_put(gattr.ndev); ++ rdma_put_gid_attr(gattr); + return 0; + } - dev_put(gattr.ndev); ++ rdma_put_gid_attr(gattr); + } + return -ENODEV; + } + + static int smc_ib_remember_port_attr(struct smc_ib_device *smcibdev, u8 ibport) + { + int rc; + + memset(&smcibdev->pattr[ibport - 1], 0, + sizeof(smcibdev->pattr[ibport - 1])); + rc = ib_query_port(smcibdev->ibdev, ibport, + &smcibdev->pattr[ibport - 1]); + if (rc) + goto out; + /* the SMC protocol requires specification of the RoCE MAC address */ + rc = smc_ib_fill_mac(smcibdev, ibport); + if (rc) + goto out; + if (!strncmp(local_systemid, SMC_LOCAL_SYSTEMID_RESET, + sizeof(local_systemid)) && + smc_ib_port_active(smcibdev, ibport)) + /* create unique system identifier */ + smc_ib_define_local_systemid(smcibdev, ibport); + out: + return rc; + } + /* process context wrapper for might_sleep smc_ib_remember_port_attr */ static void smc_ib_port_event_work(struct work_struct *work) { -- Cheers, Stephen Rothwell
Attachment:
pgpzWrpcrjlsh.pgp
Description: OpenPGP digital signature