commit 3bbb9ec946 (timers: Introduce the concept of timer slack for legacy timers) does not take the case into account when the timer is already expired. This broke wireless drivers. The solution is not to apply slack to already expired timers.
Unified · Split
| @@ -750,13 +750,14 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) · 749 unmodified lines | ||
| 750 | 750 | unsigned long expires_limit, mask; |
| 751 | 751 | int bit; |
| 752 | 752 | |
| 753 | − expires_limit = expires + timer->slack; | |
| 753 | + expires_limit = expires; | |
| 754 | 754 | |
| 755 | − if (timer->slack < 0) /* auto slack: use 0.4% */ | |
| 755 | + if (timer->slack > -1) | |
| 756 | + expires_limit = expires + timer->slack; | |
| 757 | + else if (time_after(expires, jiffies)) /* auto slack: use 0.4% */ | |
| 756 | 758 | expires_limit = expires + (expires - jiffies)/256; |
| 757 | 759 | |
| 758 | 760 | mask = expires ^ expires_limit; |
| 759 | − | |
| 760 | 761 | if (mask == 0) |
| 761 | 762 | return expires; |
| 762 | 763 | |