diff options
Diffstat (limited to 'net/smc/smc_pnet.c')
| -rw-r--r-- | net/smc/smc_pnet.c | 49 | 
1 files changed, 26 insertions, 23 deletions
diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c index db9825c01e0a..29f0a559d884 100644 --- a/net/smc/smc_pnet.c +++ b/net/smc/smc_pnet.c @@ -113,7 +113,7 @@ static int smc_pnet_remove_by_pnetid(struct net *net, char *pnet_name)  	pnettable = &sn->pnettable;  	/* remove table entry */ -	write_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry_safe(pnetelem, tmp_pe, &pnettable->pnetlist,  				 list) {  		if (!pnet_name || @@ -131,7 +131,7 @@ static int smc_pnet_remove_by_pnetid(struct net *net, char *pnet_name)  			rc = 0;  		}  	} -	write_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	/* if this is not the initial namespace, stop here */  	if (net != &init_net) @@ -192,7 +192,7 @@ static int smc_pnet_add_by_ndev(struct net_device *ndev)  	sn = net_generic(net, smc_net_id);  	pnettable = &sn->pnettable; -	write_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry_safe(pnetelem, tmp_pe, &pnettable->pnetlist, list) {  		if (pnetelem->type == SMC_PNET_ETH && !pnetelem->ndev &&  		    !strncmp(pnetelem->eth_name, ndev->name, IFNAMSIZ)) { @@ -206,7 +206,7 @@ static int smc_pnet_add_by_ndev(struct net_device *ndev)  			break;  		}  	} -	write_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	return rc;  } @@ -224,7 +224,7 @@ static int smc_pnet_remove_by_ndev(struct net_device *ndev)  	sn = net_generic(net, smc_net_id);  	pnettable = &sn->pnettable; -	write_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry_safe(pnetelem, tmp_pe, &pnettable->pnetlist, list) {  		if (pnetelem->type == SMC_PNET_ETH && pnetelem->ndev == ndev) {  			dev_put_track(pnetelem->ndev, &pnetelem->dev_tracker); @@ -237,7 +237,7 @@ static int smc_pnet_remove_by_ndev(struct net_device *ndev)  			break;  		}  	} -	write_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	return rc;  } @@ -368,11 +368,9 @@ static int smc_pnet_add_eth(struct smc_pnettable *pnettable, struct net *net,  	new_pe->type = SMC_PNET_ETH;  	memcpy(new_pe->pnet_name, pnet_name, SMC_MAX_PNETID_LEN);  	strncpy(new_pe->eth_name, eth_name, IFNAMSIZ); -	new_pe->ndev = ndev; -	netdev_tracker_alloc(ndev, &new_pe->dev_tracker, GFP_KERNEL);  	rc = -EEXIST;  	new_netdev = true; -	write_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {  		if (tmp_pe->type == SMC_PNET_ETH &&  		    !strncmp(tmp_pe->eth_name, eth_name, IFNAMSIZ)) { @@ -381,10 +379,15 @@ static int smc_pnet_add_eth(struct smc_pnettable *pnettable, struct net *net,  		}  	}  	if (new_netdev) { +		if (ndev) { +			new_pe->ndev = ndev; +			netdev_tracker_alloc(ndev, &new_pe->dev_tracker, +					     GFP_ATOMIC); +		}  		list_add_tail(&new_pe->list, &pnettable->pnetlist); -		write_unlock(&pnettable->lock); +		mutex_unlock(&pnettable->lock);  	} else { -		write_unlock(&pnettable->lock); +		mutex_unlock(&pnettable->lock);  		kfree(new_pe);  		goto out_put;  	} @@ -445,7 +448,7 @@ static int smc_pnet_add_ib(struct smc_pnettable *pnettable, char *ib_name,  	new_pe->ib_port = ib_port;  	new_ibdev = true; -	write_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {  		if (tmp_pe->type == SMC_PNET_IB &&  		    !strncmp(tmp_pe->ib_name, ib_name, IB_DEVICE_NAME_MAX)) { @@ -455,9 +458,9 @@ static int smc_pnet_add_ib(struct smc_pnettable *pnettable, char *ib_name,  	}  	if (new_ibdev) {  		list_add_tail(&new_pe->list, &pnettable->pnetlist); -		write_unlock(&pnettable->lock); +		mutex_unlock(&pnettable->lock);  	} else { -		write_unlock(&pnettable->lock); +		mutex_unlock(&pnettable->lock);  		kfree(new_pe);  	}  	return (new_ibdev) ? 0 : -EEXIST; @@ -602,7 +605,7 @@ static int _smc_pnet_dump(struct net *net, struct sk_buff *skb, u32 portid,  	pnettable = &sn->pnettable;  	/* dump pnettable entries */ -	read_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry(pnetelem, &pnettable->pnetlist, list) {  		if (pnetid && !smc_pnet_match(pnetelem->pnet_name, pnetid))  			continue; @@ -617,7 +620,7 @@ static int _smc_pnet_dump(struct net *net, struct sk_buff *skb, u32 portid,  			break;  		}  	} -	read_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	return idx;  } @@ -861,7 +864,7 @@ int smc_pnet_net_init(struct net *net)  	struct smc_pnetids_ndev *pnetids_ndev = &sn->pnetids_ndev;  	INIT_LIST_HEAD(&pnettable->pnetlist); -	rwlock_init(&pnettable->lock); +	mutex_init(&pnettable->lock);  	INIT_LIST_HEAD(&pnetids_ndev->list);  	rwlock_init(&pnetids_ndev->lock); @@ -941,7 +944,7 @@ static int smc_pnet_find_ndev_pnetid_by_table(struct net_device *ndev,  	sn = net_generic(net, smc_net_id);  	pnettable = &sn->pnettable; -	read_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry(pnetelem, &pnettable->pnetlist, list) {  		if (pnetelem->type == SMC_PNET_ETH && ndev == pnetelem->ndev) {  			/* get pnetid of netdev device */ @@ -950,7 +953,7 @@ static int smc_pnet_find_ndev_pnetid_by_table(struct net_device *ndev,  			break;  		}  	} -	read_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	return rc;  } @@ -1153,7 +1156,7 @@ int smc_pnetid_by_table_ib(struct smc_ib_device *smcibdev, u8 ib_port)  	sn = net_generic(&init_net, smc_net_id);  	pnettable = &sn->pnettable; -	read_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {  		if (tmp_pe->type == SMC_PNET_IB &&  		    !strncmp(tmp_pe->ib_name, ib_name, IB_DEVICE_NAME_MAX) && @@ -1163,7 +1166,7 @@ int smc_pnetid_by_table_ib(struct smc_ib_device *smcibdev, u8 ib_port)  			break;  		}  	} -	read_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	return rc;  } @@ -1182,7 +1185,7 @@ int smc_pnetid_by_table_smcd(struct smcd_dev *smcddev)  	sn = net_generic(&init_net, smc_net_id);  	pnettable = &sn->pnettable; -	read_lock(&pnettable->lock); +	mutex_lock(&pnettable->lock);  	list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {  		if (tmp_pe->type == SMC_PNET_IB &&  		    !strncmp(tmp_pe->ib_name, ib_name, IB_DEVICE_NAME_MAX)) { @@ -1191,7 +1194,7 @@ int smc_pnetid_by_table_smcd(struct smcd_dev *smcddev)  			break;  		}  	} -	read_unlock(&pnettable->lock); +	mutex_unlock(&pnettable->lock);  	return rc;  }  |