Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 3231
b: refs/heads/master
c: 6fe940d
h: refs/heads/master
i:
  3229: ec18be7
  3227: 864c80e
  3223: ba50b04
  3215: 53592b5
  3199: 243006f
v: v3
  • Loading branch information
Li Shaohua authored and Linus Torvalds committed Jun 25, 2005
1 parent 7cb0fa9 commit 3bddc4c
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 67664c8f7e74def5adf66298a1245d82af72db2c
refs/heads/master: 6fe940d6c300886de4ff1454d8ffd363172af433
3 changes: 3 additions & 0 deletions trunk/arch/i386/kernel/cpu/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions trunk/arch/i386/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*
Expand Down
11 changes: 11 additions & 0 deletions trunk/arch/i386/kernel/smpboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
12 changes: 7 additions & 5 deletions trunk/arch/i386/kernel/sysenter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand All @@ -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);
6 changes: 3 additions & 3 deletions trunk/arch/i386/power/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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();
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/asm-i386/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -691,5 +691,7 @@ extern void select_idle_routine(const struct cpuinfo_x86 *c);
#define cache_line_size() (boot_cpu_data.x86_cache_alignment)

extern unsigned long boot_option_idle_override;
extern void enable_sep_cpu(void);
extern int sysenter_setup(void);

#endif /* __ASM_I386_PROCESSOR_H */
2 changes: 2 additions & 0 deletions trunk/include/asm-i386/smp.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
extern void smp_invalidate_rcv(void); /* Process an NMI */
extern void (*mtrr_hook) (void);
extern void zap_low_mappings (void);
extern void lock_ipi_call_lock(void);
extern void unlock_ipi_call_lock(void);

#define MAX_APICID 256
extern u8 x86_cpu_to_apicid[];
Expand Down

0 comments on commit 3bddc4c

Please sign in to comment.