免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1510 | 回复: 3

[操作系统] arm 下 arch_spin_trylock 低概率返回0 [复制链接]

论坛徽章:
0
发表于 2016-02-25 14:32 |显示全部楼层
一个自旋锁问题。
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;
        }
}

论坛徽章:
0
发表于 2016-02-29 15:49 |显示全部楼层
手动顶下~~~~~~~~~~

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 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

论坛徽章:
0
发表于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP