免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1759 | 回复: 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP