i386: add cpu_relax() to cmos_lock()
Add cpu_relax() to cmos_lock() inline function for faster operation on SMT CPUs and less power consumption on others in case of lock contention (which probably doesn't happen too often, so admittedly this patch is not too exciting). [akpm@linux-foundation.org: Include the header file for cpu_relax()] Signed-off-by: Andreas Mohr <andi@lisas.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8f03d6ce4e
commit
267eb01a62
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
#include <linux/mc146818rtc.h>
|
#include <linux/mc146818rtc.h>
|
||||||
|
|
||||||
#ifndef RTC_PORT
|
#ifndef RTC_PORT
|
||||||
|
@ -43,8 +44,10 @@ static inline void lock_cmos(unsigned char reg)
|
||||||
unsigned long new;
|
unsigned long new;
|
||||||
new = ((smp_processor_id()+1) << 8) | reg;
|
new = ((smp_processor_id()+1) << 8) | reg;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (cmos_lock)
|
if (cmos_lock) {
|
||||||
|
cpu_relax();
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
if (__cmpxchg(&cmos_lock, 0, new, sizeof(cmos_lock)) == 0)
|
if (__cmpxchg(&cmos_lock, 0, new, sizeof(cmos_lock)) == 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue