【发布时间】:2013-07-01 08:34:12
【问题描述】:
我阅读了linux内核中的spinlock函数代码。有两个与自旋锁相关的函数。请看下面的代码:
static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock)
{
short inc = 0x0100;
asm volatile (
LOCK_PREFIX "xaddw %w0, %1\n"
"1:\t"
"cmpb %h0, %b0\n\t"
"je 2f\n\t"
"rep ; nop\n\t"
"movb %1, %b0\n\t"
/* don't need lfence here, because loads are in-order */
"jmp 1b\n"
"2:"
: "+Q" (inc), "+m" (lock->slock)
:
: "memory", "cc");
}
static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock)
{
int inc = 0x00010000;
int tmp;
asm volatile(LOCK_PREFIX "xaddl %0, %1\n"
"movzwl %w0, %2\n\t"
"shrl $16, %0\n\t"
"1:\t"
"cmpl %0, %2\n\t"
"je 2f\n\t"
"rep ; nop\n\t"
"movzwl %1, %2\n\t"
/* don't need lfence here, because loads are in-order */
"jmp 1b\n"
"2:"
: "+r" (inc), "+m" (lock->slock), "=&r" (tmp)
:
: "memory", "cc");
}
我有两个问题:
1.上面两个函数有什么区别?
2.如何监控自旋锁的等待时间(第一次尝试锁,最后获得锁的时间)?变量inc是指自旋锁的等待时间吗?
【问题讨论】:
-
1) 不多。看起来他们只是使用不同的值来指示“锁定”状态。 2)您可以在代码中添加一个计数器。就目前而言,没有任何东西可以计算重复次数。但是,您也可以用
rdtsc循环计数围绕您的锁定代码进行粗略测量。 -
@KerrekSB 谢谢。 “rep ; nop\n\t”这行是否意味着旋转忙等待?
-
不 - 这只是一个“产量”。现代处理器有一个专用的
pause指令。旋转是jmp 1。 (也许看看this article。) -
@KerrekSB,你能帮我在 asm 代码中添加一个无符号长计数器(监控旋转时间)吗,我不熟悉 asm 代码。非常感谢。
标签: c linux assembly linux-kernel spinlock