-
-
Save knknkn1162/3cca43b2c03728648ed84c0469c30397 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define BUILD_LOCK_OPS(op, locktype) \ | |
void __lockfunc _##op##_lock(locktype##_t *lock) \ | |
{ \ | |
preempt_disable(); \ | |
for (;;) { \ | |
if (likely(_raw_##op##_trylock(lock))) \ | |
break; \ | |
preempt_enable(); \ | |
if (!(lock)->break_lock) \ | |
(lock)->break_lock = 1; \ | |
while (!op##_can_lock(lock) && (lock)->break_lock) \ | |
cpu_relax(); \ | |
preempt_disable(); \ | |
} \ | |
} \ | |
\ | |
EXPORT_SYMBOL(_##op##_lock); \ | |
\ | |
unsigned long __lockfunc _##op##_lock_irqsave(locktype##_t *lock) \ | |
{ \ | |
unsigned long flags; \ | |
\ | |
preempt_disable(); \ | |
for (;;) { \ | |
local_irq_save(flags); \ | |
if (likely(_raw_##op##_trylock(lock))) \ | |
break; \ | |
local_irq_restore(flags); \ | |
\ | |
preempt_enable(); \ | |
if (!(lock)->break_lock) \ | |
(lock)->break_lock = 1; \ | |
while (!op##_can_lock(lock) && (lock)->break_lock) \ | |
cpu_relax(); \ | |
preempt_disable(); \ | |
} \ | |
return flags; \ | |
} \ | |
\ | |
EXPORT_SYMBOL(_##op##_lock_irqsave); \ | |
\ | |
void __lockfunc _##op##_lock_irq(locktype##_t *lock) \ | |
{ \ | |
_##op##_lock_irqsave(lock); \ | |
} \ | |
\ | |
EXPORT_SYMBOL(_##op##_lock_irq); \ | |
\ | |
void __lockfunc _##op##_lock_bh(locktype##_t *lock) \ | |
{ \ | |
unsigned long flags; \ | |
\ | |
/* */ \ | |
/* Careful: we must exclude softirqs too, hence the */ \ | |
/* irq-disabling. We use the generic preemption-aware */ \ | |
/* function: */ \ | |
/**/ \ | |
flags = _##op##_lock_irqsave(lock); \ | |
local_bh_disable(); \ | |
local_irq_restore(flags); \ | |
} \ | |
\ | |
EXPORT_SYMBOL(_##op##_lock_bh) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment