|
@@ -276,16 +276,13 @@ static void vmi_account_real_cycles(unsigned long long cur_real_cycles)
|
|
|
|
|
|
cycles_not_accounted = cur_real_cycles - real_cycles_accounted_system;
|
|
|
while (cycles_not_accounted >= cycles_per_jiffy) {
|
|
|
- /* systems wide jiffies and wallclock. */
|
|
|
+ /* systems wide jiffies. */
|
|
|
do_timer(1);
|
|
|
|
|
|
cycles_not_accounted -= cycles_per_jiffy;
|
|
|
real_cycles_accounted_system += cycles_per_jiffy;
|
|
|
}
|
|
|
|
|
|
- if (vmi_timer_ops.wallclock_updated())
|
|
|
- update_xtime_from_wallclock();
|
|
|
-
|
|
|
write_sequnlock(&xtime_lock);
|
|
|
}
|
|
|
|
|
@@ -380,7 +377,6 @@ int vmi_stop_hz_timer(void)
|
|
|
unsigned long seq, next;
|
|
|
unsigned long long real_cycles_expiry;
|
|
|
int cpu = smp_processor_id();
|
|
|
- int idle;
|
|
|
|
|
|
BUG_ON(!irqs_disabled());
|
|
|
if (sysctl_hz_timer != 0)
|
|
@@ -388,13 +384,13 @@ int vmi_stop_hz_timer(void)
|
|
|
|
|
|
cpu_set(cpu, nohz_cpu_mask);
|
|
|
smp_mb();
|
|
|
+
|
|
|
if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
|
|
|
- (next = next_timer_interrupt(), time_before_eq(next, jiffies))) {
|
|
|
+ (next = next_timer_interrupt(),
|
|
|
+ time_before_eq(next, jiffies + HZ/CONFIG_VMI_ALARM_HZ))) {
|
|
|
cpu_clear(cpu, nohz_cpu_mask);
|
|
|
- next = jiffies;
|
|
|
- idle = 0;
|
|
|
- } else
|
|
|
- idle = 1;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
/* Convert jiffies to the real cycle counter. */
|
|
|
do {
|
|
@@ -404,17 +400,13 @@ int vmi_stop_hz_timer(void)
|
|
|
} while (read_seqretry(&xtime_lock, seq));
|
|
|
|
|
|
/* This cpu is going idle. Disable the periodic alarm. */
|
|
|
- if (idle) {
|
|
|
- vmi_timer_ops.cancel_alarm(VMI_CYCLES_AVAILABLE);
|
|
|
- per_cpu(idle_start_jiffies, cpu) = jiffies;
|
|
|
- }
|
|
|
-
|
|
|
+ vmi_timer_ops.cancel_alarm(VMI_CYCLES_AVAILABLE);
|
|
|
+ per_cpu(idle_start_jiffies, cpu) = jiffies;
|
|
|
/* Set the real time alarm to expire at the next event. */
|
|
|
vmi_timer_ops.set_alarm(
|
|
|
- VMI_ALARM_WIRING | VMI_ALARM_IS_ONESHOT | VMI_CYCLES_REAL,
|
|
|
- real_cycles_expiry, 0);
|
|
|
-
|
|
|
- return idle;
|
|
|
+ VMI_ALARM_WIRING | VMI_ALARM_IS_ONESHOT | VMI_CYCLES_REAL,
|
|
|
+ real_cycles_expiry, 0);
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
static void vmi_reenable_hz_timer(int cpu)
|