.. | .. |
---|
69 | 69 | return; |
---|
70 | 70 | |
---|
71 | 71 | /* Reevaluate with jiffies_lock held */ |
---|
72 | | - write_seqlock(&jiffies_lock); |
---|
| 72 | + raw_spin_lock(&jiffies_lock); |
---|
| 73 | + write_seqcount_begin(&jiffies_seq); |
---|
73 | 74 | |
---|
74 | 75 | delta = ktime_sub(now, last_jiffies_update); |
---|
75 | 76 | if (delta >= tick_period) { |
---|
.. | .. |
---|
95 | 96 | /* Keep the tick_next_period variable up to date */ |
---|
96 | 97 | tick_next_period = ktime_add(last_jiffies_update, tick_period); |
---|
97 | 98 | } else { |
---|
98 | | - write_sequnlock(&jiffies_lock); |
---|
| 99 | + write_seqcount_end(&jiffies_seq); |
---|
| 100 | + raw_spin_unlock(&jiffies_lock); |
---|
99 | 101 | return; |
---|
100 | 102 | } |
---|
101 | | - write_sequnlock(&jiffies_lock); |
---|
| 103 | + write_seqcount_end(&jiffies_seq); |
---|
| 104 | + raw_spin_unlock(&jiffies_lock); |
---|
102 | 105 | update_wall_time(); |
---|
103 | 106 | } |
---|
104 | 107 | |
---|
.. | .. |
---|
109 | 112 | { |
---|
110 | 113 | ktime_t period; |
---|
111 | 114 | |
---|
112 | | - write_seqlock(&jiffies_lock); |
---|
| 115 | + raw_spin_lock(&jiffies_lock); |
---|
| 116 | + write_seqcount_begin(&jiffies_seq); |
---|
113 | 117 | /* Did we start the jiffies update yet ? */ |
---|
114 | 118 | if (last_jiffies_update == 0) |
---|
115 | 119 | last_jiffies_update = tick_next_period; |
---|
116 | 120 | period = last_jiffies_update; |
---|
117 | | - write_sequnlock(&jiffies_lock); |
---|
| 121 | + write_seqcount_end(&jiffies_seq); |
---|
| 122 | + raw_spin_unlock(&jiffies_lock); |
---|
118 | 123 | return period; |
---|
119 | 124 | } |
---|
120 | 125 | |
---|
.. | .. |
---|
232 | 237 | |
---|
233 | 238 | static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = { |
---|
234 | 239 | .func = nohz_full_kick_func, |
---|
| 240 | + .flags = IRQ_WORK_HARD_IRQ, |
---|
235 | 241 | }; |
---|
236 | 242 | |
---|
237 | 243 | /* |
---|
.. | .. |
---|
657 | 663 | |
---|
658 | 664 | /* Read jiffies and the time when jiffies were updated last */ |
---|
659 | 665 | do { |
---|
660 | | - seq = read_seqbegin(&jiffies_lock); |
---|
| 666 | + seq = read_seqcount_begin(&jiffies_seq); |
---|
661 | 667 | basemono = last_jiffies_update; |
---|
662 | 668 | basejiff = jiffies; |
---|
663 | | - } while (read_seqretry(&jiffies_lock, seq)); |
---|
| 669 | + } while (read_seqcount_retry(&jiffies_seq, seq)); |
---|
664 | 670 | ts->last_jiffies = basejiff; |
---|
665 | 671 | ts->timer_expires_base = basemono; |
---|
666 | 672 | |
---|
.. | .. |
---|
891 | 897 | return false; |
---|
892 | 898 | |
---|
893 | 899 | if (unlikely(local_softirq_pending() && cpu_online(cpu))) { |
---|
894 | | - static int ratelimit; |
---|
895 | | - |
---|
896 | | - if (ratelimit < 10 && |
---|
897 | | - (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { |
---|
898 | | - pr_warn("NOHZ: local_softirq_pending %02x\n", |
---|
899 | | - (unsigned int) local_softirq_pending()); |
---|
900 | | - ratelimit++; |
---|
901 | | - } |
---|
| 900 | + softirq_check_pending_idle(); |
---|
902 | 901 | return false; |
---|
903 | 902 | } |
---|
904 | 903 | |
---|
.. | .. |
---|
1330 | 1329 | /* |
---|
1331 | 1330 | * Emulate tick processing via per-CPU hrtimers: |
---|
1332 | 1331 | */ |
---|
1333 | | - hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); |
---|
| 1332 | + hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); |
---|
1334 | 1333 | ts->sched_timer.function = tick_sched_timer; |
---|
1335 | 1334 | |
---|
1336 | 1335 | /* Get the next period (per-CPU) */ |
---|