s390/idle: consolidate idle functions and definitions
Move the C functions and definitions related to the idle state handling to arch/s390/include/asm/idle.h and arch/s390/kernel/idle.c. The function s390_get_idle_time is renamed to arch_cpu_idle_time and vtime_stop_cpu to enabled_wait. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
fe0f49768d
commit
b5f87f15e2
12 changed files with 166 additions and 144 deletions
|
@ -8,8 +8,6 @@
|
||||||
#define _S390_CPUTIME_H
|
#define _S390_CPUTIME_H
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/percpu.h>
|
|
||||||
#include <linux/spinlock.h>
|
|
||||||
#include <asm/div64.h>
|
#include <asm/div64.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,20 +163,8 @@ static inline clock_t cputime64_to_clock_t(cputime64_t cputime)
|
||||||
return clock;
|
return clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct s390_idle_data {
|
cputime64_t arch_cpu_idle_time(int cpu);
|
||||||
unsigned int sequence;
|
|
||||||
unsigned long long idle_count;
|
|
||||||
unsigned long long idle_time;
|
|
||||||
unsigned long long clock_idle_enter;
|
|
||||||
unsigned long long clock_idle_exit;
|
|
||||||
unsigned long long timer_idle_enter;
|
|
||||||
unsigned long long timer_idle_exit;
|
|
||||||
};
|
|
||||||
|
|
||||||
DECLARE_PER_CPU(struct s390_idle_data, s390_idle);
|
#define arch_idle_time(cpu) arch_cpu_idle_time(cpu)
|
||||||
|
|
||||||
cputime64_t s390_get_idle_time(int cpu);
|
|
||||||
|
|
||||||
#define arch_idle_time(cpu) s390_get_idle_time(cpu)
|
|
||||||
|
|
||||||
#endif /* _S390_CPUTIME_H */
|
#endif /* _S390_CPUTIME_H */
|
||||||
|
|
26
arch/s390/include/asm/idle.h
Normal file
26
arch/s390/include/asm/idle.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright IBM Corp. 2014
|
||||||
|
*
|
||||||
|
* Author: Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _S390_IDLE_H
|
||||||
|
#define _S390_IDLE_H
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
|
||||||
|
struct s390_idle_data {
|
||||||
|
unsigned int sequence;
|
||||||
|
unsigned long long idle_count;
|
||||||
|
unsigned long long idle_time;
|
||||||
|
unsigned long long clock_idle_enter;
|
||||||
|
unsigned long long clock_idle_exit;
|
||||||
|
unsigned long long timer_idle_enter;
|
||||||
|
unsigned long long timer_idle_exit;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct device_attribute dev_attr_idle_count;
|
||||||
|
extern struct device_attribute dev_attr_idle_time_us;
|
||||||
|
|
||||||
|
#endif /* _S390_IDLE_H */
|
|
@ -290,6 +290,11 @@ static inline unsigned long __rewind_psw(psw_t psw, unsigned long ilc)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function to stop a processor until the next interrupt occurs
|
||||||
|
*/
|
||||||
|
void enabled_wait(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function to drop a processor into disabled wait state
|
* Function to drop a processor into disabled wait state
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -28,6 +28,4 @@ extern int del_virt_timer(struct vtimer_list *timer);
|
||||||
extern void init_cpu_vtimer(void);
|
extern void init_cpu_vtimer(void);
|
||||||
extern void vtime_init(void);
|
extern void vtime_init(void);
|
||||||
|
|
||||||
extern void vtime_stop_cpu(void);
|
|
||||||
|
|
||||||
#endif /* _ASM_S390_TIMER_H */
|
#endif /* _ASM_S390_TIMER_H */
|
||||||
|
|
|
@ -28,7 +28,7 @@ CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"'
|
||||||
|
|
||||||
CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w
|
CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w
|
||||||
|
|
||||||
obj-y := traps.o time.o process.o base.o early.o setup.o vtime.o
|
obj-y := traps.o time.o process.o base.o early.o setup.o idle.o vtime.o
|
||||||
obj-y += processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
|
obj-y += processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
|
||||||
obj-y += debug.o irq.o ipl.o dis.o diag.o sclp.o vdso.o
|
obj-y += debug.o irq.o ipl.o dis.o diag.o sclp.o vdso.o
|
||||||
obj-y += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
|
obj-y += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include <linux/kbuild.h>
|
#include <linux/kbuild.h>
|
||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <asm/cputime.h>
|
#include <asm/idle.h>
|
||||||
#include <asm/vdso.h>
|
#include <asm/vdso.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/cputime.h>
|
#include <asm/idle.h>
|
||||||
|
|
||||||
extern void *restart_stack;
|
extern void *restart_stack;
|
||||||
extern unsigned long suspend_zero_pages;
|
extern unsigned long suspend_zero_pages;
|
||||||
|
|
124
arch/s390/kernel/idle.c
Normal file
124
arch/s390/kernel/idle.c
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Idle functions for s390.
|
||||||
|
*
|
||||||
|
* Copyright IBM Corp. 2014
|
||||||
|
*
|
||||||
|
* Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/kernel_stat.h>
|
||||||
|
#include <linux/kprobes.h>
|
||||||
|
#include <linux/notifier.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/cpu.h>
|
||||||
|
#include <asm/cputime.h>
|
||||||
|
#include <asm/nmi.h>
|
||||||
|
#include <asm/smp.h>
|
||||||
|
#include "entry.h"
|
||||||
|
|
||||||
|
static DEFINE_PER_CPU(struct s390_idle_data, s390_idle);
|
||||||
|
|
||||||
|
void __kprobes enabled_wait(void)
|
||||||
|
{
|
||||||
|
struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
|
||||||
|
unsigned long long idle_time;
|
||||||
|
unsigned long psw_mask;
|
||||||
|
|
||||||
|
trace_hardirqs_on();
|
||||||
|
|
||||||
|
/* Wait for external, I/O or machine check interrupt. */
|
||||||
|
psw_mask = PSW_KERNEL_BITS | PSW_MASK_WAIT | PSW_MASK_DAT |
|
||||||
|
PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;
|
||||||
|
clear_cpu_flag(CIF_NOHZ_DELAY);
|
||||||
|
|
||||||
|
/* Call the assembler magic in entry.S */
|
||||||
|
psw_idle(idle, psw_mask);
|
||||||
|
|
||||||
|
/* Account time spent with enabled wait psw loaded as idle time. */
|
||||||
|
idle->sequence++;
|
||||||
|
smp_wmb();
|
||||||
|
idle_time = idle->clock_idle_exit - idle->clock_idle_enter;
|
||||||
|
idle->clock_idle_enter = idle->clock_idle_exit = 0ULL;
|
||||||
|
idle->idle_time += idle_time;
|
||||||
|
idle->idle_count++;
|
||||||
|
account_idle_time(idle_time);
|
||||||
|
smp_wmb();
|
||||||
|
idle->sequence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t show_idle_count(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct s390_idle_data *idle = &per_cpu(s390_idle, dev->id);
|
||||||
|
unsigned long long idle_count;
|
||||||
|
unsigned int sequence;
|
||||||
|
|
||||||
|
do {
|
||||||
|
sequence = ACCESS_ONCE(idle->sequence);
|
||||||
|
idle_count = ACCESS_ONCE(idle->idle_count);
|
||||||
|
if (ACCESS_ONCE(idle->clock_idle_enter))
|
||||||
|
idle_count++;
|
||||||
|
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
||||||
|
return sprintf(buf, "%llu\n", idle_count);
|
||||||
|
}
|
||||||
|
DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL);
|
||||||
|
|
||||||
|
static ssize_t show_idle_time(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct s390_idle_data *idle = &per_cpu(s390_idle, dev->id);
|
||||||
|
unsigned long long now, idle_time, idle_enter, idle_exit;
|
||||||
|
unsigned int sequence;
|
||||||
|
|
||||||
|
do {
|
||||||
|
now = get_tod_clock();
|
||||||
|
sequence = ACCESS_ONCE(idle->sequence);
|
||||||
|
idle_time = ACCESS_ONCE(idle->idle_time);
|
||||||
|
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||||
|
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||||
|
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
||||||
|
idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0;
|
||||||
|
return sprintf(buf, "%llu\n", idle_time >> 12);
|
||||||
|
}
|
||||||
|
DEVICE_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
||||||
|
|
||||||
|
cputime64_t arch_cpu_idle_time(int cpu)
|
||||||
|
{
|
||||||
|
struct s390_idle_data *idle = &per_cpu(s390_idle, cpu);
|
||||||
|
unsigned long long now, idle_enter, idle_exit;
|
||||||
|
unsigned int sequence;
|
||||||
|
|
||||||
|
do {
|
||||||
|
now = get_tod_clock();
|
||||||
|
sequence = ACCESS_ONCE(idle->sequence);
|
||||||
|
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||||
|
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||||
|
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
||||||
|
return idle_enter ? ((idle_exit ?: now) - idle_enter) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_cpu_idle_enter(void)
|
||||||
|
{
|
||||||
|
local_mcck_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_cpu_idle(void)
|
||||||
|
{
|
||||||
|
if (!test_cpu_flag(CIF_MCCK_PENDING))
|
||||||
|
/* Halt the cpu and keep track of cpu time accounting. */
|
||||||
|
enabled_wait();
|
||||||
|
local_irq_enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_cpu_idle_exit(void)
|
||||||
|
{
|
||||||
|
local_mcck_enable();
|
||||||
|
if (test_cpu_flag(CIF_MCCK_PENDING))
|
||||||
|
s390_handle_mcck();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_cpu_idle_dead(void)
|
||||||
|
{
|
||||||
|
cpu_die();
|
||||||
|
}
|
|
@ -61,30 +61,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
|
||||||
return sf->gprs[8];
|
return sf->gprs[8];
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_cpu_idle(void)
|
|
||||||
{
|
|
||||||
local_mcck_disable();
|
|
||||||
if (test_cpu_flag(CIF_MCCK_PENDING)) {
|
|
||||||
local_mcck_enable();
|
|
||||||
local_irq_enable();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* Halt the cpu and keep track of cpu time accounting. */
|
|
||||||
vtime_stop_cpu();
|
|
||||||
local_irq_enable();
|
|
||||||
}
|
|
||||||
|
|
||||||
void arch_cpu_idle_exit(void)
|
|
||||||
{
|
|
||||||
if (test_cpu_flag(CIF_MCCK_PENDING))
|
|
||||||
s390_handle_mcck();
|
|
||||||
}
|
|
||||||
|
|
||||||
void arch_cpu_idle_dead(void)
|
|
||||||
{
|
|
||||||
cpu_die();
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void __kprobes kernel_thread_starter(void);
|
extern void __kprobes kernel_thread_starter(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#include <asm/debug.h>
|
#include <asm/debug.h>
|
||||||
#include <asm/os_info.h>
|
#include <asm/os_info.h>
|
||||||
#include <asm/sigp.h>
|
#include <asm/sigp.h>
|
||||||
|
#include <asm/idle.h>
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -661,7 +662,7 @@ static void smp_start_secondary(void *cpuvoid)
|
||||||
cpu_init();
|
cpu_init();
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
init_cpu_timer();
|
init_cpu_timer();
|
||||||
init_cpu_vtimer();
|
vtime_init();
|
||||||
pfault_init();
|
pfault_init();
|
||||||
notify_cpu_starting(smp_processor_id());
|
notify_cpu_starting(smp_processor_id());
|
||||||
set_cpu_online(smp_processor_id(), true);
|
set_cpu_online(smp_processor_id(), true);
|
||||||
|
@ -893,42 +894,6 @@ static struct attribute_group cpu_common_attr_group = {
|
||||||
.attrs = cpu_common_attrs,
|
.attrs = cpu_common_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t show_idle_count(struct device *dev,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct s390_idle_data *idle = &per_cpu(s390_idle, dev->id);
|
|
||||||
unsigned long long idle_count;
|
|
||||||
unsigned int sequence;
|
|
||||||
|
|
||||||
do {
|
|
||||||
sequence = ACCESS_ONCE(idle->sequence);
|
|
||||||
idle_count = ACCESS_ONCE(idle->idle_count);
|
|
||||||
if (ACCESS_ONCE(idle->clock_idle_enter))
|
|
||||||
idle_count++;
|
|
||||||
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
|
||||||
return sprintf(buf, "%llu\n", idle_count);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL);
|
|
||||||
|
|
||||||
static ssize_t show_idle_time(struct device *dev,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct s390_idle_data *idle = &per_cpu(s390_idle, dev->id);
|
|
||||||
unsigned long long now, idle_time, idle_enter, idle_exit;
|
|
||||||
unsigned int sequence;
|
|
||||||
|
|
||||||
do {
|
|
||||||
now = get_tod_clock();
|
|
||||||
sequence = ACCESS_ONCE(idle->sequence);
|
|
||||||
idle_time = ACCESS_ONCE(idle->idle_time);
|
|
||||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
|
||||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
|
||||||
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
|
||||||
idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0;
|
|
||||||
return sprintf(buf, "%llu\n", idle_time >> 12);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
|
||||||
|
|
||||||
static struct attribute *cpu_online_attrs[] = {
|
static struct attribute *cpu_online_attrs[] = {
|
||||||
&dev_attr_idle_count.attr,
|
&dev_attr_idle_count.attr,
|
||||||
&dev_attr_idle_time_us.attr,
|
&dev_attr_idle_time_us.attr,
|
||||||
|
|
|
@ -6,27 +6,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/notifier.h>
|
|
||||||
#include <linux/kprobes.h>
|
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/cpu.h>
|
|
||||||
#include <linux/smp.h>
|
|
||||||
|
|
||||||
#include <asm/irq_regs.h>
|
|
||||||
#include <asm/cputime.h>
|
#include <asm/cputime.h>
|
||||||
#include <asm/vtimer.h>
|
#include <asm/vtimer.h>
|
||||||
#include <asm/vtime.h>
|
#include <asm/vtime.h>
|
||||||
#include <asm/irq.h>
|
|
||||||
#include "entry.h"
|
|
||||||
|
|
||||||
static void virt_timer_expire(void);
|
static void virt_timer_expire(void);
|
||||||
|
|
||||||
DEFINE_PER_CPU(struct s390_idle_data, s390_idle);
|
|
||||||
|
|
||||||
static LIST_HEAD(virt_timer_list);
|
static LIST_HEAD(virt_timer_list);
|
||||||
static DEFINE_SPINLOCK(virt_timer_lock);
|
static DEFINE_SPINLOCK(virt_timer_lock);
|
||||||
static atomic64_t virt_timer_current;
|
static atomic64_t virt_timer_current;
|
||||||
|
@ -152,49 +143,6 @@ void vtime_account_system(struct task_struct *tsk)
|
||||||
__attribute__((alias("vtime_account_irq_enter")));
|
__attribute__((alias("vtime_account_irq_enter")));
|
||||||
EXPORT_SYMBOL_GPL(vtime_account_system);
|
EXPORT_SYMBOL_GPL(vtime_account_system);
|
||||||
|
|
||||||
void __kprobes vtime_stop_cpu(void)
|
|
||||||
{
|
|
||||||
struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
|
|
||||||
unsigned long long idle_time;
|
|
||||||
unsigned long psw_mask;
|
|
||||||
|
|
||||||
trace_hardirqs_on();
|
|
||||||
|
|
||||||
/* Wait for external, I/O or machine check interrupt. */
|
|
||||||
psw_mask = PSW_KERNEL_BITS | PSW_MASK_WAIT | PSW_MASK_DAT |
|
|
||||||
PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;
|
|
||||||
clear_cpu_flag(CIF_NOHZ_DELAY);
|
|
||||||
|
|
||||||
/* Call the assembler magic in entry.S */
|
|
||||||
psw_idle(idle, psw_mask);
|
|
||||||
|
|
||||||
/* Account time spent with enabled wait psw loaded as idle time. */
|
|
||||||
idle->sequence++;
|
|
||||||
smp_wmb();
|
|
||||||
idle_time = idle->clock_idle_exit - idle->clock_idle_enter;
|
|
||||||
idle->clock_idle_enter = idle->clock_idle_exit = 0ULL;
|
|
||||||
idle->idle_time += idle_time;
|
|
||||||
idle->idle_count++;
|
|
||||||
account_idle_time(idle_time);
|
|
||||||
smp_wmb();
|
|
||||||
idle->sequence++;
|
|
||||||
}
|
|
||||||
|
|
||||||
cputime64_t s390_get_idle_time(int cpu)
|
|
||||||
{
|
|
||||||
struct s390_idle_data *idle = &per_cpu(s390_idle, cpu);
|
|
||||||
unsigned long long now, idle_enter, idle_exit;
|
|
||||||
unsigned int sequence;
|
|
||||||
|
|
||||||
do {
|
|
||||||
now = get_tod_clock();
|
|
||||||
sequence = ACCESS_ONCE(idle->sequence);
|
|
||||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
|
||||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
|
||||||
} while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence));
|
|
||||||
return idle_enter ? ((idle_exit ?: now) - idle_enter) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sorted add to a list. List is linear searched until first bigger
|
* Sorted add to a list. List is linear searched until first bigger
|
||||||
* element is found.
|
* element is found.
|
||||||
|
@ -372,14 +320,8 @@ EXPORT_SYMBOL(del_virt_timer);
|
||||||
/*
|
/*
|
||||||
* Start the virtual CPU timer on the current CPU.
|
* Start the virtual CPU timer on the current CPU.
|
||||||
*/
|
*/
|
||||||
void init_cpu_vtimer(void)
|
void vtime_init(void)
|
||||||
{
|
{
|
||||||
/* set initial cpu timer */
|
/* set initial cpu timer */
|
||||||
set_vtimer(VTIMER_MAX_SLICE);
|
set_vtimer(VTIMER_MAX_SLICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init vtime_init(void)
|
|
||||||
{
|
|
||||||
/* Enable cpu timer interrupts on the boot cpu. */
|
|
||||||
init_cpu_vtimer();
|
|
||||||
}
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ static void __udelay_disabled(unsigned long long usecs)
|
||||||
lockdep_off();
|
lockdep_off();
|
||||||
do {
|
do {
|
||||||
set_clock_comparator(end);
|
set_clock_comparator(end);
|
||||||
vtime_stop_cpu();
|
enabled_wait();
|
||||||
} while (get_tod_clock_fast() < end);
|
} while (get_tod_clock_fast() < end);
|
||||||
lockdep_on();
|
lockdep_on();
|
||||||
__ctl_load(cr0, 0, 0);
|
__ctl_load(cr0, 0, 0);
|
||||||
|
@ -62,7 +62,7 @@ static void __udelay_enabled(unsigned long long usecs)
|
||||||
clock_saved = local_tick_disable();
|
clock_saved = local_tick_disable();
|
||||||
set_clock_comparator(end);
|
set_clock_comparator(end);
|
||||||
}
|
}
|
||||||
vtime_stop_cpu();
|
enabled_wait();
|
||||||
if (clock_saved)
|
if (clock_saved)
|
||||||
local_tick_enable(clock_saved);
|
local_tick_enable(clock_saved);
|
||||||
} while (get_tod_clock_fast() < end);
|
} while (get_tod_clock_fast() < end);
|
||||||
|
|
Loading…
Add table
Reference in a new issue