Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/bonding/bond_alb.c drivers/net/ethernet/altera/altera_msgdma.c drivers/net/ethernet/altera/altera_sgdma.c net/ipv6/xfrm6_output.c Several cases of overlapping changes. The xfrm6_output.c has a bug fix which overlaps the renaming of skb->local_df to skb->ignore_df. In the Altera TSE driver cases, the register access cleanups in net-next overlapped with bug fixes done in net. Similarly a bug fix to send ALB packets in the bonding driver using the right source address overlaps with cleanups in net-next. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -3957,6 +3957,7 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff
|
||||
}
|
||||
NAPI_GRO_CB(skb)->count = 1;
|
||||
NAPI_GRO_CB(skb)->age = jiffies;
|
||||
NAPI_GRO_CB(skb)->last = skb;
|
||||
skb_shinfo(skb)->gso_size = skb_gro_len(skb);
|
||||
skb->next = napi->gro_list;
|
||||
napi->gro_list = skb;
|
||||
@@ -4546,6 +4547,32 @@ void *netdev_adjacent_get_private(struct list_head *adj_list)
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_adjacent_get_private);
|
||||
|
||||
/**
|
||||
* netdev_upper_get_next_dev_rcu - Get the next dev from upper list
|
||||
* @dev: device
|
||||
* @iter: list_head ** of the current position
|
||||
*
|
||||
* Gets the next device from the dev's upper list, starting from iter
|
||||
* position. The caller must hold RCU read lock.
|
||||
*/
|
||||
struct net_device *netdev_upper_get_next_dev_rcu(struct net_device *dev,
|
||||
struct list_head **iter)
|
||||
{
|
||||
struct netdev_adjacent *upper;
|
||||
|
||||
WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_rtnl_is_held());
|
||||
|
||||
upper = list_entry_rcu((*iter)->next, struct netdev_adjacent, list);
|
||||
|
||||
if (&upper->list == &dev->adj_list.upper)
|
||||
return NULL;
|
||||
|
||||
*iter = &upper->list;
|
||||
|
||||
return upper->dev;
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_upper_get_next_dev_rcu);
|
||||
|
||||
/**
|
||||
* netdev_all_upper_get_next_dev_rcu - Get the next dev from upper list
|
||||
* @dev: device
|
||||
@@ -4627,6 +4654,32 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_lower_get_next_private_rcu);
|
||||
|
||||
/**
|
||||
* netdev_lower_get_next - Get the next device from the lower neighbour
|
||||
* list
|
||||
* @dev: device
|
||||
* @iter: list_head ** of the current position
|
||||
*
|
||||
* Gets the next netdev_adjacent from the dev's lower neighbour
|
||||
* list, starting from iter position. The caller must hold RTNL lock or
|
||||
* its own locking that guarantees that the neighbour lower
|
||||
* list will remain unchainged.
|
||||
*/
|
||||
void *netdev_lower_get_next(struct net_device *dev, struct list_head **iter)
|
||||
{
|
||||
struct netdev_adjacent *lower;
|
||||
|
||||
lower = list_entry((*iter)->next, struct netdev_adjacent, list);
|
||||
|
||||
if (&lower->list == &dev->adj_list.lower)
|
||||
return NULL;
|
||||
|
||||
*iter = &lower->list;
|
||||
|
||||
return lower->dev;
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_lower_get_next);
|
||||
|
||||
/**
|
||||
* netdev_lower_get_first_private_rcu - Get the first ->private from the
|
||||
* lower neighbour list, RCU
|
||||
@@ -5077,6 +5130,30 @@ void *netdev_lower_dev_get_private(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_lower_dev_get_private);
|
||||
|
||||
|
||||
int dev_get_nest_level(struct net_device *dev,
|
||||
bool (*type_check)(struct net_device *dev))
|
||||
{
|
||||
struct net_device *lower = NULL;
|
||||
struct list_head *iter;
|
||||
int max_nest = -1;
|
||||
int nest;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
netdev_for_each_lower_dev(dev, lower, iter) {
|
||||
nest = dev_get_nest_level(lower, type_check);
|
||||
if (max_nest < nest)
|
||||
max_nest = nest;
|
||||
}
|
||||
|
||||
if (type_check(dev))
|
||||
max_nest++;
|
||||
|
||||
return max_nest;
|
||||
}
|
||||
EXPORT_SYMBOL(dev_get_nest_level);
|
||||
|
||||
static void dev_change_rx_flags(struct net_device *dev, int flags)
|
||||
{
|
||||
const struct net_device_ops *ops = dev->netdev_ops;
|
||||
@@ -5242,7 +5319,6 @@ void __dev_set_rx_mode(struct net_device *dev)
|
||||
if (ops->ndo_set_rx_mode)
|
||||
ops->ndo_set_rx_mode(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(__dev_set_rx_mode);
|
||||
|
||||
void dev_set_rx_mode(struct net_device *dev)
|
||||
{
|
||||
@@ -5547,7 +5623,7 @@ static int dev_new_index(struct net *net)
|
||||
|
||||
/* Delayed registration/unregisteration */
|
||||
static LIST_HEAD(net_todo_list);
|
||||
static DECLARE_WAIT_QUEUE_HEAD(netdev_unregistering_wq);
|
||||
DECLARE_WAIT_QUEUE_HEAD(netdev_unregistering_wq);
|
||||
|
||||
static void net_set_todo(struct net_device *dev)
|
||||
{
|
||||
|
@@ -1248,8 +1248,8 @@ void __neigh_set_probe_once(struct neighbour *neigh)
|
||||
neigh->updated = jiffies;
|
||||
if (!(neigh->nud_state & NUD_FAILED))
|
||||
return;
|
||||
neigh->nud_state = NUD_PROBE;
|
||||
atomic_set(&neigh->probes, NEIGH_VAR(neigh->parms, UCAST_PROBES));
|
||||
neigh->nud_state = NUD_INCOMPLETE;
|
||||
atomic_set(&neigh->probes, neigh_max_probes(neigh));
|
||||
neigh_add_timer(neigh,
|
||||
jiffies + NEIGH_VAR(neigh->parms, RETRANS_TIME));
|
||||
}
|
||||
|
@@ -24,7 +24,7 @@
|
||||
|
||||
static LIST_HEAD(pernet_list);
|
||||
static struct list_head *first_device = &pernet_list;
|
||||
static DEFINE_MUTEX(net_mutex);
|
||||
DEFINE_MUTEX(net_mutex);
|
||||
|
||||
LIST_HEAD(net_namespace_list);
|
||||
EXPORT_SYMBOL_GPL(net_namespace_list);
|
||||
|
@@ -353,15 +353,46 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__rtnl_link_unregister);
|
||||
|
||||
/* Return with the rtnl_lock held when there are no network
|
||||
* devices unregistering in any network namespace.
|
||||
*/
|
||||
static void rtnl_lock_unregistering_all(void)
|
||||
{
|
||||
struct net *net;
|
||||
bool unregistering;
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
for (;;) {
|
||||
prepare_to_wait(&netdev_unregistering_wq, &wait,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
unregistering = false;
|
||||
rtnl_lock();
|
||||
for_each_net(net) {
|
||||
if (net->dev_unreg_count > 0) {
|
||||
unregistering = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!unregistering)
|
||||
break;
|
||||
__rtnl_unlock();
|
||||
schedule();
|
||||
}
|
||||
finish_wait(&netdev_unregistering_wq, &wait);
|
||||
}
|
||||
|
||||
/**
|
||||
* rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
|
||||
* @ops: struct rtnl_link_ops * to unregister
|
||||
*/
|
||||
void rtnl_link_unregister(struct rtnl_link_ops *ops)
|
||||
{
|
||||
rtnl_lock();
|
||||
/* Close the race with cleanup_net() */
|
||||
mutex_lock(&net_mutex);
|
||||
rtnl_lock_unregistering_all();
|
||||
__rtnl_link_unregister(ops);
|
||||
rtnl_unlock();
|
||||
mutex_unlock(&net_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtnl_link_unregister);
|
||||
|
||||
|
@@ -3076,7 +3076,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
|
||||
if (unlikely(p->len + len >= 65536))
|
||||
return -E2BIG;
|
||||
|
||||
lp = NAPI_GRO_CB(p)->last ?: p;
|
||||
lp = NAPI_GRO_CB(p)->last;
|
||||
pinfo = skb_shinfo(lp);
|
||||
|
||||
if (headlen <= offset) {
|
||||
@@ -3192,7 +3192,7 @@ merge:
|
||||
|
||||
__skb_pull(skb, offset);
|
||||
|
||||
if (!NAPI_GRO_CB(p)->last)
|
||||
if (NAPI_GRO_CB(p)->last == p)
|
||||
skb_shinfo(p)->frag_list = skb;
|
||||
else
|
||||
NAPI_GRO_CB(p)->last->next = skb;
|
||||
|
@@ -348,8 +348,8 @@ static void __net_random_once_deferred(struct work_struct *w)
|
||||
{
|
||||
struct __net_random_once_work *work =
|
||||
container_of(w, struct __net_random_once_work, work);
|
||||
if (!static_key_enabled(work->key))
|
||||
static_key_slow_inc(work->key);
|
||||
BUG_ON(!static_key_enabled(work->key));
|
||||
static_key_slow_dec(work->key);
|
||||
kfree(work);
|
||||
}
|
||||
|
||||
@@ -367,7 +367,7 @@ static void __net_random_once_disable_jump(struct static_key *key)
|
||||
}
|
||||
|
||||
bool __net_get_random_once(void *buf, int nbytes, bool *done,
|
||||
struct static_key *done_key)
|
||||
struct static_key *once_key)
|
||||
{
|
||||
static DEFINE_SPINLOCK(lock);
|
||||
unsigned long flags;
|
||||
@@ -382,7 +382,7 @@ bool __net_get_random_once(void *buf, int nbytes, bool *done,
|
||||
*done = true;
|
||||
spin_unlock_irqrestore(&lock, flags);
|
||||
|
||||
__net_random_once_disable_jump(done_key);
|
||||
__net_random_once_disable_jump(once_key);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user