Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/smc: consolidate function parameters

During initialization of an SMC socket a lot of function parameters need
to get passed down the function call path. Consolidate the parameters
in a helper struct so there are less enough parameters to get all passed
by register.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Karsten Graul and committed by
David S. Miller
bc36d2fc 59886697

+139 -141
+56 -62
net/smc/af_smc.c
··· 496 496 497 497 /* check if there is a rdma device available for this connection. */ 498 498 /* called for connect and listen */ 499 - static int smc_check_rdma(struct smc_sock *smc, struct smc_ib_device **ibdev, 500 - u8 *ibport, unsigned short vlan_id, u8 gid[]) 499 + static int smc_check_rdma(struct smc_sock *smc, struct smc_init_info *ini) 501 500 { 502 - int reason_code = 0; 503 - 504 501 /* PNET table look up: search active ib_device and port 505 502 * within same PNETID that also contains the ethernet device 506 503 * used for the internal TCP socket 507 504 */ 508 - smc_pnet_find_roce_resource(smc->clcsock->sk, ibdev, ibport, vlan_id, 509 - gid); 510 - if (!(*ibdev)) 511 - reason_code = SMC_CLC_DECL_CNFERR; /* configuration error */ 512 - 513 - return reason_code; 505 + smc_pnet_find_roce_resource(smc->clcsock->sk, ini); 506 + if (!(ini->ib_dev)) 507 + return SMC_CLC_DECL_CNFERR; /* configuration error */ 508 + return 0; 514 509 } 515 510 516 511 /* check if there is an ISM device available for this connection. */ 517 512 /* called for connect and listen */ 518 - static int smc_check_ism(struct smc_sock *smc, struct smcd_dev **ismdev) 513 + static int smc_check_ism(struct smc_sock *smc, struct smc_init_info *ini) 519 514 { 520 515 /* Find ISM device with same PNETID as connecting interface */ 521 - smc_pnet_find_ism_resource(smc->clcsock->sk, ismdev); 522 - if (!(*ismdev)) 516 + smc_pnet_find_ism_resource(smc->clcsock->sk, ini); 517 + if (!ini->ism_dev) 523 518 return SMC_CLC_DECL_CNFERR; /* configuration error */ 524 519 return 0; 525 520 } 526 521 527 522 /* Check for VLAN ID and register it on ISM device just for CLC handshake */ 528 523 static int smc_connect_ism_vlan_setup(struct smc_sock *smc, 529 - struct smcd_dev *ismdev, 530 - unsigned short vlan_id) 524 + struct smc_init_info *ini) 531 525 { 532 - if (vlan_id && smc_ism_get_vlan(ismdev, vlan_id)) 526 + if (ini->vlan_id && smc_ism_get_vlan(ini->ism_dev, ini->vlan_id)) 533 527 return SMC_CLC_DECL_CNFERR; 534 528 return 0; 535 529 } ··· 532 538 * used, the VLAN ID will be registered again during the connection setup. 533 539 */ 534 540 static int smc_connect_ism_vlan_cleanup(struct smc_sock *smc, bool is_smcd, 535 - struct smcd_dev *ismdev, 536 - unsigned short vlan_id) 541 + struct smc_init_info *ini) 537 542 { 538 543 if (!is_smcd) 539 544 return 0; 540 - if (vlan_id && smc_ism_put_vlan(ismdev, vlan_id)) 545 + if (ini->vlan_id && smc_ism_put_vlan(ini->ism_dev, ini->vlan_id)) 541 546 return SMC_CLC_DECL_CNFERR; 542 547 return 0; 543 548 } ··· 544 551 /* CLC handshake during connect */ 545 552 static int smc_connect_clc(struct smc_sock *smc, int smc_type, 546 553 struct smc_clc_msg_accept_confirm *aclc, 547 - struct smc_ib_device *ibdev, u8 ibport, 548 - u8 gid[], struct smcd_dev *ismdev) 554 + struct smc_init_info *ini) 549 555 { 550 556 int rc = 0; 551 557 552 558 /* do inband token exchange */ 553 - rc = smc_clc_send_proposal(smc, smc_type, ibdev, ibport, gid, ismdev); 559 + rc = smc_clc_send_proposal(smc, smc_type, ini); 554 560 if (rc) 555 561 return rc; 556 562 /* receive SMC Accept CLC message */ ··· 560 568 /* setup for RDMA connection of client */ 561 569 static int smc_connect_rdma(struct smc_sock *smc, 562 570 struct smc_clc_msg_accept_confirm *aclc, 563 - struct smc_ib_device *ibdev, u8 ibport) 571 + struct smc_init_info *ini) 564 572 { 565 573 int local_contact = SMC_FIRST_CONTACT; 566 574 struct smc_link *link; 567 575 int reason_code = 0; 568 576 577 + ini->is_smcd = false; 578 + ini->ib_lcl = &aclc->lcl; 579 + ini->ib_clcqpn = ntoh24(aclc->qpn); 580 + ini->srv_first_contact = aclc->hdr.flag; 581 + 569 582 mutex_lock(&smc_client_lgr_pending); 570 - local_contact = smc_conn_create(smc, false, aclc->hdr.flag, ibdev, 571 - ibport, ntoh24(aclc->qpn), &aclc->lcl, 572 - NULL, 0); 583 + local_contact = smc_conn_create(smc, ini); 573 584 if (local_contact < 0) { 574 585 if (local_contact == -ENOMEM) 575 586 reason_code = SMC_CLC_DECL_MEM;/* insufficient memory*/ ··· 638 643 /* setup for ISM connection of client */ 639 644 static int smc_connect_ism(struct smc_sock *smc, 640 645 struct smc_clc_msg_accept_confirm *aclc, 641 - struct smcd_dev *ismdev) 646 + struct smc_init_info *ini) 642 647 { 643 648 int local_contact = SMC_FIRST_CONTACT; 644 649 int rc = 0; 645 650 651 + ini->is_smcd = true; 652 + ini->ism_gid = aclc->gid; 653 + ini->srv_first_contact = aclc->hdr.flag; 654 + 646 655 /* there is only one lgr role for SMC-D; use server lock */ 647 656 mutex_lock(&smc_server_lgr_pending); 648 - local_contact = smc_conn_create(smc, true, aclc->hdr.flag, NULL, 0, 0, 649 - NULL, ismdev, aclc->gid); 657 + local_contact = smc_conn_create(smc, ini); 650 658 if (local_contact < 0) { 651 659 mutex_unlock(&smc_server_lgr_pending); 652 660 return SMC_CLC_DECL_MEM; ··· 682 684 { 683 685 bool ism_supported = false, rdma_supported = false; 684 686 struct smc_clc_msg_accept_confirm aclc; 685 - struct smc_ib_device *ibdev; 686 - struct smcd_dev *ismdev; 687 - u8 gid[SMC_GID_SIZE]; 688 - unsigned short vlan; 687 + struct smc_init_info ini = {0}; 689 688 int smc_type; 690 689 int rc = 0; 691 - u8 ibport; 692 690 693 691 sock_hold(&smc->sk); /* sock put in passive closing */ 694 692 ··· 700 706 return smc_connect_decline_fallback(smc, SMC_CLC_DECL_IPSEC); 701 707 702 708 /* check for VLAN ID */ 703 - if (smc_vlan_by_tcpsk(smc->clcsock, &vlan)) 709 + if (smc_vlan_by_tcpsk(smc->clcsock, &ini)) 704 710 return smc_connect_decline_fallback(smc, SMC_CLC_DECL_CNFERR); 705 711 706 712 /* check if there is an ism device available */ 707 - if (!smc_check_ism(smc, &ismdev) && 708 - !smc_connect_ism_vlan_setup(smc, ismdev, vlan)) { 713 + if (!smc_check_ism(smc, &ini) && 714 + !smc_connect_ism_vlan_setup(smc, &ini)) { 709 715 /* ISM is supported for this connection */ 710 716 ism_supported = true; 711 717 smc_type = SMC_TYPE_D; 712 718 } 713 719 714 720 /* check if there is a rdma device available */ 715 - if (!smc_check_rdma(smc, &ibdev, &ibport, vlan, gid)) { 721 + if (!smc_check_rdma(smc, &ini)) { 716 722 /* RDMA is supported for this connection */ 717 723 rdma_supported = true; 718 724 if (ism_supported) ··· 726 732 return smc_connect_decline_fallback(smc, SMC_CLC_DECL_NOSMCDEV); 727 733 728 734 /* perform CLC handshake */ 729 - rc = smc_connect_clc(smc, smc_type, &aclc, ibdev, ibport, gid, ismdev); 735 + rc = smc_connect_clc(smc, smc_type, &aclc, &ini); 730 736 if (rc) { 731 - smc_connect_ism_vlan_cleanup(smc, ism_supported, ismdev, vlan); 737 + smc_connect_ism_vlan_cleanup(smc, ism_supported, &ini); 732 738 return smc_connect_decline_fallback(smc, rc); 733 739 } 734 740 735 741 /* depending on previous steps, connect using rdma or ism */ 736 742 if (rdma_supported && aclc.hdr.path == SMC_TYPE_R) 737 - rc = smc_connect_rdma(smc, &aclc, ibdev, ibport); 743 + rc = smc_connect_rdma(smc, &aclc, &ini); 738 744 else if (ism_supported && aclc.hdr.path == SMC_TYPE_D) 739 - rc = smc_connect_ism(smc, &aclc, ismdev); 745 + rc = smc_connect_ism(smc, &aclc, &ini); 740 746 else 741 747 rc = SMC_CLC_DECL_MODEUNSUPP; 742 748 if (rc) { 743 - smc_connect_ism_vlan_cleanup(smc, ism_supported, ismdev, vlan); 749 + smc_connect_ism_vlan_cleanup(smc, ism_supported, &ini); 744 750 return smc_connect_decline_fallback(smc, rc); 745 751 } 746 752 747 - smc_connect_ism_vlan_cleanup(smc, ism_supported, ismdev, vlan); 753 + smc_connect_ism_vlan_cleanup(smc, ism_supported, &ini); 748 754 return 0; 749 755 } 750 756 ··· 1113 1119 1114 1120 /* listen worker: initialize connection and buffers */ 1115 1121 static int smc_listen_rdma_init(struct smc_sock *new_smc, 1116 - struct smc_clc_msg_proposal *pclc, 1117 - struct smc_ib_device *ibdev, u8 ibport, 1118 - int *local_contact) 1122 + struct smc_init_info *ini, int *local_contact) 1119 1123 { 1120 1124 /* allocate connection / link group */ 1121 - *local_contact = smc_conn_create(new_smc, false, 0, ibdev, ibport, 0, 1122 - &pclc->lcl, NULL, 0); 1125 + *local_contact = smc_conn_create(new_smc, ini); 1123 1126 if (*local_contact < 0) { 1124 1127 if (*local_contact == -ENOMEM) 1125 1128 return SMC_CLC_DECL_MEM;/* insufficient memory*/ ··· 1133 1142 /* listen worker: initialize connection and buffers for SMC-D */ 1134 1143 static int smc_listen_ism_init(struct smc_sock *new_smc, 1135 1144 struct smc_clc_msg_proposal *pclc, 1136 - struct smcd_dev *ismdev, 1145 + struct smc_init_info *ini, 1137 1146 int *local_contact) 1138 1147 { 1139 1148 struct smc_clc_msg_smcd *pclc_smcd; 1140 1149 1141 1150 pclc_smcd = smc_get_clc_msg_smcd(pclc); 1142 - *local_contact = smc_conn_create(new_smc, true, 0, NULL, 0, 0, NULL, 1143 - ismdev, pclc_smcd->gid); 1151 + ini->ism_gid = pclc_smcd->gid; 1152 + *local_contact = smc_conn_create(new_smc, ini); 1144 1153 if (*local_contact < 0) { 1145 1154 if (*local_contact == -ENOMEM) 1146 1155 return SMC_CLC_DECL_MEM;/* insufficient memory*/ ··· 1223 1232 struct socket *newclcsock = new_smc->clcsock; 1224 1233 struct smc_clc_msg_accept_confirm cclc; 1225 1234 struct smc_clc_msg_proposal *pclc; 1226 - struct smc_ib_device *ibdev; 1235 + struct smc_init_info ini = {0}; 1227 1236 bool ism_supported = false; 1228 - struct smcd_dev *ismdev; 1229 1237 u8 buf[SMC_CLC_MAX_LEN]; 1230 1238 int local_contact = 0; 1231 - unsigned short vlan; 1232 1239 int reason_code = 0; 1233 1240 int rc = 0; 1234 - u8 ibport; 1235 1241 1236 1242 if (new_smc->use_fallback) { 1237 1243 smc_listen_out_connected(new_smc); ··· 1272 1284 smc_rx_init(new_smc); 1273 1285 smc_tx_init(new_smc); 1274 1286 1287 + /* prepare ISM check */ 1288 + ini.is_smcd = true; 1275 1289 /* check if ISM is available */ 1276 1290 if ((pclc->hdr.path == SMC_TYPE_D || pclc->hdr.path == SMC_TYPE_B) && 1277 - !smc_check_ism(new_smc, &ismdev) && 1278 - !smc_listen_ism_init(new_smc, pclc, ismdev, &local_contact)) { 1291 + !smc_check_ism(new_smc, &ini) && 1292 + !smc_listen_ism_init(new_smc, pclc, &ini, &local_contact)) { 1279 1293 ism_supported = true; 1294 + } else { 1295 + /* prepare RDMA check */ 1296 + memset(&ini, 0, sizeof(ini)); 1297 + ini.is_smcd = false; 1298 + ini.ib_lcl = &pclc->lcl; 1280 1299 } 1281 1300 1282 1301 /* check if RDMA is available */ 1283 1302 if (!ism_supported && 1284 1303 ((pclc->hdr.path != SMC_TYPE_R && pclc->hdr.path != SMC_TYPE_B) || 1285 - smc_vlan_by_tcpsk(new_smc->clcsock, &vlan) || 1286 - smc_check_rdma(new_smc, &ibdev, &ibport, vlan, NULL) || 1287 - smc_listen_rdma_init(new_smc, pclc, ibdev, ibport, 1288 - &local_contact) || 1304 + smc_vlan_by_tcpsk(new_smc->clcsock, &ini) || 1305 + smc_check_rdma(new_smc, &ini) || 1306 + smc_listen_rdma_init(new_smc, &ini, &local_contact) || 1289 1307 smc_listen_rdma_reg(new_smc, local_contact))) { 1290 1308 /* SMC not supported, decline */ 1291 1309 mutex_unlock(&smc_server_lgr_pending);
+5 -5
net/smc/smc_clc.c
··· 385 385 386 386 /* send CLC PROPOSAL message across internal TCP socket */ 387 387 int smc_clc_send_proposal(struct smc_sock *smc, int smc_type, 388 - struct smc_ib_device *ibdev, u8 ibport, u8 gid[], 389 - struct smcd_dev *ismdev) 388 + struct smc_init_info *ini) 390 389 { 391 390 struct smc_clc_ipv6_prefix ipv6_prfx[SMC_CLC_MAX_V6_PREFIX]; 392 391 struct smc_clc_msg_proposal_prefix pclc_prfx; ··· 415 416 /* add SMC-R specifics */ 416 417 memcpy(pclc.lcl.id_for_peer, local_systemid, 417 418 sizeof(local_systemid)); 418 - memcpy(&pclc.lcl.gid, gid, SMC_GID_SIZE); 419 - memcpy(&pclc.lcl.mac, &ibdev->mac[ibport - 1], ETH_ALEN); 419 + memcpy(&pclc.lcl.gid, ini->ib_gid, SMC_GID_SIZE); 420 + memcpy(&pclc.lcl.mac, &ini->ib_dev->mac[ini->ib_port - 1], 421 + ETH_ALEN); 420 422 pclc.iparea_offset = htons(0); 421 423 } 422 424 if (smc_type == SMC_TYPE_D || smc_type == SMC_TYPE_B) { ··· 425 425 memset(&pclc_smcd, 0, sizeof(pclc_smcd)); 426 426 plen += sizeof(pclc_smcd); 427 427 pclc.iparea_offset = htons(SMC_CLC_PROPOSAL_MAX_OFFSET); 428 - pclc_smcd.gid = ismdev->local_gid; 428 + pclc_smcd.gid = ini->ism_dev->local_gid; 429 429 } 430 430 pclc.hdr.length = htons(plen); 431 431
+2 -2
net/smc/smc_clc.h
··· 180 180 } 181 181 182 182 struct smcd_dev; 183 + struct smc_init_info; 183 184 184 185 int smc_clc_prfx_match(struct socket *clcsock, 185 186 struct smc_clc_msg_proposal_prefix *prop); ··· 188 187 u8 expected_type, unsigned long timeout); 189 188 int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info); 190 189 int smc_clc_send_proposal(struct smc_sock *smc, int smc_type, 191 - struct smc_ib_device *smcibdev, u8 ibport, u8 gid[], 192 - struct smcd_dev *ismdev); 190 + struct smc_init_info *ini); 193 191 int smc_clc_send_confirm(struct smc_sock *smc); 194 192 int smc_clc_send_accept(struct smc_sock *smc, int srv_first_contact); 195 193
+33 -37
net/smc/smc_core.c
··· 195 195 } 196 196 197 197 /* create a new SMC link group */ 198 - static int smc_lgr_create(struct smc_sock *smc, bool is_smcd, 199 - struct smc_ib_device *smcibdev, u8 ibport, 200 - char *peer_systemid, unsigned short vlan_id, 201 - struct smcd_dev *smcismdev, u64 peer_gid) 198 + static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini) 202 199 { 203 200 struct smc_link_group *lgr; 204 201 struct smc_link *lnk; ··· 203 206 int rc = 0; 204 207 int i; 205 208 206 - if (is_smcd && vlan_id) { 207 - rc = smc_ism_get_vlan(smcismdev, vlan_id); 209 + if (ini->is_smcd && ini->vlan_id) { 210 + rc = smc_ism_get_vlan(ini->ism_dev, ini->vlan_id); 208 211 if (rc) 209 212 goto out; 210 213 } ··· 214 217 rc = -ENOMEM; 215 218 goto out; 216 219 } 217 - lgr->is_smcd = is_smcd; 220 + lgr->is_smcd = ini->is_smcd; 218 221 lgr->sync_err = 0; 219 - lgr->vlan_id = vlan_id; 222 + lgr->vlan_id = ini->vlan_id; 220 223 rwlock_init(&lgr->sndbufs_lock); 221 224 rwlock_init(&lgr->rmbs_lock); 222 225 rwlock_init(&lgr->conns_lock); ··· 228 231 memcpy(&lgr->id, (u8 *)&smc_lgr_list.num, SMC_LGR_ID_SIZE); 229 232 INIT_DELAYED_WORK(&lgr->free_work, smc_lgr_free_work); 230 233 lgr->conns_all = RB_ROOT; 231 - if (is_smcd) { 234 + if (ini->is_smcd) { 232 235 /* SMC-D specific settings */ 233 - lgr->peer_gid = peer_gid; 234 - lgr->smcd = smcismdev; 236 + lgr->peer_gid = ini->ism_gid; 237 + lgr->smcd = ini->ism_dev; 235 238 } else { 236 239 /* SMC-R specific settings */ 237 240 lgr->role = smc->listen_smc ? SMC_SERV : SMC_CLNT; 238 - memcpy(lgr->peer_systemid, peer_systemid, SMC_SYSTEMID_LEN); 241 + memcpy(lgr->peer_systemid, ini->ib_lcl->id_for_peer, 242 + SMC_SYSTEMID_LEN); 239 243 240 244 lnk = &lgr->lnk[SMC_SINGLE_LINK]; 241 245 /* initialize link */ 242 246 lnk->state = SMC_LNK_ACTIVATING; 243 247 lnk->link_id = SMC_SINGLE_LINK; 244 - lnk->smcibdev = smcibdev; 245 - lnk->ibport = ibport; 246 - lnk->path_mtu = smcibdev->pattr[ibport - 1].active_mtu; 247 - if (!smcibdev->initialized) 248 - smc_ib_setup_per_ibdev(smcibdev); 248 + lnk->smcibdev = ini->ib_dev; 249 + lnk->ibport = ini->ib_port; 250 + lnk->path_mtu = 251 + ini->ib_dev->pattr[ini->ib_port - 1].active_mtu; 252 + if (!ini->ib_dev->initialized) 253 + smc_ib_setup_per_ibdev(ini->ib_dev); 249 254 get_random_bytes(rndvec, sizeof(rndvec)); 250 255 lnk->psn_initial = rndvec[0] + (rndvec[1] << 8) + 251 256 (rndvec[2] << 16); 252 257 rc = smc_ib_determine_gid(lnk->smcibdev, lnk->ibport, 253 - vlan_id, lnk->gid, &lnk->sgid_index); 258 + ini->vlan_id, lnk->gid, 259 + &lnk->sgid_index); 254 260 if (rc) 255 261 goto free_lgr; 256 262 rc = smc_llc_link_init(lnk); ··· 528 528 /* Determine vlan of internal TCP socket. 529 529 * @vlan_id: address to store the determined vlan id into 530 530 */ 531 - int smc_vlan_by_tcpsk(struct socket *clcsock, unsigned short *vlan_id) 531 + int smc_vlan_by_tcpsk(struct socket *clcsock, struct smc_init_info *ini) 532 532 { 533 533 struct dst_entry *dst = sk_dst_get(clcsock->sk); 534 534 struct net_device *ndev; 535 535 int i, nest_lvl, rc = 0; 536 536 537 - *vlan_id = 0; 537 + ini->vlan_id = 0; 538 538 if (!dst) { 539 539 rc = -ENOTCONN; 540 540 goto out; ··· 546 546 547 547 ndev = dst->dev; 548 548 if (is_vlan_dev(ndev)) { 549 - *vlan_id = vlan_dev_vlan_id(ndev); 549 + ini->vlan_id = vlan_dev_vlan_id(ndev); 550 550 goto out_rel; 551 551 } 552 552 ··· 560 560 lower = lower->next; 561 561 ndev = (struct net_device *)netdev_lower_get_next(ndev, &lower); 562 562 if (is_vlan_dev(ndev)) { 563 - *vlan_id = vlan_dev_vlan_id(ndev); 563 + ini->vlan_id = vlan_dev_vlan_id(ndev); 564 564 break; 565 565 } 566 566 } ··· 594 594 } 595 595 596 596 /* create a new SMC connection (and a new link group if necessary) */ 597 - int smc_conn_create(struct smc_sock *smc, bool is_smcd, int srv_first_contact, 598 - struct smc_ib_device *smcibdev, u8 ibport, u32 clcqpn, 599 - struct smc_clc_msg_local *lcl, struct smcd_dev *smcd, 600 - u64 peer_gid) 597 + int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini) 601 598 { 602 599 struct smc_connection *conn = &smc->conn; 603 600 int local_contact = SMC_FIRST_CONTACT; 604 601 struct smc_link_group *lgr; 605 - unsigned short vlan_id; 606 602 enum smc_lgr_role role; 607 603 int rc = 0; 608 604 609 605 role = smc->listen_smc ? SMC_SERV : SMC_CLNT; 610 - rc = smc_vlan_by_tcpsk(smc->clcsock, &vlan_id); 606 + rc = smc_vlan_by_tcpsk(smc->clcsock, ini); 611 607 if (rc) 612 608 return rc; 613 609 614 - if ((role == SMC_CLNT) && srv_first_contact) 610 + if (role == SMC_CLNT && ini->srv_first_contact) 615 611 /* create new link group as well */ 616 612 goto create; 617 613 ··· 615 619 spin_lock_bh(&smc_lgr_list.lock); 616 620 list_for_each_entry(lgr, &smc_lgr_list.list, list) { 617 621 write_lock_bh(&lgr->conns_lock); 618 - if ((is_smcd ? smcd_lgr_match(lgr, smcd, peer_gid) : 619 - smcr_lgr_match(lgr, lcl, role, clcqpn)) && 622 + if ((ini->is_smcd ? 623 + smcd_lgr_match(lgr, ini->ism_dev, ini->ism_gid) : 624 + smcr_lgr_match(lgr, ini->ib_lcl, role, ini->ib_clcqpn)) && 620 625 !lgr->sync_err && 621 - lgr->vlan_id == vlan_id && 626 + lgr->vlan_id == ini->vlan_id && 622 627 (role == SMC_CLNT || 623 628 lgr->conns_num < SMC_RMBS_PER_LGR_MAX)) { 624 629 /* link group found */ ··· 635 638 } 636 639 spin_unlock_bh(&smc_lgr_list.lock); 637 640 638 - if (role == SMC_CLNT && !srv_first_contact && 639 - (local_contact == SMC_FIRST_CONTACT)) { 641 + if (role == SMC_CLNT && !ini->srv_first_contact && 642 + local_contact == SMC_FIRST_CONTACT) { 640 643 /* Server reuses a link group, but Client wants to start 641 644 * a new one 642 645 * send out_of_sync decline, reason synchr. error ··· 646 649 647 650 create: 648 651 if (local_contact == SMC_FIRST_CONTACT) { 649 - rc = smc_lgr_create(smc, is_smcd, smcibdev, ibport, 650 - lcl->id_for_peer, vlan_id, smcd, peer_gid); 652 + rc = smc_lgr_create(smc, ini); 651 653 if (rc) 652 654 goto out; 653 655 smc_lgr_register_conn(conn); /* add smc conn to lgr */ ··· 654 658 conn->local_tx_ctrl.common.type = SMC_CDC_MSG_TYPE; 655 659 conn->local_tx_ctrl.len = SMC_WR_TX_SIZE; 656 660 conn->urg_state = SMC_URG_READ; 657 - if (is_smcd) { 661 + if (ini->is_smcd) { 658 662 conn->rx_off = sizeof(struct smcd_cdc_msg); 659 663 smcd_cdc_rx_init(conn); /* init tasklet for this conn */ 660 664 }
+19 -5
net/smc/smc_core.h
··· 229 229 }; 230 230 }; 231 231 232 + struct smc_clc_msg_local; 233 + 234 + struct smc_init_info { 235 + u8 is_smcd; 236 + unsigned short vlan_id; 237 + int srv_first_contact; 238 + /* SMC-R */ 239 + struct smc_clc_msg_local *ib_lcl; 240 + struct smc_ib_device *ib_dev; 241 + u8 ib_gid[SMC_GID_SIZE]; 242 + u8 ib_port; 243 + u32 ib_clcqpn; 244 + /* SMC-D */ 245 + u64 ism_gid; 246 + struct smcd_dev *ism_dev; 247 + }; 248 + 232 249 /* Find the connection associated with the given alert token in the link group. 233 250 * To use rbtrees we have to implement our own search core. 234 251 * Requires @conns_lock ··· 298 281 void smc_sndbuf_sync_sg_for_device(struct smc_connection *conn); 299 282 void smc_rmb_sync_sg_for_cpu(struct smc_connection *conn); 300 283 void smc_rmb_sync_sg_for_device(struct smc_connection *conn); 301 - int smc_vlan_by_tcpsk(struct socket *clcsock, unsigned short *vlan_id); 284 + int smc_vlan_by_tcpsk(struct socket *clcsock, struct smc_init_info *ini); 302 285 303 286 void smc_conn_free(struct smc_connection *conn); 304 - int smc_conn_create(struct smc_sock *smc, bool is_smcd, int srv_first_contact, 305 - struct smc_ib_device *smcibdev, u8 ibport, u32 clcqpn, 306 - struct smc_clc_msg_local *lcl, struct smcd_dev *smcd, 307 - u64 peer_gid); 287 + int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini); 308 288 void smcd_conn_free(struct smc_connection *conn); 309 289 void smc_lgr_schedule_free_work_fast(struct smc_link_group *lgr); 310 290 void smc_core_exit(void);
+21 -26
net/smc/smc_pnet.c
··· 26 26 #include "smc_pnet.h" 27 27 #include "smc_ib.h" 28 28 #include "smc_ism.h" 29 + #include "smc_core.h" 29 30 30 31 #define SMC_ASCII_BLANK 32 31 32 ··· 756 755 * IB device and port 757 756 */ 758 757 static void smc_pnet_find_rdma_dev(struct net_device *netdev, 759 - struct smc_ib_device **smcibdev, 760 - u8 *ibport, unsigned short vlan_id, u8 gid[]) 758 + struct smc_init_info *ini) 761 759 { 762 760 struct smc_ib_device *ibdev; 763 761 ··· 776 776 dev_put(ndev); 777 777 if (netdev == ndev && 778 778 smc_ib_port_active(ibdev, i) && 779 - !smc_ib_determine_gid(ibdev, i, vlan_id, gid, 780 - NULL)) { 781 - *smcibdev = ibdev; 782 - *ibport = i; 779 + !smc_ib_determine_gid(ibdev, i, ini->vlan_id, 780 + ini->ib_gid, NULL)) { 781 + ini->ib_dev = ibdev; 782 + ini->ib_port = i; 783 783 break; 784 784 } 785 785 } ··· 794 794 * If nothing found, try to use handshake device 795 795 */ 796 796 static void smc_pnet_find_roce_by_pnetid(struct net_device *ndev, 797 - struct smc_ib_device **smcibdev, 798 - u8 *ibport, unsigned short vlan_id, 799 - u8 gid[]) 797 + struct smc_init_info *ini) 800 798 { 801 799 u8 ndev_pnetid[SMC_MAX_PNETID_LEN]; 802 800 struct smc_ib_device *ibdev; ··· 804 806 if (smc_pnetid_by_dev_port(ndev->dev.parent, ndev->dev_port, 805 807 ndev_pnetid) && 806 808 smc_pnet_find_ndev_pnetid_by_table(ndev, ndev_pnetid)) { 807 - smc_pnet_find_rdma_dev(ndev, smcibdev, ibport, vlan_id, gid); 809 + smc_pnet_find_rdma_dev(ndev, ini); 808 810 return; /* pnetid could not be determined */ 809 811 } 810 812 ··· 815 817 continue; 816 818 if (smc_pnet_match(ibdev->pnetid[i - 1], ndev_pnetid) && 817 819 smc_ib_port_active(ibdev, i) && 818 - !smc_ib_determine_gid(ibdev, i, vlan_id, gid, 819 - NULL)) { 820 - *smcibdev = ibdev; 821 - *ibport = i; 820 + !smc_ib_determine_gid(ibdev, i, ini->vlan_id, 821 + ini->ib_gid, NULL)) { 822 + ini->ib_dev = ibdev; 823 + ini->ib_port = i; 822 824 goto out; 823 825 } 824 826 } ··· 828 830 } 829 831 830 832 static void smc_pnet_find_ism_by_pnetid(struct net_device *ndev, 831 - struct smcd_dev **smcismdev) 833 + struct smc_init_info *ini) 832 834 { 833 835 u8 ndev_pnetid[SMC_MAX_PNETID_LEN]; 834 836 struct smcd_dev *ismdev; ··· 842 844 spin_lock(&smcd_dev_list.lock); 843 845 list_for_each_entry(ismdev, &smcd_dev_list.list, list) { 844 846 if (smc_pnet_match(ismdev->pnetid, ndev_pnetid)) { 845 - *smcismdev = ismdev; 847 + ini->ism_dev = ismdev; 846 848 break; 847 849 } 848 850 } ··· 853 855 * determine ib_device and port belonging to used internal TCP socket 854 856 * ethernet interface. 855 857 */ 856 - void smc_pnet_find_roce_resource(struct sock *sk, 857 - struct smc_ib_device **smcibdev, u8 *ibport, 858 - unsigned short vlan_id, u8 gid[]) 858 + void smc_pnet_find_roce_resource(struct sock *sk, struct smc_init_info *ini) 859 859 { 860 860 struct dst_entry *dst = sk_dst_get(sk); 861 861 862 - *smcibdev = NULL; 863 - *ibport = 0; 864 - 862 + ini->ib_dev = NULL; 863 + ini->ib_port = 0; 865 864 if (!dst) 866 865 goto out; 867 866 if (!dst->dev) 868 867 goto out_rel; 869 868 870 - smc_pnet_find_roce_by_pnetid(dst->dev, smcibdev, ibport, vlan_id, gid); 869 + smc_pnet_find_roce_by_pnetid(dst->dev, ini); 871 870 872 871 out_rel: 873 872 dst_release(dst); ··· 872 877 return; 873 878 } 874 879 875 - void smc_pnet_find_ism_resource(struct sock *sk, struct smcd_dev **smcismdev) 880 + void smc_pnet_find_ism_resource(struct sock *sk, struct smc_init_info *ini) 876 881 { 877 882 struct dst_entry *dst = sk_dst_get(sk); 878 883 879 - *smcismdev = NULL; 884 + ini->ism_dev = NULL; 880 885 if (!dst) 881 886 goto out; 882 887 if (!dst->dev) 883 888 goto out_rel; 884 889 885 - smc_pnet_find_ism_by_pnetid(dst->dev, smcismdev); 890 + smc_pnet_find_ism_by_pnetid(dst->dev, ini); 886 891 887 892 out_rel: 888 893 dst_release(dst);
+3 -4
net/smc/smc_pnet.h
··· 18 18 19 19 struct smc_ib_device; 20 20 struct smcd_dev; 21 + struct smc_init_info; 21 22 22 23 /** 23 24 * struct smc_pnettable - SMC PNET table anchor ··· 44 43 int smc_pnet_net_init(struct net *net); 45 44 void smc_pnet_exit(void); 46 45 void smc_pnet_net_exit(struct net *net); 47 - void smc_pnet_find_roce_resource(struct sock *sk, 48 - struct smc_ib_device **smcibdev, u8 *ibport, 49 - unsigned short vlan_id, u8 gid[]); 50 - void smc_pnet_find_ism_resource(struct sock *sk, struct smcd_dev **smcismdev); 46 + void smc_pnet_find_roce_resource(struct sock *sk, struct smc_init_info *ini); 47 + void smc_pnet_find_ism_resource(struct sock *sk, struct smc_init_info *ini); 51 48 52 49 #endif