diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/dev.c | 28 | ||||
| -rw-r--r-- | net/core/fib_rules.c | 7 | ||||
| -rw-r--r-- | net/core/flow_dissector.c | 20 | ||||
| -rw-r--r-- | net/core/neighbour.c | 8 | ||||
| -rw-r--r-- | net/core/netpoll.c | 4 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 21 | ||||
| -rw-r--r-- | net/core/skbuff.c | 3 | ||||
| -rw-r--r-- | net/core/sock.c | 6 | 
8 files changed, 50 insertions, 47 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 3721db716350..b1b0c8d4d7df 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2420,7 +2420,7 @@ EXPORT_SYMBOL(netdev_rx_csum_fault);   * 2. No high memory really exists on this machine.   */ -static int illegal_highdma(struct net_device *dev, struct sk_buff *skb) +static int illegal_highdma(const struct net_device *dev, struct sk_buff *skb)  {  #ifdef CONFIG_HIGHMEM  	int i; @@ -2495,34 +2495,36 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features)  }  static netdev_features_t harmonize_features(struct sk_buff *skb, -	netdev_features_t features) +					    const struct net_device *dev, +					    netdev_features_t features)  {  	if (skb->ip_summed != CHECKSUM_NONE &&  	    !can_checksum_protocol(features, skb_network_protocol(skb))) {  		features &= ~NETIF_F_ALL_CSUM; -	} else if (illegal_highdma(skb->dev, skb)) { +	} else if (illegal_highdma(dev, skb)) {  		features &= ~NETIF_F_SG;  	}  	return features;  } -netdev_features_t netif_skb_features(struct sk_buff *skb) +netdev_features_t netif_skb_dev_features(struct sk_buff *skb, +					 const struct net_device *dev)  {  	__be16 protocol = skb->protocol; -	netdev_features_t features = skb->dev->features; +	netdev_features_t features = dev->features; -	if (skb_shinfo(skb)->gso_segs > skb->dev->gso_max_segs) +	if (skb_shinfo(skb)->gso_segs > dev->gso_max_segs)  		features &= ~NETIF_F_GSO_MASK;  	if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) {  		struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;  		protocol = veh->h_vlan_encapsulated_proto;  	} else if (!vlan_tx_tag_present(skb)) { -		return harmonize_features(skb, features); +		return harmonize_features(skb, dev, features);  	} -	features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX | +	features &= (dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX |  					       NETIF_F_HW_VLAN_STAG_TX);  	if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) @@ -2530,9 +2532,9 @@ netdev_features_t netif_skb_features(struct sk_buff *skb)  				NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX |  				NETIF_F_HW_VLAN_STAG_TX; -	return harmonize_features(skb, features); +	return harmonize_features(skb, dev, features);  } -EXPORT_SYMBOL(netif_skb_features); +EXPORT_SYMBOL(netif_skb_dev_features);  int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,  			struct netdev_queue *txq) @@ -2803,7 +2805,7 @@ EXPORT_SYMBOL(dev_loopback_xmit);   *      the BH enable code must have IRQs enabled so that it will not deadlock.   *          --BLG   */ -int __dev_queue_xmit(struct sk_buff *skb, void *accel_priv) +static int __dev_queue_xmit(struct sk_buff *skb, void *accel_priv)  {  	struct net_device *dev = skb->dev;  	struct netdev_queue *txq; @@ -4637,7 +4639,7 @@ struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev)  }  EXPORT_SYMBOL(netdev_master_upper_dev_get_rcu); -int netdev_adjacent_sysfs_add(struct net_device *dev, +static int netdev_adjacent_sysfs_add(struct net_device *dev,  			      struct net_device *adj_dev,  			      struct list_head *dev_list)  { @@ -4647,7 +4649,7 @@ int netdev_adjacent_sysfs_add(struct net_device *dev,  	return sysfs_create_link(&(dev->dev.kobj), &(adj_dev->dev.kobj),  				 linkname);  } -void netdev_adjacent_sysfs_del(struct net_device *dev, +static void netdev_adjacent_sysfs_del(struct net_device *dev,  			       char *name,  			       struct list_head *dev_list)  { diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index f409e0bd35c0..185c341fafbd 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c @@ -745,6 +745,13 @@ static int fib_rules_event(struct notifier_block *this, unsigned long event,  			attach_rules(&ops->rules_list, dev);  		break; +	case NETDEV_CHANGENAME: +		list_for_each_entry(ops, &net->rules_ops, list) { +			detach_rules(&ops->rules_list, dev); +			attach_rules(&ops->rules_list, dev); +		} +		break; +  	case NETDEV_UNREGISTER:  		list_for_each_entry(ops, &net->rules_ops, list)  			detach_rules(&ops->rules_list, dev); diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 87577d447554..e29e810663d7 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -323,17 +323,6 @@ u32 __skb_get_poff(const struct sk_buff *skb)  	return poff;  } -static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index) -{ -	if (unlikely(queue_index >= dev->real_num_tx_queues)) { -		net_warn_ratelimited("%s selects TX queue %d, but real number of TX queues is %d\n", -				     dev->name, queue_index, -				     dev->real_num_tx_queues); -		return 0; -	} -	return queue_index; -} -  static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb)  {  #ifdef CONFIG_XPS @@ -372,7 +361,7 @@ static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb)  #endif  } -u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb) +static u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb)  {  	struct sock *sk = skb->sk;  	int queue_index = sk_tx_queue_get(sk); @@ -392,7 +381,6 @@ u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb)  	return queue_index;  } -EXPORT_SYMBOL(__netdev_pick_tx);  struct netdev_queue *netdev_pick_tx(struct net_device *dev,  				    struct sk_buff *skb, @@ -403,13 +391,13 @@ struct netdev_queue *netdev_pick_tx(struct net_device *dev,  	if (dev->real_num_tx_queues != 1) {  		const struct net_device_ops *ops = dev->netdev_ops;  		if (ops->ndo_select_queue) -			queue_index = ops->ndo_select_queue(dev, skb, -							    accel_priv); +			queue_index = ops->ndo_select_queue(dev, skb, accel_priv, +							    __netdev_pick_tx);  		else  			queue_index = __netdev_pick_tx(dev, skb);  		if (!accel_priv) -			queue_index = dev_cap_txqueue(dev, queue_index); +			queue_index = netdev_cap_txqueue(dev, queue_index);  	}  	skb_set_queue_mapping(skb, queue_index); diff --git a/net/core/neighbour.c b/net/core/neighbour.c index b9e9e0d38672..e16129019c66 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -766,9 +766,6 @@ static void neigh_periodic_work(struct work_struct *work)  	nht = rcu_dereference_protected(tbl->nht,  					lockdep_is_held(&tbl->lock)); -	if (atomic_read(&tbl->entries) < tbl->gc_thresh1) -		goto out; -  	/*  	 *	periodically recompute ReachableTime from random function  	 */ @@ -781,6 +778,9 @@ static void neigh_periodic_work(struct work_struct *work)  				neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));  	} +	if (atomic_read(&tbl->entries) < tbl->gc_thresh1) +		goto out; +  	for (i = 0 ; i < (1 << nht->hash_shift); i++) {  		np = &nht->hash_buckets[i]; @@ -3046,7 +3046,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,  	if (!t)  		goto err; -	for (i = 0; i < ARRAY_SIZE(t->neigh_vars); i++) { +	for (i = 0; i < NEIGH_VAR_GC_INTERVAL; i++) {  		t->neigh_vars[i].data += (long) p;  		t->neigh_vars[i].extra1 = dev;  		t->neigh_vars[i].extra2 = p; diff --git a/net/core/netpoll.c b/net/core/netpoll.c index c03f3dec4763..a664f7829a6d 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -948,6 +948,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)  {  	char *cur=opt, *delim;  	int ipv6; +	bool ipversion_set = false;  	if (*cur != '@') {  		if ((delim = strchr(cur, '@')) == NULL) @@ -960,6 +961,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)  	cur++;  	if (*cur != '/') { +		ipversion_set = true;  		if ((delim = strchr(cur, '/')) == NULL)  			goto parse_failed;  		*delim = 0; @@ -1002,7 +1004,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)  	ipv6 = netpoll_parse_ip_addr(cur, &np->remote_ip);  	if (ipv6 < 0)  		goto parse_failed; -	else if (np->ipv6 != (bool)ipv6) +	else if (ipversion_set && np->ipv6 != (bool)ipv6)  		goto parse_failed;  	else  		np->ipv6 = (bool)ipv6; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 393b1bc9a618..1a0dac2ef9ad 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -374,7 +374,7 @@ static size_t rtnl_link_get_slave_info_data_size(const struct net_device *dev)  	if (!master_dev)  		return 0;  	ops = master_dev->rtnl_link_ops; -	if (!ops->get_slave_size) +	if (!ops || !ops->get_slave_size)  		return 0;  	/* IFLA_INFO_SLAVE_DATA + nested data */  	return nla_total_size(sizeof(struct nlattr)) + @@ -1963,16 +1963,21 @@ replay:  		dev->ifindex = ifm->ifi_index; -		if (ops->newlink) +		if (ops->newlink) {  			err = ops->newlink(net, dev, tb, data); -		else +			/* Drivers should call free_netdev() in ->destructor +			 * and unregister it on failure so that device could be +			 * finally freed in rtnl_unlock. +			 */ +			if (err < 0) +				goto out; +		} else {  			err = register_netdevice(dev); - -		if (err < 0) { -			free_netdev(dev); -			goto out; +			if (err < 0) { +				free_netdev(dev); +				goto out; +			}  		} -  		err = rtnl_configure_link(dev, ifm);  		if (err < 0)  			unregister_netdevice(dev); diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5976ef0846bd..5d6236d9fdce 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -707,9 +707,6 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)  	new->mark		= old->mark;  	new->skb_iif		= old->skb_iif;  	__nf_copy(new, old); -#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) -	new->nf_trace		= old->nf_trace; -#endif  #ifdef CONFIG_NET_SCHED  	new->tc_index		= old->tc_index;  #ifdef CONFIG_NET_CLS_ACT diff --git a/net/core/sock.c b/net/core/sock.c index 0c127dcdf6a8..5b6a9431b017 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1775,7 +1775,9 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,  			while (order) {  				if (npages >= 1 << order) {  					page = alloc_pages(sk->sk_allocation | -							   __GFP_COMP | __GFP_NOWARN, +							   __GFP_COMP | +							   __GFP_NOWARN | +							   __GFP_NORETRY,  							   order);  					if (page)  						goto fill_page; @@ -1845,7 +1847,7 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio)  		gfp_t gfp = prio;  		if (order) -			gfp |= __GFP_COMP | __GFP_NOWARN; +			gfp |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY;  		pfrag->page = alloc_pages(gfp, order);  		if (likely(pfrag->page)) {  			pfrag->offset = 0;  | 
