Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The conflict was an interaction between a bug fix in the netvsc driver in 'net' and an optimization of the RX path in 'net-next'. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -332,7 +332,9 @@ void __skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb, int len)
|
||||
EXPORT_SYMBOL(__skb_free_datagram_locked);
|
||||
|
||||
int __sk_queue_drop_skb(struct sock *sk, struct sk_buff *skb,
|
||||
unsigned int flags)
|
||||
unsigned int flags,
|
||||
void (*destructor)(struct sock *sk,
|
||||
struct sk_buff *skb))
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
@@ -342,6 +344,8 @@ int __sk_queue_drop_skb(struct sock *sk, struct sk_buff *skb,
|
||||
if (skb == skb_peek(&sk->sk_receive_queue)) {
|
||||
__skb_unlink(skb, &sk->sk_receive_queue);
|
||||
atomic_dec(&skb->users);
|
||||
if (destructor)
|
||||
destructor(sk, skb);
|
||||
err = 0;
|
||||
}
|
||||
spin_unlock_bh(&sk->sk_receive_queue.lock);
|
||||
@@ -375,7 +379,7 @@ EXPORT_SYMBOL(__sk_queue_drop_skb);
|
||||
|
||||
int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)
|
||||
{
|
||||
int err = __sk_queue_drop_skb(sk, skb, flags);
|
||||
int err = __sk_queue_drop_skb(sk, skb, flags, NULL);
|
||||
|
||||
kfree_skb(skb);
|
||||
sk_mem_reclaim_partial(sk);
|
||||
|
@@ -1695,24 +1695,19 @@ EXPORT_SYMBOL_GPL(net_dec_egress_queue);
|
||||
|
||||
static struct static_key netstamp_needed __read_mostly;
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
/* We are not allowed to call static_key_slow_dec() from irq context
|
||||
* If net_disable_timestamp() is called from irq context, defer the
|
||||
* static_key_slow_dec() calls.
|
||||
*/
|
||||
static atomic_t netstamp_needed_deferred;
|
||||
static void netstamp_clear(struct work_struct *work)
|
||||
{
|
||||
int deferred = atomic_xchg(&netstamp_needed_deferred, 0);
|
||||
|
||||
while (deferred--)
|
||||
static_key_slow_dec(&netstamp_needed);
|
||||
}
|
||||
static DECLARE_WORK(netstamp_work, netstamp_clear);
|
||||
#endif
|
||||
|
||||
void net_enable_timestamp(void)
|
||||
{
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
int deferred = atomic_xchg(&netstamp_needed_deferred, 0);
|
||||
|
||||
if (deferred) {
|
||||
while (--deferred)
|
||||
static_key_slow_dec(&netstamp_needed);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
static_key_slow_inc(&netstamp_needed);
|
||||
}
|
||||
EXPORT_SYMBOL(net_enable_timestamp);
|
||||
@@ -1720,12 +1715,12 @@ EXPORT_SYMBOL(net_enable_timestamp);
|
||||
void net_disable_timestamp(void)
|
||||
{
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
if (in_interrupt()) {
|
||||
atomic_inc(&netstamp_needed_deferred);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/* net_disable_timestamp() can be called from non process context */
|
||||
atomic_inc(&netstamp_needed_deferred);
|
||||
schedule_work(&netstamp_work);
|
||||
#else
|
||||
static_key_slow_dec(&netstamp_needed);
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(net_disable_timestamp);
|
||||
|
||||
|
@@ -1404,9 +1404,12 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
|
||||
if (regs.len > reglen)
|
||||
regs.len = reglen;
|
||||
|
||||
regbuf = vzalloc(reglen);
|
||||
if (reglen && !regbuf)
|
||||
return -ENOMEM;
|
||||
regbuf = NULL;
|
||||
if (reglen) {
|
||||
regbuf = vzalloc(reglen);
|
||||
if (!regbuf)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ops->get_regs(dev, ®s, regbuf);
|
||||
|
||||
|
Reference in New Issue
Block a user