免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2545 | 回复: 3
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2016-02-29 15:49 |只看该作者
手动顶下~~~~~~~~~~

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 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
4 [报告]
发表于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP