File tree Expand file tree Collapse file tree 1 file changed +13
-18
lines changed Expand file tree Collapse file tree 1 file changed +13
-18
lines changed Original file line number Diff line number Diff line change @@ -1695,37 +1695,32 @@ EXPORT_SYMBOL_GPL(net_dec_egress_queue);
1695
1695
1696
1696
static struct static_key netstamp_needed __read_mostly ;
1697
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
1698
static atomic_t netstamp_needed_deferred ;
1703
- #endif
1704
-
1705
- void net_enable_timestamp (void )
1699
+ static void netstamp_clear (struct work_struct * work )
1706
1700
{
1707
- #ifdef HAVE_JUMP_LABEL
1708
1701
int deferred = atomic_xchg (& netstamp_needed_deferred , 0 );
1709
1702
1710
- if (deferred ) {
1711
- while (-- deferred )
1712
- static_key_slow_dec (& netstamp_needed );
1713
- return ;
1714
- }
1703
+ while (deferred -- )
1704
+ static_key_slow_dec (& netstamp_needed );
1705
+ }
1706
+ static DECLARE_WORK (netstamp_work , netstamp_clear );
1715
1707
#endif
1708
+
1709
+ void net_enable_timestamp (void )
1710
+ {
1716
1711
static_key_slow_inc (& netstamp_needed );
1717
1712
}
1718
1713
EXPORT_SYMBOL (net_enable_timestamp );
1719
1714
1720
1715
void net_disable_timestamp (void )
1721
1716
{
1722
1717
#ifdef HAVE_JUMP_LABEL
1723
- if (in_interrupt ()) {
1724
- atomic_inc (& netstamp_needed_deferred );
1725
- return ;
1726
- }
1727
- #endif
1718
+ /* net_disable_timestamp() can be called from non process context */
1719
+ atomic_inc (& netstamp_needed_deferred );
1720
+ schedule_work (& netstamp_work );
1721
+ #else
1728
1722
static_key_slow_dec (& netstamp_needed );
1723
+ #endif
1729
1724
}
1730
1725
EXPORT_SYMBOL (net_disable_timestamp );
1731
1726
You can’t perform that action at this time.
0 commit comments