jump label
这段代码的反汇编如下所示
static inline bool test_idle_cores(int cpu, bool def)
{struct sched_domain_shared *sds;if (static_branch_unlikely(&sched_smt_present)) {sds = rcu_dereference(per_cpu(sd_llc_shared, cpu));if (sds)return READ_ONCE(sds->has_idle_cores);}return def;
}0000000000000884 <test_idle_cores>:
{884: 12001c21 and w1, w1, #0xff
#define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZEstatic __always_inline bool arch_static_branch(struct static_key *key,bool branch)
{asm_volatile_goto(888: d503201f nop
}88c: 2a0103e0 mov w0, w1890: d65f03c0 retsds = rcu_dereference(per_cpu(sd_llc_shared, cpu));894: 90000003 adrp x3, 0 <__per_cpu_offset>898: 91000063 add x3, x3, #0x089c: 90000002 adrp x2, 0 <sd_llc_shared>8a0: 91000042 add x2, x2, #0x08a4: f860d860 ldr x0, [x3, w0, sxtw #3]8a8: f8606840 ldr x0, [x2, x0]if (sds)8ac: b4ffff00 cbz x0, 88c <test_idle_cores+0x8>return READ_ONCE(sds->has_idle_cores);8b0: b9400800 ldr w0, [x0, #8]8b4: 7100001f cmp w0, #0x08b8: 1a9f07e1 cset w1, ne // ne = any8bc: 17fffff4 b 88c <test_idle_cores+0x8>为什么会是这样呢,我们看看static_branch_likely的实现
如果使能jump_label的话是先如下,如果没有的话就等同普通的unlikely
#define static_branch_unlikely(x) \
({ \bool branch; \if (__builtin_types_compatible_p(typeof(*x), struct static_key_true)) \branch = arch_static_branch_jump(&(x)->key, false); \else if (__builtin_types_compatible_p(typeof(*x), struct static_key_false)) \branch = arch_static_branch(&(x)->key, false); \else \branch = ____wrong_branch_error(); \unlikely_notrace(branch); \
})由于本例中的sched_smt_present 默认为false,所以我们看看 arch_static_branch的实现static __always_inline bool arch_static_branch(struct static_key *key,bool branch)
{asm_volatile_goto("1: nop \n\t"" .pushsection __jump_table, \"aw\" \n\t"" .align 3 \n\t"" .long 1b - ., %l[l_yes] - . \n\t"" .quad %c0 - . \n\t"" .popsection \n\t": : "i"(&((char *)key)[branch]) : : l_yes);return false;
l_yes:return true;
}可以和上面的汇编对比下。这里也可以看出static_branch_unlikely 是一个宏,会被展开,最后就是一行unlikely_notrace
可见static_branch_unlikely 是包含unlikely_notrace.
简单理解就是
仔细看代码就会发现 static_branch_likely 不等于 !static_branch_unlikely 同样!static_branch_likely 也不等于static_branch_unlikely.
可以通过反汇编查询上面两种情况的区别. 性能上也是有差异的,取决于key的初始值是true还是false.
那什么时候用!static_branch_unlikely这个组合呢?
那就是当key是false时,static_branch_unlikely 对应的就是nop,但是代码中又不需要这个条件成立时,可以自己体会下.
jump label相关推荐
- Linux Jump Label/static-key机制详解
Linux Jump Label/static-key机制详解 RToax 2021年3 关于Linux Jump Label(x86)已经进行过概述,下面就static-key进行详述. 内核中有很 ...
- Linux Jump Label(x86)
Jump Label RToax 2021年3月27日 1. Jump Label The kernel is filled with tests whose results almost never ...
- Linux内核jump label与static key的原理与示例
jump label机制进入Linux内核已经很多很多年了,它的目的是 消除分支. 为了达到这个目的,jump label的手段是 修改分支处的代码. -把代码当做数据,代码和数据在冯诺伊曼计算机中得 ...
- Html5 Json应用
本文主要说明Json的基本概念,和一个在Html中使用Json给元素赋值的小例子,属于基础性信息 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Obj ...
- linux c gcc编译报错 can not be used when making a shared object; recompile with -fPIC
目录 错误现象 错误原因 解决方法 PIC 简介 错误现象 使用 google protobuf 时,出现错误 /usr/bin/ld: /usr/local/lib/libprotobuf.a(me ...
- 【机器视觉】 case算子
00. 目录 文章目录 00. 目录 01. 概述 02. 签名 03. 描述 04. 注意 05. 参数 06. 结果 07. 附录 01. 概述 case - 跳转标记,在switch段内开启一个 ...
- gcc -fPIC选项
使用 -fPIC 选项,会生成 PIC 代码..so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接. non-PIC 与 PIC 代码的区别主要在于 access global dat ...
- Web前端笔记-element ui中table中某列添加a便签进行跳转
效果是这样的: 这里的文章标题和查看都可以进行跳转. 其中对应的代码如下: <template style="height: 100%"><el-table:da ...
- Linux内核 eBPF基础:Tracepoint原理源码分析
Linux内核 eBPF基础 Tracepoint原理源码分析 荣涛 2021年5月10日 1. 基本原理 需要注意的几点: 本文将从sched_switch相关的tracepoint展开: 关于st ...
最新文章
- Windows server 2012 搭建×××图文教程(一)安装×××相关服务
- 23种设计模式C++源码与UML实现--简单工厂模式
- java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方法
- Shell 示例:利用 $RANDOM 产生随机整数
- 信息学奥赛一本通(1030:计算球的体积)
- lz0-007 读书笔记11
- 射线计算机,面对射线-射频-计算机 我愿做“影像工匠师”
- android谷歌打印插件下载地址,ARC Welder(App Runtime for Chrome)插件下载 附下载地址
- Wonderware Intouch 2014R2 SP1授权教程
- 按头安利 好看又实用的窗户贴图素材看这里
- 数据中台漫谈 — 数据接入
- 5G聚合路由器有哪些优势?能应用在哪些场景?
- 外卖行业现状分析_简要分析外卖运营行业的发展现状
- Oracle创建directory
- ubuntu22 使用todesk被远程控制时显示黑屏或者白屏
- 树莓派各版本引脚及参数
- 用matlab生成同一元素的矩阵
- adbpg 使用 insert onconflict 覆盖写入数据
- ztree autoCheckTrigger=true时 子节点复选框选中 导致父节点onCheck触发多次问题处理
- 密码必须包含至少一个大写一个小写一个数字一个特殊字符的正则