|
@@ -1695,24 +1695,19 @@ EXPORT_SYMBOL_GPL(net_dec_egress_queue);
|
|
|
|
|
|
static struct static_key netstamp_needed __read_mostly;
|
|
static struct static_key netstamp_needed __read_mostly;
|
|
#ifdef HAVE_JUMP_LABEL
|
|
#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 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);
|
|
int deferred = atomic_xchg(&netstamp_needed_deferred, 0);
|
|
|
|
|
|
- if (deferred) {
|
|
|
|
- while (--deferred)
|
|
|
|
- static_key_slow_dec(&netstamp_needed);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ while (deferred--)
|
|
|
|
+ static_key_slow_dec(&netstamp_needed);
|
|
|
|
+}
|
|
|
|
+static DECLARE_WORK(netstamp_work, netstamp_clear);
|
|
#endif
|
|
#endif
|
|
|
|
+
|
|
|
|
+void net_enable_timestamp(void)
|
|
|
|
+{
|
|
static_key_slow_inc(&netstamp_needed);
|
|
static_key_slow_inc(&netstamp_needed);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(net_enable_timestamp);
|
|
EXPORT_SYMBOL(net_enable_timestamp);
|
|
@@ -1720,12 +1715,12 @@ EXPORT_SYMBOL(net_enable_timestamp);
|
|
void net_disable_timestamp(void)
|
|
void net_disable_timestamp(void)
|
|
{
|
|
{
|
|
#ifdef HAVE_JUMP_LABEL
|
|
#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);
|
|
static_key_slow_dec(&netstamp_needed);
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(net_disable_timestamp);
|
|
EXPORT_SYMBOL(net_disable_timestamp);
|
|
|
|
|