首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux ARM spinlock中是否存在竞赛条件?

linux ARM spinlock中是否存在竞赛条件?
EN

Stack Overflow用户
提问于 2019-07-22 09:17:21
回答 1查看 312关注 0票数 2

下面是来自arch/arm/include/asm/spinlock.h的自旋锁的Linux实现

代码语言:javascript
复制
static inline void arch_spin_lock(arch_spinlock_t *lock)
{
    unsigned long tmp;
    u32 newval;
    arch_spinlock_t lockval;

    prefetchw(&lock->slock);
    __asm__ __volatile__(
"1: ldrex   %0, [%3]\n"
"   add %1, %0, %4\n"
"   strex   %2, %1, [%3]\n"
"   teq %2, #0\n"
"   bne 1b"
    : "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
    : "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
    : "cc");

    while (lockval.tickets.next != lockval.tickets.owner) {
        wfe();
        lockval.tickets.owner = READ_ONCE(lock->tickets.owner);
    }

    smp_mb();
}

...

static inline void arch_spin_unlock(arch_spinlock_t *lock)
{
    smp_mb();
    lock->tickets.owner++;
    dsb_sev();
}

我担心的是arch_spin_lock中的以下两行

代码语言:javascript
复制
    while (lockval.tickets.next != lockval.tickets.owner) {
        wfe();

不是原子的。那么,如果在这两行之间调用arch_spin_unlock呢?这意味着在函数arch_spin_lock中,将运行WFE指令,但SEV已经运行,不会再次运行。因此,在最糟糕的情况下,arch_spin_lock将永远等待,或者直到某个无关的事件发生。

这是对的,还是我误解了什么?如果这只是一个理论上的问题,是否有办法避免这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-23 08:27:43

我想您错过了这段WFE文档:

如果设置了事件寄存器,WFE将清除它并立即返回。

在您描述的“竞赛”中,WFE将被执行,但将立即返回,然后while循环将退出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57142784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档