forked from mirrors/linux
		
	net/smc: allow pnetid-less configuration
Without hardware pnetid support there must currently be a pnet table configured to determine the IB device port to be used for SMC RDMA traffic. This patch enables a setup without pnet table, if the used handshake interface belongs already to a RoCE port. Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									6c97da1415
								
							
						
					
					
						commit
						54903572c2
					
				
					 1 changed files with 41 additions and 1 deletions
				
			
		|  | @ -754,9 +754,47 @@ static int smc_pnet_find_ndev_pnetid_by_table(struct net_device *ndev, | |||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| /* if handshake network device belongs to a roce device, return its
 | ||||
|  * IB device and port | ||||
|  */ | ||||
| static void smc_pnet_find_rdma_dev(struct net_device *netdev, | ||||
| 				   struct smc_ib_device **smcibdev, | ||||
| 				   u8 *ibport, unsigned short vlan_id, u8 gid[]) | ||||
| { | ||||
| 	struct smc_ib_device *ibdev; | ||||
| 
 | ||||
| 	spin_lock(&smc_ib_devices.lock); | ||||
| 	list_for_each_entry(ibdev, &smc_ib_devices.list, list) { | ||||
| 		struct net_device *ndev; | ||||
| 		int i; | ||||
| 
 | ||||
| 		for (i = 1; i <= SMC_MAX_PORTS; i++) { | ||||
| 			if (!rdma_is_port_valid(ibdev->ibdev, i)) | ||||
| 				continue; | ||||
| 			if (!ibdev->ibdev->ops.get_netdev) | ||||
| 				continue; | ||||
| 			ndev = ibdev->ibdev->ops.get_netdev(ibdev->ibdev, i); | ||||
| 			if (!ndev) | ||||
| 				continue; | ||||
| 			dev_put(ndev); | ||||
| 			if (netdev == ndev && | ||||
| 			    smc_ib_port_active(ibdev, i) && | ||||
| 			    !smc_ib_determine_gid(ibdev, i, vlan_id, gid, | ||||
| 						  NULL)) { | ||||
| 				*smcibdev = ibdev; | ||||
| 				*ibport = i; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	spin_unlock(&smc_ib_devices.lock); | ||||
| } | ||||
| 
 | ||||
| /* Determine the corresponding IB device port based on the hardware PNETID.
 | ||||
|  * Searching stops at the first matching active IB device port with vlan_id | ||||
|  * configured. | ||||
|  * If nothing found, check pnetid table. | ||||
|  * If nothing found, try to use handshake device | ||||
|  */ | ||||
| static void smc_pnet_find_roce_by_pnetid(struct net_device *ndev, | ||||
| 					 struct smc_ib_device **smcibdev, | ||||
|  | @ -770,8 +808,10 @@ static void smc_pnet_find_roce_by_pnetid(struct net_device *ndev, | |||
| 	ndev = pnet_find_base_ndev(ndev); | ||||
| 	if (smc_pnetid_by_dev_port(ndev->dev.parent, ndev->dev_port, | ||||
| 				   ndev_pnetid) && | ||||
| 	    smc_pnet_find_ndev_pnetid_by_table(ndev, ndev_pnetid)) | ||||
| 	    smc_pnet_find_ndev_pnetid_by_table(ndev, ndev_pnetid)) { | ||||
| 		smc_pnet_find_rdma_dev(ndev, smcibdev, ibport, vlan_id, gid); | ||||
| 		return; /* pnetid could not be determined */ | ||||
| 	} | ||||
| 
 | ||||
| 	spin_lock(&smc_ib_devices.lock); | ||||
| 	list_for_each_entry(ibdev, &smc_ib_devices.list, list) { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Ursula Braun
						Ursula Braun