Skip to content

Commit ed990df

Browse files
karstengrdavem330
authored andcommitted
net/smc: save stack space and allocate smc_init_info
The struct smc_init_info grew over time, its time to save space on stack and allocate this struct dynamically. Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 24bcbe1 commit ed990df

File tree

1 file changed

+53
-30
lines changed

1 file changed

+53
-30
lines changed

net/smc/smc_llc.c

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
925931
out_clear_lnk:
@@ -928,6 +934,7 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry)
928934
out_reject:
929935
smc_llc_cli_add_link_reject(qentry);
930936
out:
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);
953964
out:
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;
12221241
out_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

Comments
 (0)