文章目录

  • 一、RCU 模式下更新链表项 list_replace_rcu 函数
  • 二、链表操作时使用 smp_wmb() 函数保证代码执行顺序

一、RCU 模式下更新链表项 list_replace_rcu 函数


在 Linux 源码 linux-5.6.18\include\linux\rculist.h 头文件中定义的就是 RCU 链表的操作 ,

其中定义的

static inline void list_replace_rcu(struct list_head *old,struct list_head *new)

函数 , 就是 更新 链表元素 的 函数 ;

list_replace_rcu 函数中 , 更新链表元素的核心操作就是将 被更新的 链表元素 , 前后指针指向新的元素即可 ;

 new->next = old->next;new->prev = old->prev;rcu_assign_pointer(list_next_rcu(new->prev), new);new->next->prev = new;old->prev = LIST_POISON2;

list_replace_rcu 函数原型 :

/*** list_replace_rcu - replace old entry by new one* @old : the element to be replaced* @new : the new element to insert** The @old entry will be replaced with the @new entry atomically.* Note: @old should not be empty.*/
static inline void list_replace_rcu(struct list_head *old,struct list_head *new)
{new->next = old->next;new->prev = old->prev;rcu_assign_pointer(list_next_rcu(new->prev), new);new->next->prev = new;old->prev = LIST_POISON2;
}

源码路径 : linux-5.6.18\include\linux\rculist.h#198

二、链表操作时使用 smp_wmb() 函数保证代码执行顺序


编译器 和 CPU 优化 代码时 , 有时会将 代码执行顺序改变 ,

在链表操作时 , 代码的执行顺序必须得到保证 , 否则会得到不可预知的结果 ;

使用 smp_wmb() 函数 , 可以保证该函数 前两行 的代码 执行完毕后 , 再执行后两行的代码 ;

【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )相关推荐

  1. 【Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )

    文章目录 一.RCU 机制适用场景 二.RCU 机制特点 三.使用 RCU 机制保护链表 一.RCU 机制适用场景 在上一篇博客 [Linux 内核 内存管理]RCU 机制 ① ( RCU 机制简介 ...

  2. 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )

    文章目录 一.RCU 机制 二.RCU 机制的优势与弊端 三.RCU 机制的链表应用场景 一.RCU 机制 RCU , 英文全称是 " Read-Copy-Update " , 对 ...

  3. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

  4. Linux内核内存管理(3):kmemcheck介绍

    Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...

  5. pae扩展内存 linux,浅析linux内核内存管理之PAE

    浅析linux内核内存管理之PAE 早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM.然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进 ...

  6. Linux内核内存管理(1):内存块 - memblock

    Linux内核内存管理 内存块 - memblock rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. 简介 内存管理是操作系统内核中最复杂的部分之 ...

  7. Linux内核内存管理(2):固定映射地址(fixmap)和输入输出重映射(ioremap)

    Linux内核内存管理 固定映射地址(fixmap)和输入输出重映射(ioremap) rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. Print ke ...

  8. 【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )

    文章目录 一.retry 标号代码分析 二.retry 标号完整代码 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __allo ...

  9. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

最新文章

  1. CSS属性中Display与Visibility
  2. linux下用户的添加
  3. 看完这篇学会Ansible
  4. Go中的函数也是一种数据类型,可以赋值给一个变量
  5. java怎么导入项目?java已有项目如何导入eclipse?
  6. OpenCV4Android JavaCameraView实现
  7. 使用report COM_PRODUCT_DELETE_SINGLE删除product
  8. laravel构造器的CURD
  9. Intent, Bundle, ListView的简单使用
  10. Mr.J--C语言编译错误C3861
  11. SpringMVC+Json构建基于Restful风格的应用
  12. ac ap原理、_AP面板是什么?家庭AC+AP的组网方式,真的适合所有人吗?
  13. 使用proxy转发post请求_3分钟短文 | Linux 使用curl发起post请求的4个常用方式
  14. python 字符串不相等_python实现找出来一个字符串中最长不重复子串
  15. bing翻译API调用(java版本)
  16. 将读书笔记自动生成思维导图(Markdown)
  17. E11000 duplicate key error collection
  18. linux命令中ps -ef是什么意思
  19. 中文字符 简体繁体相互转换
  20. 阅读开源Python脚本学习笔记1,之python异常

热门文章

  1. 探究chrome下的开发工具的各功能
  2. Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
  3. legend3---lavarel多对多模型操作实例
  4. 常用的Linux命令,日常收集记录
  5. Mint UI 使用指南
  6. noip2016 小结(ac两题+学习总结)
  7. accept系统调用内核实现
  8. BMP图片的解析,关于压缩方式
  9. C# 给枚举类型增加一个备注特性
  10. [转载]读史记札记23:并不是每次跌倒都能够重新站起来