diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-02-04 14:47:08 -0500 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-02-23 12:04:25 -0500 |
| commit | 9c029b86098decd4660eec511b8d2d42da3e7dd9 (patch) | |
| tree | a108dd697afee54ef25db8303aaa71c7b28e37aa /kernel | |
| parent | 47cf29b9e721967aac95ebda9e50408219755852 (diff) | |
rcutorture: Abstract torture_stop_kthread()
Stopping of kthreads is not RCU-specific, so this commit abstracts
out torture_stop_kthread(), saving a few lines of code in the process.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/rcu/rcutorture.c | 72 | ||||
| -rw-r--r-- | kernel/torture.c | 13 |
2 files changed, 27 insertions, 58 deletions
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c index a6f6c8418d87..37bd4beea198 100644 --- a/kernel/rcu/rcutorture.c +++ b/kernel/rcu/rcutorture.c | |||
| @@ -1033,14 +1033,12 @@ static void rcutorture_booster_cleanup(int cpu) | |||
| 1033 | if (boost_tasks[cpu] == NULL) | 1033 | if (boost_tasks[cpu] == NULL) |
| 1034 | return; | 1034 | return; |
| 1035 | mutex_lock(&boost_mutex); | 1035 | mutex_lock(&boost_mutex); |
| 1036 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_boost task"); | ||
| 1037 | t = boost_tasks[cpu]; | 1036 | t = boost_tasks[cpu]; |
| 1038 | boost_tasks[cpu] = NULL; | 1037 | boost_tasks[cpu] = NULL; |
| 1039 | mutex_unlock(&boost_mutex); | 1038 | mutex_unlock(&boost_mutex); |
| 1040 | 1039 | ||
| 1041 | /* This must be outside of the mutex, otherwise deadlock! */ | 1040 | /* This must be outside of the mutex, otherwise deadlock! */ |
| 1042 | kthread_stop(t); | 1041 | torture_stop_kthread(rcu_torture_boost, t); |
| 1043 | boost_tasks[cpu] = NULL; | ||
| 1044 | } | 1042 | } |
| 1045 | 1043 | ||
| 1046 | static int rcutorture_booster_init(int cpu) | 1044 | static int rcutorture_booster_init(int cpu) |
| @@ -1110,16 +1108,6 @@ static int __init rcu_torture_stall_init(void) | |||
| 1110 | return torture_create_kthread(rcu_torture_stall, NULL, stall_task); | 1108 | return torture_create_kthread(rcu_torture_stall, NULL, stall_task); |
| 1111 | } | 1109 | } |
| 1112 | 1110 | ||
| 1113 | /* Clean up after the CPU-stall kthread, if one was spawned. */ | ||
| 1114 | static void rcu_torture_stall_cleanup(void) | ||
| 1115 | { | ||
| 1116 | if (stall_task == NULL) | ||
| 1117 | return; | ||
| 1118 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_stall_task."); | ||
| 1119 | kthread_stop(stall_task); | ||
| 1120 | stall_task = NULL; | ||
| 1121 | } | ||
| 1122 | |||
| 1123 | /* Callback function for RCU barrier testing. */ | 1111 | /* Callback function for RCU barrier testing. */ |
| 1124 | void rcu_torture_barrier_cbf(struct rcu_head *rcu) | 1112 | void rcu_torture_barrier_cbf(struct rcu_head *rcu) |
| 1125 | { | 1113 | { |
| @@ -1230,19 +1218,11 @@ static void rcu_torture_barrier_cleanup(void) | |||
| 1230 | { | 1218 | { |
| 1231 | int i; | 1219 | int i; |
| 1232 | 1220 | ||
| 1233 | if (barrier_task != NULL) { | 1221 | torture_stop_kthread(rcu_torture_barrier, barrier_task); |
| 1234 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_barrier task"); | ||
| 1235 | kthread_stop(barrier_task); | ||
| 1236 | barrier_task = NULL; | ||
| 1237 | } | ||
| 1238 | if (barrier_cbs_tasks != NULL) { | 1222 | if (barrier_cbs_tasks != NULL) { |
| 1239 | for (i = 0; i < n_barrier_cbs; i++) { | 1223 | for (i = 0; i < n_barrier_cbs; i++) |
| 1240 | if (barrier_cbs_tasks[i] != NULL) { | 1224 | torture_stop_kthread(rcu_torture_barrier_cbs, |
| 1241 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_barrier_cbs task"); | 1225 | barrier_cbs_tasks[i]); |
| 1242 | kthread_stop(barrier_cbs_tasks[i]); | ||
| 1243 | barrier_cbs_tasks[i] = NULL; | ||
| 1244 | } | ||
| 1245 | } | ||
| 1246 | kfree(barrier_cbs_tasks); | 1226 | kfree(barrier_cbs_tasks); |
| 1247 | barrier_cbs_tasks = NULL; | 1227 | barrier_cbs_tasks = NULL; |
| 1248 | } | 1228 | } |
| @@ -1288,53 +1268,29 @@ rcu_torture_cleanup(void) | |||
| 1288 | } | 1268 | } |
| 1289 | 1269 | ||
| 1290 | rcu_torture_barrier_cleanup(); | 1270 | rcu_torture_barrier_cleanup(); |
| 1291 | rcu_torture_stall_cleanup(); | 1271 | torture_stop_kthread(rcu_torture_stall, stall_task); |
| 1292 | torture_stutter_cleanup(); | 1272 | torture_stutter_cleanup(); |
| 1293 | 1273 | torture_stop_kthread(rcu_torture_writer, writer_task); | |
| 1294 | if (writer_task) { | ||
| 1295 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_writer task"); | ||
| 1296 | kthread_stop(writer_task); | ||
| 1297 | } | ||
| 1298 | writer_task = NULL; | ||
| 1299 | 1274 | ||
| 1300 | if (reader_tasks) { | 1275 | if (reader_tasks) { |
| 1301 | for (i = 0; i < nrealreaders; i++) { | 1276 | for (i = 0; i < nrealreaders; i++) |
| 1302 | if (reader_tasks[i]) { | 1277 | torture_stop_kthread(rcu_torture_reader, |
| 1303 | VERBOSE_TOROUT_STRING( | 1278 | reader_tasks[i]); |
| 1304 | "Stopping rcu_torture_reader task"); | ||
| 1305 | kthread_stop(reader_tasks[i]); | ||
| 1306 | } | ||
| 1307 | reader_tasks[i] = NULL; | ||
| 1308 | } | ||
| 1309 | kfree(reader_tasks); | 1279 | kfree(reader_tasks); |
| 1310 | reader_tasks = NULL; | ||
| 1311 | } | 1280 | } |
| 1312 | rcu_torture_current = NULL; | 1281 | rcu_torture_current = NULL; |
| 1313 | 1282 | ||
| 1314 | if (fakewriter_tasks) { | 1283 | if (fakewriter_tasks) { |
| 1315 | for (i = 0; i < nfakewriters; i++) { | 1284 | for (i = 0; i < nfakewriters; i++) { |
| 1316 | if (fakewriter_tasks[i]) { | 1285 | torture_stop_kthread(rcu_torture_fakewriter, |
| 1317 | VERBOSE_TOROUT_STRING( | 1286 | fakewriter_tasks[i]); |
| 1318 | "Stopping rcu_torture_fakewriter task"); | ||
| 1319 | kthread_stop(fakewriter_tasks[i]); | ||
| 1320 | } | ||
| 1321 | fakewriter_tasks[i] = NULL; | ||
| 1322 | } | 1287 | } |
| 1323 | kfree(fakewriter_tasks); | 1288 | kfree(fakewriter_tasks); |
| 1324 | fakewriter_tasks = NULL; | 1289 | fakewriter_tasks = NULL; |
| 1325 | } | 1290 | } |
| 1326 | 1291 | ||
| 1327 | if (stats_task) { | 1292 | torture_stop_kthread(rcu_torture_stats, stats_task); |
| 1328 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_stats task"); | 1293 | torture_stop_kthread(rcu_torture_fqs, fqs_task); |
| 1329 | kthread_stop(stats_task); | ||
| 1330 | } | ||
| 1331 | stats_task = NULL; | ||
| 1332 | |||
| 1333 | if (fqs_task) { | ||
| 1334 | VERBOSE_TOROUT_STRING("Stopping rcu_torture_fqs task"); | ||
| 1335 | kthread_stop(fqs_task); | ||
| 1336 | } | ||
| 1337 | fqs_task = NULL; | ||
| 1338 | if ((test_boost == 1 && cur_ops->can_boost) || | 1294 | if ((test_boost == 1 && cur_ops->can_boost) || |
| 1339 | test_boost == 2) { | 1295 | test_boost == 2) { |
| 1340 | unregister_cpu_notifier(&rcutorture_cpu_nb); | 1296 | unregister_cpu_notifier(&rcutorture_cpu_nb); |
diff --git a/kernel/torture.c b/kernel/torture.c index 439451821a7f..871f63611f7f 100644 --- a/kernel/torture.c +++ b/kernel/torture.c | |||
| @@ -700,3 +700,16 @@ int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m, | |||
| 700 | return ret; | 700 | return ret; |
| 701 | } | 701 | } |
| 702 | EXPORT_SYMBOL_GPL(_torture_create_kthread); | 702 | EXPORT_SYMBOL_GPL(_torture_create_kthread); |
| 703 | |||
| 704 | /* | ||
| 705 | * Stop a generic kthread, emitting a message. | ||
| 706 | */ | ||
| 707 | void _torture_stop_kthread(char *m, struct task_struct **tp) | ||
| 708 | { | ||
| 709 | if (*tp == NULL) | ||
| 710 | return; | ||
| 711 | VERBOSE_TOROUT_STRING(m); | ||
| 712 | kthread_stop(*tp); | ||
| 713 | *tp = NULL; | ||
| 714 | } | ||
| 715 | EXPORT_SYMBOL_GPL(_torture_stop_kthread); | ||
