登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SmallOfficeHomeOffic

Operating System and Architecture

 
 
 

日志

 
 

@yuanbor:Linux-2.6.25内核spin lock机制  

2010-05-19 18:30:53|  分类: Linux内核精华 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Linux-2.6.25采用Ticket Spinlock,锁本身是一个32位的int型变量,初始化为0
8bits 
3
 8bits
2
 8bits
1
 8bits
0
在NR_CPUS < 256的情况下,高16位不用;低16位的上下8位分别用来记录next和owner:

static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
short inc = 0x0100;

__asm__ __volatile__ (
LOCK_PREFIX "xaddw %w0, %1\n"  // 交换inc和lock->slock的值,并将其和存入lock->slock
"1:\t"
"cmpb %h0, %b0\n\t" // 比较inc的上下8位 (此时inc等于原来的lock->slock)
"je 2f\n\t"  //相等则跳到2:
"rep ; nop\n\t" //为了降低功耗,暂停此CPU
"movb %1, %b0\n\t" // 将lock->slock的第0个8bits赋值给inc的第0个8bits
/* don't need lfence here, because loads are in-order */
"jmp 1b\n"
"2:"
:"+Q" (inc), "+m" (lock->slock)
:
:"memory", "cc");
}

static inline void __raw_spin_unlock(raw_spinlock_t *lock)
{
__asm__ __volatile__(
UNLOCK_LOCK_PREFIX "incb %0"
:"+m" (lock->slock)
:
:"memory", "cc");
}

对于NR_CPUS >= 256的情况,高低16位分别用来记录next和owner:
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
int inc = 0x00010000;
int tmp;

__asm__ __volatile__ (
"lock ; 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:"
:"+Q" (inc), "+m" (lock->slock), "=r" (tmp)
:
:"memory", "cc");
}
  评论这张
 
阅读(1087)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018