Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
f43b6254
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
f43b6254
编写于
1月 07, 2016
作者:
P
Paul E. McKenney
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
documentation: Add synchronize_rcu_mult() to the requirements
Signed-off-by:
N
Paul E. McKenney
<
paulmck@linux.vnet.ibm.com
>
上级
41abcf32
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
174 addition
and
0 deletion
+174
-0
Documentation/RCU/Design/Requirements/Requirements.html
Documentation/RCU/Design/Requirements/Requirements.html
+92
-0
Documentation/RCU/Design/Requirements/Requirements.htmlx
Documentation/RCU/Design/Requirements/Requirements.htmlx
+82
-0
未找到文件。
Documentation/RCU/Design/Requirements/Requirements.html
浏览文件 @
f43b6254
...
...
@@ -2231,6 +2231,8 @@ described in a separate section.
<li>
<a
href=
"#Sched Flavor"
>
Sched Flavor
</a>
<li>
<a
href=
"#Sleepable RCU"
>
Sleepable RCU
</a>
<li>
<a
href=
"#Tasks RCU"
>
Tasks RCU
</a>
<li>
<a
href=
"#Waiting for Multiple Grace Periods"
>
Waiting for Multiple Grace Periods
</a>
</ol>
<h3><a
name=
"Bottom-Half Flavor"
>
Bottom-Half Flavor
</a></h3>
...
...
@@ -2480,6 +2482,81 @@ The tasks-RCU API is quite compact, consisting only of
<tt>
synchronize_rcu_tasks()
</tt>
, and
<tt>
rcu_barrier_tasks()
</tt>
.
<h3><a
name=
"Waiting for Multiple Grace Periods"
>
Waiting for Multiple Grace Periods
</a></h3>
<p>
Perhaps you have an RCU protected data structure that is accessed from
RCU read-side critical sections, from softirq handlers, and from
hardware interrupt handlers.
That is three flavors of RCU, the normal flavor, the bottom-half flavor,
and the sched flavor.
How to wait for a compound grace period?
<p>
The best approach is usually to
“
just say no!
”
and
insert
<tt>
rcu_read_lock()
</tt>
and
<tt>
rcu_read_unlock()
</tt>
around each RCU read-side critical section, regardless of what
environment it happens to be in.
But suppose that some of the RCU read-side critical sections are
on extremely hot code paths, and that use of
<tt>
CONFIG_PREEMPT=n
</tt>
is not a viable option, so that
<tt>
rcu_read_lock()
</tt>
and
<tt>
rcu_read_unlock()
</tt>
are not free.
What then?
<p>
You
<i>
could
</i>
wait on all three grace periods in succession, as follows:
<blockquote>
<pre>
1 synchronize_rcu();
2 synchronize_rcu_bh();
3 synchronize_sched();
</pre>
</blockquote>
<p>
This works, but triples the update-side latency penalty.
In cases where this is not acceptable,
<tt>
synchronize_rcu_mult()
</tt>
may be used to wait on all three flavors of grace period concurrently:
<blockquote>
<pre>
1 synchronize_rcu_mult(call_rcu, call_rcu_bh, call_rcu_sched);
</pre>
</blockquote>
<p>
But what if it is necessary to also wait on SRCU?
This can be done as follows:
<blockquote>
<pre>
1 static void call_my_srcu(struct rcu_head *head,
2 void (*func)(struct rcu_head *head))
3 {
4 call_srcu(
&
my_srcu, head, func);
5 }
6
7 synchronize_rcu_mult(call_rcu, call_rcu_bh, call_rcu_sched, call_my_srcu);
</pre>
</blockquote>
<p>
If you needed to wait on multiple different flavors of SRCU
(but why???), you would need to create a wrapper function resembling
<tt>
call_my_srcu()
</tt>
for each SRCU flavor.
<p><a
name=
"Quick Quiz 15"
><b>
Quick Quiz 15
</b>
:
</a>
But what if I need to wait for multiple RCU flavors, but I also need
the grace periods to be expedited?
<br><a
href=
"#qq15answer"
>
Answer
</a>
<p>
Again, it is usually better to adjust the RCU read-side critical sections
to use a single flavor of RCU, but when this is not feasible, you can use
<tt>
synchronize_rcu_mult()
</tt>
.
<h2><a
name=
"Possible Future Changes"
>
Possible Future Changes
</a></h2>
<p>
...
...
@@ -2901,5 +2978,20 @@ during scheduler initialization.
</p><p><a
href=
"#Quick%20Quiz%2014"
><b>
Back to Quick Quiz 14
</b>
.
</a>
<a
name=
"qq15answer"
></a>
<p><b>
Quick Quiz 15
</b>
:
But what if I need to wait for multiple RCU flavors, but I also need
the grace periods to be expedited?
</p><p><b>
Answer
</b>
:
If you are using expedited grace periods, there should be less penalty
for waiting on them in succession.
But if that is nevertheless a problem, you can use workqueues or multiple
kthreads to wait on the various expedited grace periods concurrently.
</p><p><a
href=
"#Quick%20Quiz%2015"
><b>
Back to Quick Quiz 15
</b>
.
</a>
</body></html>
Documentation/RCU/Design/Requirements/Requirements.htmlx
浏览文件 @
f43b6254
...
...
@@ -2398,6 +2398,8 @@ described in a separate section.
<li>
<a
href=
"#Sched Flavor"
>
Sched Flavor
</a>
<li>
<a
href=
"#Sleepable RCU"
>
Sleepable RCU
</a>
<li>
<a
href=
"#Tasks RCU"
>
Tasks RCU
</a>
<li>
<a
href=
"#Waiting for Multiple Grace Periods"
>
Waiting for Multiple Grace Periods
</a>
</ol>
<h3><a
name=
"Bottom-Half Flavor"
>
Bottom-Half Flavor
</a></h3>
...
...
@@ -2647,6 +2649,86 @@ The tasks-RCU API is quite compact, consisting only of
<tt>
synchronize_rcu_tasks()
</tt>
, and
<tt>
rcu_barrier_tasks()
</tt>
.
<h3><a
name=
"Waiting for Multiple Grace Periods"
>
Waiting for Multiple Grace Periods
</a></h3>
<p>
Perhaps you have an RCU protected data structure that is accessed from
RCU read-side critical sections, from softirq handlers, and from
hardware interrupt handlers.
That is three flavors of RCU, the normal flavor, the bottom-half flavor,
and the sched flavor.
How to wait for a compound grace period?
<p>
The best approach is usually to
“
just say no!
”
and
insert
<tt>
rcu_read_lock()
</tt>
and
<tt>
rcu_read_unlock()
</tt>
around each RCU read-side critical section, regardless of what
environment it happens to be in.
But suppose that some of the RCU read-side critical sections are
on extremely hot code paths, and that use of
<tt>
CONFIG_PREEMPT=n
</tt>
is not a viable option, so that
<tt>
rcu_read_lock()
</tt>
and
<tt>
rcu_read_unlock()
</tt>
are not free.
What then?
<p>
You
<i>
could
</i>
wait on all three grace periods in succession, as follows:
<blockquote>
<pre>
1 synchronize_rcu();
2 synchronize_rcu_bh();
3 synchronize_sched();
</pre>
</blockquote>
<p>
This works, but triples the update-side latency penalty.
In cases where this is not acceptable,
<tt>
synchronize_rcu_mult()
</tt>
may be used to wait on all three flavors of grace period concurrently:
<blockquote>
<pre>
1 synchronize_rcu_mult(call_rcu, call_rcu_bh, call_rcu_sched);
</pre>
</blockquote>
<p>
But what if it is necessary to also wait on SRCU?
This can be done as follows:
<blockquote>
<pre>
1 static void call_my_srcu(struct rcu_head *head,
2 void (*func)(struct rcu_head *head))
3 {
4 call_srcu(
&
my_srcu, head, func);
5 }
6
7 synchronize_rcu_mult(call_rcu, call_rcu_bh, call_rcu_sched, call_my_srcu);
</pre>
</blockquote>
<p>
If you needed to wait on multiple different flavors of SRCU
(but why???), you would need to create a wrapper function resembling
<tt>
call_my_srcu()
</tt>
for each SRCU flavor.
<p>
@@QQ@@
But what if I need to wait for multiple RCU flavors, but I also need
the grace periods to be expedited?
<p>
@@QQA@@
If you are using expedited grace periods, there should be less penalty
for waiting on them in succession.
But if that is nevertheless a problem, you can use workqueues or multiple
kthreads to wait on the various expedited grace periods concurrently.
<p>
@@QQE@@
<p>
Again, it is usually better to adjust the RCU read-side critical sections
to use a single flavor of RCU, but when this is not feasible, you can use
<tt>
synchronize_rcu_mult()
</tt>
.
<h2><a
name=
"Possible Future Changes"
>
Possible Future Changes
</a></h2>
<p>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录