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; | 	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.
 | /* Determine the corresponding IB device port based on the hardware PNETID.
 | ||||||
|  * Searching stops at the first matching active IB device port with vlan_id |  * Searching stops at the first matching active IB device port with vlan_id | ||||||
|  * configured. |  * 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, | static void smc_pnet_find_roce_by_pnetid(struct net_device *ndev, | ||||||
| 					 struct smc_ib_device **smcibdev, | 					 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); | 	ndev = pnet_find_base_ndev(ndev); | ||||||
| 	if (smc_pnetid_by_dev_port(ndev->dev.parent, ndev->dev_port, | 	if (smc_pnetid_by_dev_port(ndev->dev.parent, ndev->dev_port, | ||||||
| 				   ndev_pnetid) && | 				   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 */ | 		return; /* pnetid could not be determined */ | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	spin_lock(&smc_ib_devices.lock); | 	spin_lock(&smc_ib_devices.lock); | ||||||
| 	list_for_each_entry(ibdev, &smc_ib_devices.list, list) { | 	list_for_each_entry(ibdev, &smc_ib_devices.list, list) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ursula Braun
						Ursula Braun