| .. | .. |
|---|
| 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) */ |
|---|