Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fe940d6 authored by Li Shaohua's avatar Li Shaohua Committed by Linus Torvalds
Browse files

[PATCH] sep initializing rework



Make SEP init per-cpu, so it is hotplug safe.

Signed-off-by: default avatarLi <Shaohua&lt;shaohua.li@intel.com>
Signed-off-by: default avatarAshok Raj <ashok.raj@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 67664c8f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -432,6 +432,9 @@ void __init identify_cpu(struct cpuinfo_x86 *c)
#ifdef CONFIG_X86_MCE
	mcheck_init(c);
#endif
	if (c == &boot_cpu_data)
		sysenter_setup();
	enable_sep_cpu();
}

#ifdef CONFIG_X86_HT
+10 −0
Original line number Diff line number Diff line
@@ -495,6 +495,16 @@ struct call_data_struct {
	int wait;
};

void lock_ipi_call_lock(void)
{
	spin_lock_irq(&call_lock);
}

void unlock_ipi_call_lock(void)
{
	spin_unlock_irq(&call_lock);
}

static struct call_data_struct * call_data;

/*
+11 −0
Original line number Diff line number Diff line
@@ -449,7 +449,18 @@ static void __init start_secondary(void *unused)
	 * the local TLBs too.
	 */
	local_flush_tlb();

	/*
	 * We need to hold call_lock, so there is no inconsistency
	 * between the time smp_call_function() determines number of
	 * IPI receipients, and the time when the determination is made
	 * for which cpus receive the IPI. Holding this
	 * lock helps us to not include this cpu in a currently in progress
	 * smp_call_function().
	 */
	lock_ipi_call_lock();
	cpu_set(smp_processor_id(), cpu_online_map);
	unlock_ipi_call_lock();

	/* We can take interrupts now: we're officially "up". */
	local_irq_enable();
+7 −5
Original line number Diff line number Diff line
@@ -21,11 +21,16 @@

extern asmlinkage void sysenter_entry(void);

void enable_sep_cpu(void *info)
void enable_sep_cpu(void)
{
	int cpu = get_cpu();
	struct tss_struct *tss = &per_cpu(init_tss, cpu);

	if (!boot_cpu_has(X86_FEATURE_SEP)) {
		put_cpu();
		return;
	}

	tss->ss1 = __KERNEL_CS;
	tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss;
	wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
@@ -41,7 +46,7 @@ void enable_sep_cpu(void *info)
extern const char vsyscall_int80_start, vsyscall_int80_end;
extern const char vsyscall_sysenter_start, vsyscall_sysenter_end;

static int __init sysenter_setup(void)
int __init sysenter_setup(void)
{
	void *page = (void *)get_zeroed_page(GFP_ATOMIC);

@@ -58,8 +63,5 @@ static int __init sysenter_setup(void)
	       &vsyscall_sysenter_start,
	       &vsyscall_sysenter_end - &vsyscall_sysenter_start);

	on_each_cpu(enable_sep_cpu, NULL, 1, 1);
	return 0;
}

__initcall(sysenter_setup);
+3 −3
Original line number Diff line number Diff line
@@ -22,9 +22,11 @@
#include <linux/device.h>
#include <linux/suspend.h>
#include <linux/acpi.h>

#include <asm/uaccess.h>
#include <asm/acpi.h>
#include <asm/tlbflush.h>
#include <asm/processor.h>

static struct saved_context saved_context;

@@ -33,8 +35,6 @@ unsigned long saved_context_esp, saved_context_ebp;
unsigned long saved_context_esi, saved_context_edi;
unsigned long saved_context_eflags;

extern void enable_sep_cpu(void *);

void __save_processor_state(struct saved_context *ctxt)
{
	kernel_fpu_begin();
@@ -136,7 +136,7 @@ void __restore_processor_state(struct saved_context *ctxt)
	 * sysenter MSRs
	 */
	if (boot_cpu_has(X86_FEATURE_SEP))
		enable_sep_cpu(NULL);
		enable_sep_cpu();

	fix_processor_context();
	do_fpu_end();
Loading