rcu
critical sesction 临界区
read-side 读端
write-side 写端
rcu_read_lock()
rcu_read_unlock()
RCU read-side critical sesctions are delimited by rcu_read_lock() and rcu_read_unlock() and may be nested.
rcu 读端临界区由rcu_read_lock() 和 rcu_read_unlock()决定,并且有可能是嵌套的。
synchronize_rcu()
该函数由RCU写端调用,它将阻塞写者,直到经过grace period后,即所有的读者已经完成读端临界区,写者才可以继续下一步操作。如果有多个RCU写端调用该函数,他们将在一个grace period之后全部被唤醒。多个写着之间需要加锁保护数据。
void fastcall call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
函数 call_rcu 也由 RCU 写端调用,它不会使写者阻塞,因而可以在中断上下文或 softirq 使用,而 synchronize_rcu、synchronize_kernel 和synchronize_shced 只能在进程上下文使用。该函数将把函数 func 挂接到 RCU回调函数链上,然后立即返回。一旦所有的 CPU 都已经完成端临界区操作,该函数将被调用来释放删除的将绝不在被应用的数据。参数 head 用于记录回调函数 func,一般该结构会作为被 RCU 保护的数据结构的一个字段,以便省去单独为该结构分配内存的操作。需要指出的是,函数 synchronize_rcu 的实现实际上使用函数call_rcu。
传统rcu锁
可抢占rcu锁
树形rcu锁
传统rcu锁,依赖进程切换,在临界区的时候组织进程抢占,推出临界区后只有当进程抢占才标记quiescent state,当所有cpu都就经过了一个quiescent state后,就可以调用回调函数进行处理了。
可抢占rcu锁,已经于进程切换无关了,在读端临界区内也可以发生抢占,rcu根据lock和unlock进行统计,当前阶段所有的cpu都解锁后,就可以调用回调函数了。
树形rcu锁,假设有很多cpu,把cpu分组2个一组,组内进行竞争,当组内所有cpu都完成竞争后,这时候在组与组竞争,完成最后的竞争后,就可以调用回调函数了。这个模式很像,两两分组pk,每一级都进行分组,直到最后冠军诞生。
critical sesction 临界区
read-side 读端
write-side 写端
rcu_read_lock()
rcu_read_unlock()
RCU read-side critical sesctions are delimited by rcu_read_lock() and rcu_read_unlock() and may be nested.
rcu 读端临界区由rcu_read_lock() 和 rcu_read_unlock()决定,并且有可能是嵌套的。
synchronize_rcu()
该函数由RCU写端调用,它将阻塞写者,直到经过grace period后,即所有的读者已经完成读端临界区,写者才可以继续下一步操作。如果有多个RCU写端调用该函数,他们将在一个grace period之后全部被唤醒。多个写着之间需要加锁保护数据。
void fastcall call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
函数 call_rcu 也由 RCU 写端调用,它不会使写者阻塞,因而可以在中断上下文或 softirq 使用,而 synchronize_rcu、synchronize_kernel 和synchronize_shced 只能在进程上下文使用。该函数将把函数 func 挂接到 RCU回调函数链上,然后立即返回。一旦所有的 CPU 都已经完成端临界区操作,该函数将被调用来释放删除的将绝不在被应用的数据。参数 head 用于记录回调函数 func,一般该结构会作为被 RCU 保护的数据结构的一个字段,以便省去单独为该结构分配内存的操作。需要指出的是,函数 synchronize_rcu 的实现实际上使用函数call_rcu。
传统rcu锁
可抢占rcu锁
树形rcu锁
传统rcu锁,依赖进程切换,在临界区的时候组织进程抢占,推出临界区后只有当进程抢占才标记quiescent state,当所有cpu都就经过了一个quiescent state后,就可以调用回调函数进行处理了。
可抢占rcu锁,已经于进程切换无关了,在读端临界区内也可以发生抢占,rcu根据lock和unlock进行统计,当前阶段所有的cpu都解锁后,就可以调用回调函数了。
树形rcu锁,假设有很多cpu,把cpu分组2个一组,组内进行竞争,当组内所有cpu都完成竞争后,这时候在组与组竞争,完成最后的竞争后,就可以调用回调函数了。这个模式很像,两两分组pk,每一级都进行分组,直到最后冠军诞生。