diff options
Diffstat (limited to 'drivers/net/ppp/ppp_generic.c')
| -rw-r--r-- | drivers/net/ppp/ppp_generic.c | 44 | 
1 files changed, 13 insertions, 31 deletions
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 0b2706abe3e..72ff14b811c 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -1058,7 +1058,15 @@ ppp_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats64)  	return stats64;  } +static struct lock_class_key ppp_tx_busylock; +static int ppp_dev_init(struct net_device *dev) +{ +	dev->qdisc_tx_busylock = &ppp_tx_busylock; +	return 0; +} +  static const struct net_device_ops ppp_netdev_ops = { +	.ndo_init	 = ppp_dev_init,  	.ndo_start_xmit  = ppp_start_xmit,  	.ndo_do_ioctl    = ppp_net_ioctl,  	.ndo_get_stats64 = ppp_get_stats64, @@ -1805,8 +1813,7 @@ ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb)  		/* the filter instructions are constructed assuming  		   a four-byte PPP header on each packet */  		if (ppp->pass_filter || ppp->active_filter) { -			if (skb_cloned(skb) && -			    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) +			if (skb_unclone(skb, GFP_ATOMIC))  				goto err;  			*skb_push(skb, 2) = 0; @@ -2946,46 +2953,21 @@ static void __exit ppp_cleanup(void)   * by holding all_ppp_mutex   */ -static int __unit_alloc(struct idr *p, void *ptr, int n) -{ -	int unit, err; - -again: -	if (!idr_pre_get(p, GFP_KERNEL)) { -		pr_err("PPP: No free memory for idr\n"); -		return -ENOMEM; -	} - -	err = idr_get_new_above(p, ptr, n, &unit); -	if (err < 0) { -		if (err == -EAGAIN) -			goto again; -		return err; -	} - -	return unit; -} -  /* associate pointer with specified number */  static int unit_set(struct idr *p, void *ptr, int n)  {  	int unit; -	unit = __unit_alloc(p, ptr, n); -	if (unit < 0) -		return unit; -	else if (unit != n) { -		idr_remove(p, unit); -		return -EINVAL; -	} - +	unit = idr_alloc(p, ptr, n, n + 1, GFP_KERNEL); +	if (unit == -ENOSPC) +		unit = -EINVAL;  	return unit;  }  /* get new free unit number and associate pointer with it */  static int unit_get(struct idr *p, void *ptr)  { -	return __unit_alloc(p, ptr, 0); +	return idr_alloc(p, ptr, 0, 0, GFP_KERNEL);  }  /* put unit number back to a pool */  |