youxitalent 发表于 2016-02-25 14:32

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;
        }
}

youxitalent 发表于 2016-02-29 15:49

:'(手动顶下~~~~~~~~~~

arm-linux-gcc 发表于 2016-03-02 15:21

你得熟悉arm指令才能够理解ldrex和strex
例如core 0在执行到ldrex和strex之间时,core 1对同一个物理地址做了ldrex,那么core 0的strex会失败,而core 1的strex会成功


core 0         core 1
ldrex             ......
...               ldrex
strex            .....
                  strex

youxitalent 发表于 2016-03-18 13:17

后来查看linux代码记录,解决了我的问题
如下修改
git点kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/include/asm/spinlock.h?id=15e7e5c1ebf556cd620c9b091e121091ac760f6d
页: [1]
查看完整版本: arm 下 arch_spin_trylock 低概率返回0