diff --git a/net/core/dev.c b/net/core/dev.c index 727b6fd..0ef1734 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1694,38 +1694,28 @@ EXPORT_SYMBOL_GPL(net_dec_egress_queue); #endif 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; -#endif -void net_enable_timestamp(void) +static void netstamp_clear(struct work_struct *work) { -#ifdef HAVE_JUMP_LABEL - int deferred = atomic_xchg(&netstamp_needed_deferred, 0); + static_key_slow_dec(&netstamp_needed); +} - if (deferred) { - while (--deferred) - static_key_slow_dec(&netstamp_needed); - return; - } -#endif +static DECLARE_WORK(netstamp_work, netstamp_clear); + +void net_enable_timestamp(void) +{ + flush_work(&netstamp_work); static_key_slow_inc(&netstamp_needed); } EXPORT_SYMBOL(net_enable_timestamp); void net_disable_timestamp(void) { -#ifdef HAVE_JUMP_LABEL - if (in_interrupt()) { - atomic_inc(&netstamp_needed_deferred); - return; - } -#endif - static_key_slow_dec(&netstamp_needed); + /* 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. + */ + schedule_work(&netstamp_work); } EXPORT_SYMBOL(net_disable_timestamp);