这段代码的反汇编如下所示
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相关推荐

  1. Linux Jump Label/static-key机制详解

    Linux Jump Label/static-key机制详解 RToax 2021年3 关于Linux Jump Label(x86)已经进行过概述,下面就static-key进行详述. 内核中有很 ...

  2. Linux Jump Label(x86)

    Jump Label RToax 2021年3月27日 1. Jump Label The kernel is filled with tests whose results almost never ...

  3. Linux内核jump label与static key的原理与示例

    jump label机制进入Linux内核已经很多很多年了,它的目的是 消除分支. 为了达到这个目的,jump label的手段是 修改分支处的代码. -把代码当做数据,代码和数据在冯诺伊曼计算机中得 ...

  4. Html5 Json应用

    本文主要说明Json的基本概念,和一个在Html中使用Json给元素赋值的小例子,属于基础性信息 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Obj ...

  5. 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 ...

  6. 【机器视觉】 case算子

    00. 目录 文章目录 00. 目录 01. 概述 02. 签名 03. 描述 04. 注意 05. 参数 06. 结果 07. 附录 01. 概述 case - 跳转标记,在switch段内开启一个 ...

  7. gcc -fPIC选项

    使用 -fPIC 选项,会生成 PIC 代码..so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接. non-PIC 与 PIC 代码的区别主要在于 access global dat ...

  8. Web前端笔记-element ui中table中某列添加a便签进行跳转

    效果是这样的: 这里的文章标题和查看都可以进行跳转. 其中对应的代码如下: <template style="height: 100%"><el-table:da ...

  9. Linux内核 eBPF基础:Tracepoint原理源码分析

    Linux内核 eBPF基础 Tracepoint原理源码分析 荣涛 2021年5月10日 1. 基本原理 需要注意的几点: 本文将从sched_switch相关的tracepoint展开: 关于st ...

最新文章

  1. Windows server 2012 搭建×××图文教程(一)安装×××相关服务
  2. 23种设计模式C++源码与UML实现--简单工厂模式
  3. java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方法
  4. Shell 示例:利用 $RANDOM 产生随机整数
  5. 信息学奥赛一本通(1030:计算球的体积)
  6. lz0-007 读书笔记11
  7. 射线计算机,面对射线-射频-计算机 我愿做“影像工匠师”
  8. android谷歌打印插件下载地址,ARC Welder(App Runtime for Chrome)插件下载 附下载地址
  9. Wonderware Intouch 2014R2 SP1授权教程
  10. 按头安利 好看又实用的窗户贴图素材看这里
  11. 数据中台漫谈 — 数据接入
  12. 5G聚合路由器有哪些优势?能应用在哪些场景?
  13. 外卖行业现状分析_简要分析外卖运营行业的发展现状
  14. Oracle创建directory
  15. ubuntu22 使用todesk被远程控制时显示黑屏或者白屏
  16. 树莓派各版本引脚及参数
  17. 用matlab生成同一元素的矩阵
  18. adbpg 使用 insert onconflict 覆盖写入数据
  19. ztree autoCheckTrigger=true时 子节点复选框选中 导致父节点onCheck触发多次问题处理
  20. 密码必须包含至少一个大写一个小写一个数字一个特殊字符的正则

热门文章

  1. 【微信小程序教程】点击按钮修改view标签背景颜色
  2. html商品分类列表页面,仿京东商城系列7------商品分类页面
  3. 什么是数据标准化?在Python中如何进行数据标准化?「必学」
  4. 最快速的TeamTalk 服务器部署方
  5. uni-app H5实现扫码登录功能
  6. Python爬虫实践:优志愿 院校列表
  7. 华为畅享20 pro 和华为畅享Z 的区别 哪个好
  8. aix服务器删除文件命令,AIX删除文件系统
  9. 【软件质量】问题与保证谈论
  10. android vrs技术,步步高 vivo V1/Y1 智能手机音质测评报告 VRS[vivo signal