arm 下 arch_spin_trylock 低概率返回0
一个自旋锁问题。lock->lock == 1的时候,也就是自旋锁在上锁的状态,arch_spin_trylock会返回0。这个我是理解,我觉得也是正常。
但是现在出现一个异常状态,lock->lock进arch_spin_trylock函数之前是0,arch_spin_trylock返回以后lock->lock也是0。同时arch_spin_trylock返回也是0.
仿佛strexeq执行失败了。求大神们支援。有什么原因会这样?
static inline int arch_spin_trylock(arch_spinlock_t *lock)
{
unsigned long tmp;
__asm__ __volatile__(
" ldrex %0, [%1]\n"
" teq %0, #0\n"
" strexeq %0, %2, [%1]"
: "=&r" (tmp)
: "r" (&lock->lock), "r" (1)
: "cc");
if (tmp == 0) {
smp_mb();
return 1;
} else {
return 0;
}
} :'(手动顶下~~~~~~~~~~ 你得熟悉arm指令才能够理解ldrex和strex
例如core 0在执行到ldrex和strex之间时,core 1对同一个物理地址做了ldrex,那么core 0的strex会失败,而core 1的strex会成功
core 0 core 1
ldrex ......
... ldrex
strex .....
strex 后来查看linux代码记录,解决了我的问题
如下修改
git点kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/include/asm/spinlock.h?id=15e7e5c1ebf556cd620c9b091e121091ac760f6d
页:
[1]