linux rcu 用法,synchronize_rcu()函数详解

本文详细介绍了Linux内核中的`synchronize_rcu`函数,该函数用于确保在读取侧临界区执行完毕后,再进行后续操作。它通过初始化完成标志并调用`call_rcu`启动回放缓冲,然后等待完成标志被设置,从而实现等待一个完整的更新周期。`rcu_head`结构和`completion`结构在此过程中起到关键作用,分别用于回调和等待条件的处理。
摘要由CSDN通过智能技术生成

二.代码详解

定义在:linux/kernel/rcupdate.c

606/**

607 * synchronize_rcu - wait until a grace period has elapsed.

608 *

609 * Control will return to the caller some time after a full grace

610 * period has elapsed, in other words after all currently executing RCU

611 * read-side critical sections have completed.  RCU read-side critical

612 * sections are delimited by rcu_read_lock() and rcu_read_unlock(),

613 * and may be nested.

614 *

615 * If your read-side code is not protected by rcu_read_lock(), do -not-

616 * use synchronize_rcu().

617 */

618void synchronize_rcu(void)

619{

620        struct rcu_synchronize rcu;

621

622        init_completion(&rcu.completion);

623        /* Will wake me after RCU finished */

624        call_rcu(&rcu.head, wakeme_after_rcu);

625

626        /* Wait for it */

627        wait_for_completion(&rcu.completion);

628}

其中 struct rcu_synchronize为:

592struct rcu_synchronize {

593        struct rcu_head head;

594        struct completion completion;

595};

rcu_head结构定义了        struct rcu_head *next;      //指向rcu_head的指针

void (*func)(struct rcu_head *head);  //回调函数

回调函数完成写执行单元最后的数据释放或修改操作。

completion结构的定义:

13struct completion {

14        unsigned int done;

15        wait_queue_head_t wait;

16};unsigned int done;

指示等待的事件是否完成。初始化时为0。如果为0,则表示等待的事件未完成。大于0表示等待的事件已经完成。

wait_queue_head_t wait;

存放等待该事件完成的进程队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值