Commit b3a9ee9e authored by Zwane Mwaikambo's avatar Zwane Mwaikambo Committed by Linus Torvalds

[PATCH] out-of-line locks / i386

Signed-off-by: default avatarZwane Mwaikambo <zwane@fsmlabs.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4eca1f90
...@@ -200,6 +200,19 @@ unsigned long long monotonic_clock(void) ...@@ -200,6 +200,19 @@ unsigned long long monotonic_clock(void)
} }
EXPORT_SYMBOL(monotonic_clock); EXPORT_SYMBOL(monotonic_clock);
#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
unsigned long profile_pc(struct pt_regs *regs)
{
unsigned long pc = instruction_pointer(regs);
if (pc >= (unsigned long)&__lock_text_start &&
pc <= (unsigned long)&__lock_text_end)
return *(unsigned long *)(regs->ebp + 4);
return pc;
}
EXPORT_SYMBOL(profile_pc);
#endif
/* /*
* timer_interrupt() needs to keep up the real-time clock, * timer_interrupt() needs to keep up the real-time clock,
......
...@@ -18,6 +18,7 @@ SECTIONS ...@@ -18,6 +18,7 @@ SECTIONS
.text : { .text : {
*(.text) *(.text)
SCHED_TEXT SCHED_TEXT
LOCK_TEXT
*(.fixup) *(.fixup)
*(.gnu.warning) *(.gnu.warning)
} = 0x9090 } = 0x9090
......
...@@ -96,7 +96,7 @@ static int athlon_check_ctrs(unsigned int const cpu, ...@@ -96,7 +96,7 @@ static int athlon_check_ctrs(unsigned int const cpu,
{ {
unsigned int low, high; unsigned int low, high;
int i; int i;
unsigned long eip = instruction_pointer(regs); unsigned long eip = profile_pc(regs);
int is_kernel = !user_mode(regs); int is_kernel = !user_mode(regs);
for (i = 0 ; i < NUM_COUNTERS; ++i) { for (i = 0 ; i < NUM_COUNTERS; ++i) {
......
...@@ -625,7 +625,7 @@ static int p4_check_ctrs(unsigned int const cpu, ...@@ -625,7 +625,7 @@ static int p4_check_ctrs(unsigned int const cpu,
{ {
unsigned long ctr, low, high, stag, real; unsigned long ctr, low, high, stag, real;
int i; int i;
unsigned long eip = instruction_pointer(regs); unsigned long eip = profile_pc(regs);
int is_kernel = !user_mode(regs); int is_kernel = !user_mode(regs);
stag = get_stagger(); stag = get_stagger();
......
...@@ -91,7 +91,7 @@ static int ppro_check_ctrs(unsigned int const cpu, ...@@ -91,7 +91,7 @@ static int ppro_check_ctrs(unsigned int const cpu,
{ {
unsigned int low, high; unsigned int low, high;
int i; int i;
unsigned long eip = instruction_pointer(regs); unsigned long eip = profile_pc(regs);
int is_kernel = !user_mode(regs); int is_kernel = !user_mode(regs);
for (i = 0 ; i < NUM_COUNTERS; ++i) { for (i = 0 ; i < NUM_COUNTERS; ++i) {
......
...@@ -57,7 +57,11 @@ struct pt_regs { ...@@ -57,7 +57,11 @@ struct pt_regs {
#ifdef __KERNEL__ #ifdef __KERNEL__
#define user_mode(regs) ((VM_MASK & (regs)->eflags) || (3 & (regs)->xcs)) #define user_mode(regs) ((VM_MASK & (regs)->eflags) || (3 & (regs)->xcs))
#define instruction_pointer(regs) ((regs)->eip) #define instruction_pointer(regs) ((regs)->eip)
#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
extern unsigned long profile_pc(struct pt_regs *regs);
#else
#define profile_pc(regs) instruction_pointer(regs) #define profile_pc(regs) instruction_pointer(regs)
#endif #endif
#endif
#endif #endif
...@@ -22,25 +22,19 @@ ...@@ -22,25 +22,19 @@
#define __build_read_lock_ptr(rw, helper) \ #define __build_read_lock_ptr(rw, helper) \
asm volatile(LOCK "subl $1,(%0)\n\t" \ asm volatile(LOCK "subl $1,(%0)\n\t" \
"js 2f\n" \ "jns 1f\n" \
"call " helper "\n\t" \
"1:\n" \ "1:\n" \
LOCK_SECTION_START("") \
"2:\tcall " helper "\n\t" \
"jmp 1b\n" \
LOCK_SECTION_END \
::"a" (rw) : "memory") ::"a" (rw) : "memory")
#define __build_read_lock_const(rw, helper) \ #define __build_read_lock_const(rw, helper) \
asm volatile(LOCK "subl $1,%0\n\t" \ asm volatile(LOCK "subl $1,%0\n\t" \
"js 2f\n" \ "jns 1f\n" \
"1:\n" \ "pushl %%eax\n\t" \
LOCK_SECTION_START("") \
"2:\tpushl %%eax\n\t" \
"leal %0,%%eax\n\t" \ "leal %0,%%eax\n\t" \
"call " helper "\n\t" \ "call " helper "\n\t" \
"popl %%eax\n\t" \ "popl %%eax\n\t" \
"jmp 1b\n" \ "1:\n" \
LOCK_SECTION_END \
:"=m" (*(volatile int *)rw) : : "memory") :"=m" (*(volatile int *)rw) : : "memory")
#define __build_read_lock(rw, helper) do { \ #define __build_read_lock(rw, helper) do { \
...@@ -52,25 +46,19 @@ ...@@ -52,25 +46,19 @@
#define __build_write_lock_ptr(rw, helper) \ #define __build_write_lock_ptr(rw, helper) \
asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
"jnz 2f\n" \ "jz 1f\n" \
"call " helper "\n\t" \
"1:\n" \ "1:\n" \
LOCK_SECTION_START("") \
"2:\tcall " helper "\n\t" \
"jmp 1b\n" \
LOCK_SECTION_END \
::"a" (rw) : "memory") ::"a" (rw) : "memory")
#define __build_write_lock_const(rw, helper) \ #define __build_write_lock_const(rw, helper) \
asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
"jnz 2f\n" \ "jz 1f\n" \
"1:\n" \ "pushl %%eax\n\t" \
LOCK_SECTION_START("") \
"2:\tpushl %%eax\n\t" \
"leal %0,%%eax\n\t" \ "leal %0,%%eax\n\t" \
"call " helper "\n\t" \ "call " helper "\n\t" \
"popl %%eax\n\t" \ "popl %%eax\n\t" \
"jmp 1b\n" \ "1:\n" \
LOCK_SECTION_END \
:"=m" (*(volatile int *)rw) : : "memory") :"=m" (*(volatile int *)rw) : : "memory")
#define __build_write_lock(rw, helper) do { \ #define __build_write_lock(rw, helper) do { \
......
...@@ -46,20 +46,18 @@ typedef struct { ...@@ -46,20 +46,18 @@ typedef struct {
#define spin_lock_string \ #define spin_lock_string \
"\n1:\t" \ "\n1:\t" \
"lock ; decb %0\n\t" \ "lock ; decb %0\n\t" \
"js 2f\n" \ "jns 3f\n" \
LOCK_SECTION_START("") \
"2:\t" \ "2:\t" \
"rep;nop\n\t" \ "rep;nop\n\t" \
"cmpb $0,%0\n\t" \ "cmpb $0,%0\n\t" \
"jle 2b\n\t" \ "jle 2b\n\t" \
"jmp 1b\n" \ "jmp 1b\n" \
LOCK_SECTION_END "3:\n\t"
#define spin_lock_string_flags \ #define spin_lock_string_flags \
"\n1:\t" \ "\n1:\t" \
"lock ; decb %0\n\t" \ "lock ; decb %0\n\t" \
"js 2f\n\t" \ "jns 4f\n\t" \
LOCK_SECTION_START("") \
"2:\t" \ "2:\t" \
"testl $0x200, %1\n\t" \ "testl $0x200, %1\n\t" \
"jz 3f\n\t" \ "jz 3f\n\t" \
...@@ -70,7 +68,7 @@ typedef struct { ...@@ -70,7 +68,7 @@ typedef struct {
"jle 3b\n\t" \ "jle 3b\n\t" \
"cli\n\t" \ "cli\n\t" \
"jmp 1b\n" \ "jmp 1b\n" \
LOCK_SECTION_END "4:\n\t"
/* /*
* This works. Despite all the confusion. * This works. Despite all the confusion.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment