IA64 Linux kernel 的 spin unlock 中为什么没有使用 st.rel 指

yswzing
yswzing 2015-07-23 字数 799

IA64 Linux kernel 的 spin unlock 函数代码如下 (arch/ia64/include/asm/spinlock.h):

[code]

static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)

{

unsigned short    *p = (unsigned short *)&lock->lock + 1, tmp;

asm volatile ("ld2.bias %0=[%1]" : "=r"(tmp) : "r"(p));

ACCESS_ONCE(*p) = (tmp + 2) & ~1;

}

[/code]

其中 ACCESS_ONCE 的定义为 (include/linux/compiler.h):

[code]

#define __ACCESS_ONCE(x) ({ \

__maybe_unused typeof(x) __var = (__force typeof(x)) 0; \

(volatile typeof(x) *)&(x); })

#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x))

[/code] (昨天贴成了WRITE_ONCE的定义,现在改过来了)

可以看出来,unlock 的时候没有使用 st.rel 指令。按照我的理解,IA64 实现的 release consistency model,应该在 unlock 的时候使用 release store。但是现在 linux kernel 却没有使用,哪位大侠能解释一下原因吗?

CSArch 计算机体系结构
9 个回复
yswzing
yswzing 2015-07-23

BTW, spin lock 的时候确实使用了 acquire load:

[code]

static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)

{

int    *p = (int *)&lock->lock, ticket, serve;

ticket = ia64_fetchadd(1, p, acq);

....

[/code]

tianbing1212
tianbing 2015-07-23

@#csarch

【 在 yswzing (yswzing) 的大作中提到: 】

: IA64 Linux kernel 的 spin unlock 函数代码如下 (arch/ia64/include/asm/spinlock.h):

: [code]

: static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)

: ...................

pxa255
intel pxa255 2015-07-24

volatile修饰的读写compiler会使用ld.acq/st.rel。

yswzing
yswzing 2015-07-24

这个有出处吗?

【 在 pxa255 的大作中提到: 】

: volatile修饰的读写compiler会使用ld.acq/st.rel。

yswzing
yswzing 2015-07-24

手头没有ia64的编译器,不过试了一下ARMv8(同样有acquire/release)的编译器,发现编译器不会把volatile的访存自动加上acquire/release语义。

哪位大侠有 IA64 编译器,帮忙试一下:

[code]

int test_volatile_rw(int * ptr, int val)

{

volatile int * nptr = ptr;

*nptr = val;

return *nptr;

}

[/code]

pxa255
intel pxa255 2015-07-24

有出处,不用试。http://h21007.www2.hp.com/portal/download/files/unprot/ddk/mem_ordering_pa_ia.pdf

【 在 yswzing 的大作中提到: 】

: 手头没有ia64的编译器,不过试了一下ARMv8(同样有acquire/release)的编译器,发现编译器不会把volatile的访存自动加上acquire/release语义。

: 哪位大侠有 IA64 编译器,帮忙试一下:

: [code]

: ...................

yswzing
yswzing 2015-07-24

[em68] 大牛!

顺便请教另外一个问题,你发的文档中 PART III 最后有这么一节:LOAD.acq Passing STORE.rel,我想问一下 load.acq pass st.rel 有什么潜在问题?是否需要在 st.rel 后面加上 fence?

【 在 pxa255 的大作中提到: 】

: 有出处,不用试。http://h21007.www2.hp.com/portal/download/files/unprot/ddk/mem_ordering_pa_ia.pdf

pxa255
intel pxa255 2015-07-24

这个不好讲,要看具体情况。不同地址单元的load/store才会发生这种情况。

【 在 yswzing 的大作中提到: 】

:  大牛!

: 顺便请教另外一个问题,你发的文档中 PART III 最后有这么一节:LOAD.acq Passing STORE.rel,我想问一下 load.acq pass st.rel 有什么潜在问题?是否需要在 st.rel 后面加上 fence?

yswzing
yswzing 2015-07-25

好的,谢谢,受教了!

【 在 pxa255 的大作中提到: 】

: 这个不好讲,要看具体情况。不同地址单元的load/store才会发生这种情况。

: :