前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )

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

作者头像
韩曙亮
发布2023-03-30 14:11:33
7570
发布2023-03-30 14:11:33
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

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


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

其中定义的

代码语言:javascript
复制
static inline void list_replace_rcu(struct list_head *old,
				struct list_head *new)

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

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

代码语言:javascript
复制
	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 函数原型 :

代码语言:javascript
复制
/**
 * 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() 函数 , 可以保证该函数 前两行 的代码 执行完毕后 , 再执行后两行的代码 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、RCU 模式下更新链表项 list_replace_rcu 函数
  • 二、链表操作时使用 smp_wmb() 函数保证代码执行顺序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档