Linux 内核 内存管理RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核 内存管理RCU 机制 ④ ( 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() 函数保证代码执行顺序 )的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )
Linux 内核 内存管理RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )
Linux 内核 内存管理RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )
Linux 内核 内存管理RCU 机制 ⑤ ( RCU 层次架构概念 | RCU 层次架构源码解析 | RCU 层次架构每层最多叶子数 | RCU 层次架构每个叶子 CPU 数量 )
Linux 内核 内存管理RCU 机制 ③ ( RCU 模式下添加链表项 list_add_rcu 函数 | RCU 模式下删除链表项 list_del_rcu 函数 )