@@ -870,31 +870,37 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry)
870870 struct smc_llc_msg_add_link * llc = & qentry -> msg .add_link ;
871871 enum smc_lgr_type lgr_new_t = SMC_LGR_SYMMETRIC ;
872872 struct smc_link_group * lgr = smc_get_lgr (link );
873+ struct smc_init_info * ini = NULL ;
873874 struct smc_link * lnk_new = NULL ;
874- struct smc_init_info ini ;
875875 int lnk_idx , rc = 0 ;
876876
877877 if (!llc -> qp_mtu )
878878 goto out_reject ;
879879
880- ini .vlan_id = lgr -> vlan_id ;
881- smc_pnet_find_alt_roce (lgr , & ini , link -> smcibdev );
880+ ini = kzalloc (sizeof (* ini ), GFP_KERNEL );
881+ if (!ini ) {
882+ rc = - ENOMEM ;
883+ goto out_reject ;
884+ }
885+
886+ ini -> vlan_id = lgr -> vlan_id ;
887+ smc_pnet_find_alt_roce (lgr , ini , link -> smcibdev );
882888 if (!memcmp (llc -> sender_gid , link -> peer_gid , SMC_GID_SIZE ) &&
883889 !memcmp (llc -> sender_mac , link -> peer_mac , ETH_ALEN )) {
884- if (!ini . ib_dev )
890+ if (!ini -> ib_dev )
885891 goto out_reject ;
886892 lgr_new_t = SMC_LGR_ASYMMETRIC_PEER ;
887893 }
888- if (!ini . ib_dev ) {
894+ if (!ini -> ib_dev ) {
889895 lgr_new_t = SMC_LGR_ASYMMETRIC_LOCAL ;
890- ini . ib_dev = link -> smcibdev ;
891- ini . ib_port = link -> ibport ;
896+ ini -> ib_dev = link -> smcibdev ;
897+ ini -> ib_port = link -> ibport ;
892898 }
893899 lnk_idx = smc_llc_alloc_alt_link (lgr , lgr_new_t );
894900 if (lnk_idx < 0 )
895901 goto out_reject ;
896902 lnk_new = & lgr -> lnk [lnk_idx ];
897- rc = smcr_link_init (lgr , lnk_new , lnk_idx , & ini );
903+ rc = smcr_link_init (lgr , lnk_new , lnk_idx , ini );
898904 if (rc )
899905 goto out_reject ;
900906 smc_llc_save_add_link_info (lnk_new , llc );
@@ -910,7 +916,7 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry)
910916 goto out_clear_lnk ;
911917
912918 rc = smc_llc_send_add_link (link ,
913- lnk_new -> smcibdev -> mac [ini . ib_port - 1 ],
919+ lnk_new -> smcibdev -> mac [ini -> ib_port - 1 ],
914920 lnk_new -> gid , lnk_new , SMC_LLC_RESP );
915921 if (rc )
916922 goto out_clear_lnk ;
@@ -919,7 +925,7 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry)
919925 rc = 0 ;
920926 goto out_clear_lnk ;
921927 }
922- rc = smc_llc_cli_conf_link (link , & ini , lnk_new , lgr_new_t );
928+ rc = smc_llc_cli_conf_link (link , ini , lnk_new , lgr_new_t );
923929 if (!rc )
924930 goto out ;
925931out_clear_lnk :
@@ -928,6 +934,7 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry)
928934out_reject :
929935 smc_llc_cli_add_link_reject (qentry );
930936out :
937+ kfree (ini );
931938 kfree (qentry );
932939 return rc ;
933940}
@@ -937,20 +944,25 @@ static void smc_llc_cli_add_link_invite(struct smc_link *link,
937944 struct smc_llc_qentry * qentry )
938945{
939946 struct smc_link_group * lgr = smc_get_lgr (link );
940- struct smc_init_info ini ;
947+ struct smc_init_info * ini = NULL ;
941948
942949 if (lgr -> type == SMC_LGR_SYMMETRIC ||
943950 lgr -> type == SMC_LGR_ASYMMETRIC_PEER )
944951 goto out ;
945952
946- ini .vlan_id = lgr -> vlan_id ;
947- smc_pnet_find_alt_roce (lgr , & ini , link -> smcibdev );
948- if (!ini .ib_dev )
953+ ini = kzalloc (sizeof (* ini ), GFP_KERNEL );
954+ if (!ini )
955+ goto out ;
956+
957+ ini -> vlan_id = lgr -> vlan_id ;
958+ smc_pnet_find_alt_roce (lgr , ini , link -> smcibdev );
959+ if (!ini -> ib_dev )
949960 goto out ;
950961
951- smc_llc_send_add_link (link , ini . ib_dev -> mac [ini . ib_port - 1 ],
952- ini . ib_gid , NULL , SMC_LLC_REQ );
962+ smc_llc_send_add_link (link , ini -> ib_dev -> mac [ini -> ib_port - 1 ],
963+ ini -> ib_gid , NULL , SMC_LLC_REQ );
953964out :
965+ kfree (ini );
954966 kfree (qentry );
955967}
956968
@@ -1158,28 +1170,34 @@ int smc_llc_srv_add_link(struct smc_link *link)
11581170 struct smc_link_group * lgr = link -> lgr ;
11591171 struct smc_llc_msg_add_link * add_llc ;
11601172 struct smc_llc_qentry * qentry = NULL ;
1161- struct smc_link * link_new ;
1162- struct smc_init_info ini ;
1173+ struct smc_link * link_new = NULL ;
1174+ struct smc_init_info * ini ;
11631175 int lnk_idx , rc = 0 ;
11641176
1177+ ini = kzalloc (sizeof (* ini ), GFP_KERNEL );
1178+ if (!ini )
1179+ return - ENOMEM ;
1180+
11651181 /* ignore client add link recommendation, start new flow */
1166- ini . vlan_id = lgr -> vlan_id ;
1167- smc_pnet_find_alt_roce (lgr , & ini , link -> smcibdev );
1168- if (!ini . ib_dev ) {
1182+ ini -> vlan_id = lgr -> vlan_id ;
1183+ smc_pnet_find_alt_roce (lgr , ini , link -> smcibdev );
1184+ if (!ini -> ib_dev ) {
11691185 lgr_new_t = SMC_LGR_ASYMMETRIC_LOCAL ;
1170- ini . ib_dev = link -> smcibdev ;
1171- ini . ib_port = link -> ibport ;
1186+ ini -> ib_dev = link -> smcibdev ;
1187+ ini -> ib_port = link -> ibport ;
11721188 }
11731189 lnk_idx = smc_llc_alloc_alt_link (lgr , lgr_new_t );
1174- if (lnk_idx < 0 )
1175- return 0 ;
1190+ if (lnk_idx < 0 ) {
1191+ rc = 0 ;
1192+ goto out ;
1193+ }
11761194
1177- rc = smcr_link_init (lgr , & lgr -> lnk [lnk_idx ], lnk_idx , & ini );
1195+ rc = smcr_link_init (lgr , & lgr -> lnk [lnk_idx ], lnk_idx , ini );
11781196 if (rc )
1179- return rc ;
1197+ goto out ;
11801198 link_new = & lgr -> lnk [lnk_idx ];
11811199 rc = smc_llc_send_add_link (link ,
1182- link_new -> smcibdev -> mac [ini . ib_port - 1 ],
1200+ link_new -> smcibdev -> mac [ini -> ib_port - 1 ],
11831201 link_new -> gid , link_new , SMC_LLC_REQ );
11841202 if (rc )
11851203 goto out_err ;
@@ -1218,10 +1236,15 @@ int smc_llc_srv_add_link(struct smc_link *link)
12181236 rc = smc_llc_srv_conf_link (link , link_new , lgr_new_t );
12191237 if (rc )
12201238 goto out_err ;
1239+ kfree (ini );
12211240 return 0 ;
12221241out_err :
1223- link_new -> state = SMC_LNK_INACTIVE ;
1224- smcr_link_clear (link_new , false);
1242+ if (link_new ) {
1243+ link_new -> state = SMC_LNK_INACTIVE ;
1244+ smcr_link_clear (link_new , false);
1245+ }
1246+ out :
1247+ kfree (ini );
12251248 return rc ;
12261249}
12271250
0 commit comments