免费注册 查看新帖 |

Chinaunix

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

[内核同步] ticket自旋锁中的__ticket_spin_trylock疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-14 18:55 |显示全部楼层 |倒序浏览
在TICKET自旋锁中,第086行的leal语句是作什么用的?对于该行不太清楚。整个代码的内容应大概流程应该当是:

1、tmp = lock->slock,判断Select == Owner,若不等给tmp = 0;若相同则执行第2步;
2、利用cmpxchgw比较原先slock的tmp 8~32位和当前slock的8~32位(即select)是否未发生变化。若相同则给slock->select++,tmp = 1,终止;已发生变化则tmp = 0,终止。



080 static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
081 {
082         int tmp, new;
083
084         asm volatile("movzwl %2, %0\n\t"
085                      "cmpb %h0,%b0\n\t"
086                      "leal 0x100(%" REG_PTR_MODE "0), %1\n\t"
087                      "jne 1f\n\t"
088                      LOCK_PREFIX "cmpxchgw %w1,%2\n\t"
089                      "1:"
090                      "sete %b1\n\t"
091                      "movzbl %b1,%0\n\t"
092                      : "=&a" (tmp), "=&q" (new), "+m" (lock->slock)
093                      :
094                      : "memory", "cc");
095
096         return tmp;
097 }

论坛徽章:
0
2 [报告]
发表于 2012-06-16 17:22 |显示全部楼层
回复 2# wenlujon


    嗯呐,~ 谢谢你了,讲的很清楚,尤其是写段汇编的建议,已经实践了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP