diff options
author | David S. Miller <davem@davemloft.net> | 2017-02-07 16:29:30 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-02-07 16:29:30 -0500 |
commit | 3efa70d78f218e4c9276b0bac0545e5184c1c47b (patch) | |
tree | f4abe2f05e173023d2a262afd4aebb1e89fe6985 /net/core/dev.c | |
parent | 76e0e70e6452b971a69cc9794ff4a6715c11f7f2 (diff) | |
parent | 926af6273fc683cd98cd0ce7bf0d04a02eed6742 (diff) |
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>
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 3e1a60102e64..0921609dfa81 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1695,24 +1695,19 @@ EXPORT_SYMBOL_GPL(net_dec_egress_queue); | |||
1695 | 1695 | ||
1696 | static struct static_key netstamp_needed __read_mostly; | 1696 | static struct static_key netstamp_needed __read_mostly; |
1697 | #ifdef HAVE_JUMP_LABEL | 1697 | #ifdef HAVE_JUMP_LABEL |
1698 | /* We are not allowed to call static_key_slow_dec() from irq context | ||
1699 | * If net_disable_timestamp() is called from irq context, defer the | ||
1700 | * static_key_slow_dec() calls. | ||
1701 | */ | ||
1702 | static atomic_t netstamp_needed_deferred; | 1698 | static atomic_t netstamp_needed_deferred; |
1703 | #endif | 1699 | static void netstamp_clear(struct work_struct *work) |
1704 | |||
1705 | void net_enable_timestamp(void) | ||
1706 | { | 1700 | { |
1707 | #ifdef HAVE_JUMP_LABEL | ||
1708 | int deferred = atomic_xchg(&netstamp_needed_deferred, 0); | 1701 | int deferred = atomic_xchg(&netstamp_needed_deferred, 0); |
1709 | 1702 | ||
1710 | if (deferred) { | 1703 | while (deferred--) |
1711 | while (--deferred) | 1704 | static_key_slow_dec(&netstamp_needed); |
1712 | static_key_slow_dec(&netstamp_needed); | 1705 | } |
1713 | return; | 1706 | static DECLARE_WORK(netstamp_work, netstamp_clear); |
1714 | } | ||
1715 | #endif | 1707 | #endif |
1708 | |||
1709 | void net_enable_timestamp(void) | ||
1710 | { | ||
1716 | static_key_slow_inc(&netstamp_needed); | 1711 | static_key_slow_inc(&netstamp_needed); |
1717 | } | 1712 | } |
1718 | EXPORT_SYMBOL(net_enable_timestamp); | 1713 | EXPORT_SYMBOL(net_enable_timestamp); |
@@ -1720,12 +1715,12 @@ EXPORT_SYMBOL(net_enable_timestamp); | |||
1720 | void net_disable_timestamp(void) | 1715 | void net_disable_timestamp(void) |
1721 | { | 1716 | { |
1722 | #ifdef HAVE_JUMP_LABEL | 1717 | #ifdef HAVE_JUMP_LABEL |
1723 | if (in_interrupt()) { | 1718 | /* net_disable_timestamp() can be called from non process context */ |
1724 | atomic_inc(&netstamp_needed_deferred); | 1719 | atomic_inc(&netstamp_needed_deferred); |
1725 | return; | 1720 | schedule_work(&netstamp_work); |
1726 | } | 1721 | #else |
1727 | #endif | ||
1728 | static_key_slow_dec(&netstamp_needed); | 1722 | static_key_slow_dec(&netstamp_needed); |
1723 | #endif | ||
1729 | } | 1724 | } |
1730 | EXPORT_SYMBOL(net_disable_timestamp); | 1725 | EXPORT_SYMBOL(net_disable_timestamp); |
1731 | 1726 | ||