diff options
Diffstat (limited to 'arch/x86/kernel')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 23 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/centaur.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cyrix.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/transmeta.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/vmware.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/ftrace.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/hpet.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/kdebugfs.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/kprobes/common.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/kprobes/core.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/kprobes/opt.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/machine_kexec_64.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/reboot.c | 16 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc.c | 35 | 
18 files changed, 60 insertions, 57 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 4261b3282ad9..aee7deddabd0 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1610,24 +1610,15 @@ static inline void try_to_enable_x2apic(int remap_mode) { }  static inline void __x2apic_enable(void) { }  #endif /* !CONFIG_X86_X2APIC */ -static int __init try_to_enable_IR(void) -{ -#ifdef CONFIG_X86_IO_APIC -	if (!x2apic_enabled() && skip_ioapic_setup) { -		pr_info("Not enabling interrupt remapping due to skipped IO-APIC setup\n"); -		return -1; -	} -#endif -	return irq_remapping_enable(); -} -  void __init enable_IR_x2apic(void)  {  	unsigned long flags;  	int ret, ir_stat; -	if (skip_ioapic_setup) +	if (skip_ioapic_setup) { +		pr_info("Not enabling interrupt remapping due to skipped IO-APIC setup\n");  		return; +	}  	ir_stat = irq_remapping_prepare();  	if (ir_stat < 0 && !x2apic_supported()) @@ -1645,7 +1636,7 @@ void __init enable_IR_x2apic(void)  	/* If irq_remapping_prepare() succeeded, try to enable it */  	if (ir_stat >= 0) -		ir_stat = try_to_enable_IR(); +		ir_stat = irq_remapping_enable();  	/* ir_stat contains the remap mode or an error code */  	try_to_enable_x2apic(ir_stat); @@ -2062,10 +2053,10 @@ static int allocate_logical_cpuid(int apicid)  	/* Allocate a new cpuid. */  	if (nr_logical_cpuids >= nr_cpu_ids) { -		WARN_ONCE(1, "Only %d processors supported." +		WARN_ONCE(1, "APIC: NR_CPUS/possible_cpus limit of %i reached. "  			     "Processor %d/0x%x and the rest are ignored.\n", -			     nr_cpu_ids - 1, nr_logical_cpuids, apicid); -		return -1; +			     nr_cpu_ids, nr_logical_cpuids, apicid); +		return -EINVAL;  	}  	cpuid_to_apicid[nr_logical_cpuids] = apicid; diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 35a5d5dca2fa..c36140d788fe 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -556,10 +556,6 @@ static void early_init_amd(struct cpuinfo_x86 *c)  	if (c->x86_power & (1 << 8)) {  		set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);  		set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); -		if (check_tsc_unstable()) -			clear_sched_clock_stable(); -	} else { -		clear_sched_clock_stable();  	}  	/* Bit 12 of 8000_0007 edx is accumulated power mechanism. */ diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index adc0ebd8bed0..43955ee6715b 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c @@ -105,8 +105,6 @@ static void early_init_centaur(struct cpuinfo_x86 *c)  #ifdef CONFIG_X86_64  	set_cpu_cap(c, X86_FEATURE_SYSENTER32);  #endif - -	clear_sched_clock_stable();  }  static void init_centaur(struct cpuinfo_x86 *c) diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index b11b38c3b0bd..58094a1f9e9d 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -88,7 +88,6 @@ static void default_init(struct cpuinfo_x86 *c)  			strcpy(c->x86_model_id, "386");  	}  #endif -	clear_sched_clock_stable();  }  static const struct cpu_dev default_cpu = { @@ -1077,8 +1076,6 @@ static void identify_cpu(struct cpuinfo_x86 *c)  	 */  	if (this_cpu->c_init)  		this_cpu->c_init(c); -	else -		clear_sched_clock_stable();  	/* Disable the PN if appropriate */  	squash_the_stupid_serial_number(c); diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index 0a3bc19de017..a70fd61095f8 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c @@ -185,7 +185,6 @@ static void early_init_cyrix(struct cpuinfo_x86 *c)  		set_cpu_cap(c, X86_FEATURE_CYRIX_ARR);  		break;  	} -	clear_sched_clock_stable();  }  static void init_cyrix(struct cpuinfo_x86 *c) diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index fe0a615a051b..063197771b8d 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -162,10 +162,6 @@ static void early_init_intel(struct cpuinfo_x86 *c)  	if (c->x86_power & (1 << 8)) {  		set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);  		set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); -		if (check_tsc_unstable()) -			clear_sched_clock_stable(); -	} else { -		clear_sched_clock_stable();  	}  	/* Penwell and Cloverview have the TSC which doesn't sleep on S3 */ diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c index 0bbe0f3a039f..c05509d38b1f 100644 --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c @@ -28,7 +28,6 @@  #include <linux/sched/signal.h>  #include <linux/sched/task.h>  #include <linux/slab.h> -#include <linux/cpu.h>  #include <linux/task_work.h>  #include <uapi/linux/magic.h> diff --git a/arch/x86/kernel/cpu/transmeta.c b/arch/x86/kernel/cpu/transmeta.c index 8457b4978668..d77d07ab310b 100644 --- a/arch/x86/kernel/cpu/transmeta.c +++ b/arch/x86/kernel/cpu/transmeta.c @@ -16,8 +16,6 @@ static void early_init_transmeta(struct cpuinfo_x86 *c)  		if (xlvl >= 0x80860001)  			c->x86_capability[CPUID_8086_0001_EDX] = cpuid_edx(0x80860001);  	} - -	clear_sched_clock_stable();  }  static void init_transmeta(struct cpuinfo_x86 *c) diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index 891f4dad7b2c..22403a28caf5 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -30,7 +30,6 @@  #include <asm/hypervisor.h>  #include <asm/timer.h>  #include <asm/apic.h> -#include <asm/timer.h>  #undef pr_fmt  #define pr_fmt(fmt)	"vmware: " fmt diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 8639bb2ae058..8f3d9cf26ff9 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c @@ -535,7 +535,7 @@ static void run_sync(void)  {  	int enable_irqs = irqs_disabled(); -	/* We may be called with interrupts disbled (on bootup). */ +	/* We may be called with interrupts disabled (on bootup). */  	if (enable_irqs)  		local_irq_enable();  	on_each_cpu(do_sync_core, NULL, 1); diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index dc6ba5bda9fc..89ff7af2de50 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -354,7 +354,7 @@ static int hpet_resume(struct clock_event_device *evt, int timer)  		irq_domain_deactivate_irq(irq_get_irq_data(hdev->irq));  		irq_domain_activate_irq(irq_get_irq_data(hdev->irq)); -		disable_irq(hdev->irq); +		disable_hardirq(hdev->irq);  		irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu));  		enable_irq(hdev->irq);  	} diff --git a/arch/x86/kernel/kdebugfs.c b/arch/x86/kernel/kdebugfs.c index bdb83e431d89..38b64587b31b 100644 --- a/arch/x86/kernel/kdebugfs.c +++ b/arch/x86/kernel/kdebugfs.c @@ -167,7 +167,7 @@ static int __init boot_params_kdebugfs_init(void)  	struct dentry *dbp, *version, *data;  	int error = -ENOMEM; -	dbp = debugfs_create_dir("boot_params", NULL); +	dbp = debugfs_create_dir("boot_params", arch_debugfs_dir);  	if (!dbp)  		return -ENOMEM; diff --git a/arch/x86/kernel/kprobes/common.h b/arch/x86/kernel/kprobes/common.h index c6ee63f927ab..d688826e5736 100644 --- a/arch/x86/kernel/kprobes/common.h +++ b/arch/x86/kernel/kprobes/common.h @@ -67,7 +67,7 @@  #endif  /* Ensure if the instruction can be boostable */ -extern int can_boost(kprobe_opcode_t *instruction); +extern int can_boost(kprobe_opcode_t *instruction, void *addr);  /* Recover instruction if given address is probed */  extern unsigned long recover_probed_instruction(kprobe_opcode_t *buf,  					 unsigned long addr); diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index 6384eb754a58..993fa4fe4f68 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c @@ -167,12 +167,12 @@ NOKPROBE_SYMBOL(skip_prefixes);   * Returns non-zero if opcode is boostable.   * RIP relative instructions are adjusted at copying time in 64 bits mode   */ -int can_boost(kprobe_opcode_t *opcodes) +int can_boost(kprobe_opcode_t *opcodes, void *addr)  {  	kprobe_opcode_t opcode;  	kprobe_opcode_t *orig_opcodes = opcodes; -	if (search_exception_tables((unsigned long)opcodes)) +	if (search_exception_tables((unsigned long)addr))  		return 0;	/* Page fault may occur on this address. */  retry: @@ -417,7 +417,7 @@ static int arch_copy_kprobe(struct kprobe *p)  	 * __copy_instruction can modify the displacement of the instruction,  	 * but it doesn't affect boostable check.  	 */ -	if (can_boost(p->ainsn.insn)) +	if (can_boost(p->ainsn.insn, p->addr))  		p->ainsn.boostable = 0;  	else  		p->ainsn.boostable = -1; diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c index 3d1bee9d6a72..3e7c6e5a08ff 100644 --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -178,7 +178,7 @@ static int copy_optimized_instructions(u8 *dest, u8 *src)  	while (len < RELATIVEJUMP_SIZE) {  		ret = __copy_instruction(dest + len, src + len); -		if (!ret || !can_boost(dest + len)) +		if (!ret || !can_boost(dest + len, src + len))  			return -EINVAL;  		len += ret;  	} diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 307b1f4543de..857cdbd02867 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c @@ -194,19 +194,22 @@ static int arch_update_purgatory(struct kimage *image)  	/* Setup copying of backup region */  	if (image->type == KEXEC_TYPE_CRASH) { -		ret = kexec_purgatory_get_set_symbol(image, "backup_dest", +		ret = kexec_purgatory_get_set_symbol(image, +				"purgatory_backup_dest",  				&image->arch.backup_load_addr,  				sizeof(image->arch.backup_load_addr), 0);  		if (ret)  			return ret; -		ret = kexec_purgatory_get_set_symbol(image, "backup_src", +		ret = kexec_purgatory_get_set_symbol(image, +				"purgatory_backup_src",  				&image->arch.backup_src_start,  				sizeof(image->arch.backup_src_start), 0);  		if (ret)  			return ret; -		ret = kexec_purgatory_get_set_symbol(image, "backup_sz", +		ret = kexec_purgatory_get_set_symbol(image, +				"purgatory_backup_sz",  				&image->arch.backup_src_sz,  				sizeof(image->arch.backup_src_sz), 0);  		if (ret) diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index e244c19a2451..067f9813fd2c 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -223,6 +223,22 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  			DMI_MATCH(DMI_BOARD_NAME, "P4S800"),  		},  	}, +	{	/* Handle problems with rebooting on ASUS EeeBook X205TA */ +		.callback = set_acpi_reboot, +		.ident = "ASUS EeeBook X205TA", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X205TA"), +		}, +	}, +	{	/* Handle problems with rebooting on ASUS EeeBook X205TAW */ +		.callback = set_acpi_reboot, +		.ident = "ASUS EeeBook X205TAW", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X205TAW"), +		}, +	},  	/* Certec */  	{       /* Handle problems with rebooting on Certec BPC600 */ diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 46bcda4cb1c2..4f7a9833d8e5 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -327,9 +327,16 @@ unsigned long long sched_clock(void)  {  	return paravirt_sched_clock();  } + +static inline bool using_native_sched_clock(void) +{ +	return pv_time_ops.sched_clock == native_sched_clock; +}  #else  unsigned long long  sched_clock(void) __attribute__((alias("native_sched_clock"))); + +static inline bool using_native_sched_clock(void) { return true; }  #endif  int check_tsc_unstable(void) @@ -1112,8 +1119,10 @@ static void tsc_cs_mark_unstable(struct clocksource *cs)  {  	if (tsc_unstable)  		return; +  	tsc_unstable = 1; -	clear_sched_clock_stable(); +	if (using_native_sched_clock()) +		clear_sched_clock_stable();  	disable_sched_clock_irqtime();  	pr_info("Marking TSC unstable due to clocksource watchdog\n");  } @@ -1135,18 +1144,20 @@ static struct clocksource clocksource_tsc = {  void mark_tsc_unstable(char *reason)  { -	if (!tsc_unstable) { -		tsc_unstable = 1; +	if (tsc_unstable) +		return; + +	tsc_unstable = 1; +	if (using_native_sched_clock())  		clear_sched_clock_stable(); -		disable_sched_clock_irqtime(); -		pr_info("Marking TSC unstable due to %s\n", reason); -		/* Change only the rating, when not registered */ -		if (clocksource_tsc.mult) -			clocksource_mark_unstable(&clocksource_tsc); -		else { -			clocksource_tsc.flags |= CLOCK_SOURCE_UNSTABLE; -			clocksource_tsc.rating = 0; -		} +	disable_sched_clock_irqtime(); +	pr_info("Marking TSC unstable due to %s\n", reason); +	/* Change only the rating, when not registered */ +	if (clocksource_tsc.mult) { +		clocksource_mark_unstable(&clocksource_tsc); +	} else { +		clocksource_tsc.flags |= CLOCK_SOURCE_UNSTABLE; +		clocksource_tsc.rating = 0;  	}  }  | 

