| From 9155bffc596569ff7aefc4b8fadaa3e8fdcb02bd Mon Sep 17 00:00:00 2001 |
| From: "Paul E. McKenney" <paulmck@linux.ibm.com> |
| Date: Thu, 21 Mar 2019 10:26:41 -0700 |
| Subject: rcuperf: Fix cleanup path for invalid perf_type strings |
| |
| [ Upstream commit ad092c027713a68a34168942a5ef422e42e039f4 ] |
| |
| If the specified rcuperf.perf_type is not in the rcu_perf_init() |
| function's perf_ops[] array, rcuperf prints some console messages and |
| then invokes rcu_perf_cleanup() to set state so that a future torture |
| test can run. However, rcu_perf_cleanup() also attempts to end the |
| test that didn't actually start, and in doing so relies on the value |
| of cur_ops, a value that is not particularly relevant in this case. |
| This can result in confusing output or even follow-on failures due to |
| attempts to use facilities that have not been properly initialized. |
| |
| This commit therefore sets the value of cur_ops to NULL in this case and |
| inserts a check near the beginning of rcu_perf_cleanup(), thus avoiding |
| relying on an irrelevant cur_ops value. |
| |
| Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/rcu/rcuperf.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/kernel/rcu/rcuperf.c b/kernel/rcu/rcuperf.c |
| index c297611528744..7a6890b23c5f5 100644 |
| --- a/kernel/rcu/rcuperf.c |
| +++ b/kernel/rcu/rcuperf.c |
| @@ -494,6 +494,10 @@ rcu_perf_cleanup(void) |
| |
| if (torture_cleanup_begin()) |
| return; |
| + if (!cur_ops) { |
| + torture_cleanup_end(); |
| + return; |
| + } |
| |
| if (reader_tasks) { |
| for (i = 0; i < nrealreaders; i++) |
| @@ -614,6 +618,7 @@ rcu_perf_init(void) |
| pr_cont("\n"); |
| WARN_ON(!IS_MODULE(CONFIG_RCU_PERF_TEST)); |
| firsterr = -EINVAL; |
| + cur_ops = NULL; |
| goto unwind; |
| } |
| if (cur_ops->init) |
| -- |
| 2.20.1 |
| |