1 // SPDX-License-Identifier: GPL-2.0+ << 2 /* 1 /* 3 * Common functions for in-kernel torture test 2 * Common functions for in-kernel torture tests. 4 * 3 * >> 4 * This program is free software; you can redistribute it and/or modify >> 5 * it under the terms of the GNU General Public License as published by >> 6 * the Free Software Foundation; either version 2 of the License, or >> 7 * (at your option) any later version. >> 8 * >> 9 * This program is distributed in the hope that it will be useful, >> 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of >> 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> 12 * GNU General Public License for more details. >> 13 * >> 14 * You should have received a copy of the GNU General Public License >> 15 * along with this program; if not, you can access it online at >> 16 * http://www.gnu.org/licenses/gpl-2.0.html. >> 17 * 5 * Copyright (C) IBM Corporation, 2014 18 * Copyright (C) IBM Corporation, 2014 6 * 19 * 7 * Author: Paul E. McKenney <paulmck@linux.ibm !! 20 * Author: Paul E. McKenney <paulmck@us.ibm.com> 8 * Based on kernel/rcu/torture.c. 21 * Based on kernel/rcu/torture.c. 9 */ 22 */ 10 << 11 #define pr_fmt(fmt) fmt << 12 << 13 #include <linux/types.h> 23 #include <linux/types.h> 14 #include <linux/kernel.h> 24 #include <linux/kernel.h> 15 #include <linux/init.h> 25 #include <linux/init.h> 16 #include <linux/module.h> 26 #include <linux/module.h> 17 #include <linux/kthread.h> 27 #include <linux/kthread.h> 18 #include <linux/err.h> 28 #include <linux/err.h> 19 #include <linux/spinlock.h> 29 #include <linux/spinlock.h> 20 #include <linux/smp.h> 30 #include <linux/smp.h> 21 #include <linux/interrupt.h> 31 #include <linux/interrupt.h> 22 #include <linux/sched.h> 32 #include <linux/sched.h> 23 #include <linux/sched/clock.h> 33 #include <linux/sched/clock.h> 24 #include <linux/atomic.h> 34 #include <linux/atomic.h> 25 #include <linux/bitops.h> 35 #include <linux/bitops.h> 26 #include <linux/completion.h> 36 #include <linux/completion.h> 27 #include <linux/moduleparam.h> 37 #include <linux/moduleparam.h> 28 #include <linux/percpu.h> 38 #include <linux/percpu.h> 29 #include <linux/notifier.h> 39 #include <linux/notifier.h> 30 #include <linux/reboot.h> 40 #include <linux/reboot.h> 31 #include <linux/freezer.h> 41 #include <linux/freezer.h> 32 #include <linux/cpu.h> 42 #include <linux/cpu.h> 33 #include <linux/delay.h> 43 #include <linux/delay.h> 34 #include <linux/stat.h> 44 #include <linux/stat.h> 35 #include <linux/slab.h> 45 #include <linux/slab.h> 36 #include <linux/trace_clock.h> 46 #include <linux/trace_clock.h> 37 #include <linux/ktime.h> 47 #include <linux/ktime.h> 38 #include <asm/byteorder.h> 48 #include <asm/byteorder.h> 39 #include <linux/torture.h> 49 #include <linux/torture.h> 40 #include <linux/sched/rt.h> << 41 #include "rcu/rcu.h" << 42 50 43 MODULE_DESCRIPTION("Common functions for in-ke << 44 MODULE_LICENSE("GPL"); 51 MODULE_LICENSE("GPL"); 45 MODULE_AUTHOR("Paul E. McKenney <paulmck@linux !! 52 MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com>"); 46 << 47 static bool disable_onoff_at_boot; << 48 module_param(disable_onoff_at_boot, bool, 0444 << 49 << 50 static bool ftrace_dump_at_shutdown; << 51 module_param(ftrace_dump_at_shutdown, bool, 04 << 52 << 53 static int verbose_sleep_frequency; << 54 module_param(verbose_sleep_frequency, int, 044 << 55 << 56 static int verbose_sleep_duration = 1; << 57 module_param(verbose_sleep_duration, int, 0444 << 58 << 59 static int random_shuffle; << 60 module_param(random_shuffle, int, 0444); << 61 53 62 static char *torture_type; 54 static char *torture_type; 63 static int verbose; !! 55 static bool verbose; 64 56 65 /* Mediate rmmod and system shutdown. Concurr 57 /* Mediate rmmod and system shutdown. Concurrent rmmod & shutdown illegal! */ 66 #define FULLSTOP_DONTSTOP 0 /* Normal oper 58 #define FULLSTOP_DONTSTOP 0 /* Normal operation. */ 67 #define FULLSTOP_SHUTDOWN 1 /* System shut 59 #define FULLSTOP_SHUTDOWN 1 /* System shutdown with torture running. */ 68 #define FULLSTOP_RMMOD 2 /* Normal rmmo 60 #define FULLSTOP_RMMOD 2 /* Normal rmmod of torture. */ 69 static int fullstop = FULLSTOP_RMMOD; 61 static int fullstop = FULLSTOP_RMMOD; 70 static DEFINE_MUTEX(fullstop_mutex); 62 static DEFINE_MUTEX(fullstop_mutex); 71 !! 63 static int *torture_runnable; 72 static atomic_t verbose_sleep_counter; << 73 << 74 /* << 75 * Sleep if needed from VERBOSE_TOROUT*(). << 76 */ << 77 void verbose_torout_sleep(void) << 78 { << 79 if (verbose_sleep_frequency > 0 && << 80 verbose_sleep_duration > 0 && << 81 !(atomic_inc_return(&verbose_sleep << 82 schedule_timeout_uninterruptib << 83 } << 84 EXPORT_SYMBOL_GPL(verbose_torout_sleep); << 85 << 86 /* << 87 * Schedule a high-resolution-timer sleep in n << 88 * nanosecond random fuzz. This function and << 89 * testing from the timer wheel. << 90 */ << 91 int torture_hrtimeout_ns(ktime_t baset_ns, u32 << 92 struct torture_random << 93 { << 94 ktime_t hto = baset_ns; << 95 << 96 if (trsp) << 97 hto += torture_random(trsp) % << 98 set_current_state(TASK_IDLE); << 99 return schedule_hrtimeout(&hto, mode); << 100 } << 101 EXPORT_SYMBOL_GPL(torture_hrtimeout_ns); << 102 << 103 /* << 104 * Schedule a high-resolution-timer sleep in m << 105 * nanosecond (not microsecond!) random fuzz. << 106 */ << 107 int torture_hrtimeout_us(u32 baset_us, u32 fuz << 108 { << 109 ktime_t baset_ns = baset_us * NSEC_PER << 110 << 111 return torture_hrtimeout_ns(baset_ns, << 112 } << 113 EXPORT_SYMBOL_GPL(torture_hrtimeout_us); << 114 << 115 /* << 116 * Schedule a high-resolution-timer sleep in m << 117 * microsecond (not millisecond!) random fuzz. << 118 */ << 119 int torture_hrtimeout_ms(u32 baset_ms, u32 fuz << 120 { << 121 ktime_t baset_ns = baset_ms * NSEC_PER << 122 u32 fuzzt_ns; << 123 << 124 if ((u32)~0U / NSEC_PER_USEC < fuzzt_u << 125 fuzzt_ns = (u32)~0U; << 126 else << 127 fuzzt_ns = fuzzt_us * NSEC_PER << 128 return torture_hrtimeout_ns(baset_ns, << 129 } << 130 EXPORT_SYMBOL_GPL(torture_hrtimeout_ms); << 131 << 132 /* << 133 * Schedule a high-resolution-timer sleep in j << 134 * implied one-jiffy random fuzz. This is int << 135 * schedule_timeout_interruptible() and friend << 136 */ << 137 int torture_hrtimeout_jiffies(u32 baset_j, str << 138 { << 139 ktime_t baset_ns = jiffies_to_nsecs(ba << 140 << 141 return torture_hrtimeout_ns(baset_ns, << 142 } << 143 EXPORT_SYMBOL_GPL(torture_hrtimeout_jiffies); << 144 << 145 /* << 146 * Schedule a high-resolution-timer sleep in m << 147 * millisecond (not second!) random fuzz. << 148 */ << 149 int torture_hrtimeout_s(u32 baset_s, u32 fuzzt << 150 { << 151 ktime_t baset_ns = baset_s * NSEC_PER_ << 152 u32 fuzzt_ns; << 153 << 154 if ((u32)~0U / NSEC_PER_MSEC < fuzzt_m << 155 fuzzt_ns = (u32)~0U; << 156 else << 157 fuzzt_ns = fuzzt_ms * NSEC_PER << 158 return torture_hrtimeout_ns(baset_ns, << 159 } << 160 EXPORT_SYMBOL_GPL(torture_hrtimeout_s); << 161 64 162 #ifdef CONFIG_HOTPLUG_CPU 65 #ifdef CONFIG_HOTPLUG_CPU 163 66 164 /* 67 /* 165 * Variables for online-offline handling. Onl 68 * Variables for online-offline handling. Only present if CPU hotplug 166 * is enabled, otherwise does nothing. 69 * is enabled, otherwise does nothing. 167 */ 70 */ 168 71 169 static struct task_struct *onoff_task; 72 static struct task_struct *onoff_task; 170 static long onoff_holdoff; 73 static long onoff_holdoff; 171 static long onoff_interval; 74 static long onoff_interval; 172 static torture_ofl_func *onoff_f; << 173 static long n_offline_attempts; 75 static long n_offline_attempts; 174 static long n_offline_successes; 76 static long n_offline_successes; 175 static unsigned long sum_offline; 77 static unsigned long sum_offline; 176 static int min_offline = -1; 78 static int min_offline = -1; 177 static int max_offline; 79 static int max_offline; 178 static long n_online_attempts; 80 static long n_online_attempts; 179 static long n_online_successes; 81 static long n_online_successes; 180 static unsigned long sum_online; 82 static unsigned long sum_online; 181 static int min_online = -1; 83 static int min_online = -1; 182 static int max_online; 84 static int max_online; 183 85 184 static int torture_online_cpus = NR_CPUS; << 185 << 186 /* << 187 * Some torture testing leverages confusion as << 188 * CPUs. This function returns the torture-te << 189 * which allows torture tests to load-balance << 190 */ << 191 int torture_num_online_cpus(void) << 192 { << 193 return READ_ONCE(torture_online_cpus); << 194 } << 195 EXPORT_SYMBOL_GPL(torture_num_online_cpus); << 196 << 197 /* 86 /* 198 * Attempt to take a CPU offline. Return fals 87 * Attempt to take a CPU offline. Return false if the CPU is already 199 * offline or if it is not subject to CPU-hotp 88 * offline or if it is not subject to CPU-hotplug operations. The 200 * caller can detect other failures by looking 89 * caller can detect other failures by looking at the statistics. 201 */ 90 */ 202 bool torture_offline(int cpu, long *n_offl_att 91 bool torture_offline(int cpu, long *n_offl_attempts, long *n_offl_successes, 203 unsigned long *sum_offl, 92 unsigned long *sum_offl, int *min_offl, int *max_offl) 204 { 93 { 205 unsigned long delta; 94 unsigned long delta; 206 int ret; 95 int ret; 207 char *s; << 208 unsigned long starttime; 96 unsigned long starttime; 209 97 210 if (!cpu_online(cpu) || !cpu_is_hotplu 98 if (!cpu_online(cpu) || !cpu_is_hotpluggable(cpu)) 211 return false; 99 return false; 212 if (num_online_cpus() <= 1) << 213 return false; /* Can't offlin << 214 100 215 if (verbose > 1) !! 101 if (verbose) 216 pr_alert("%s" TORTURE_FLAG 102 pr_alert("%s" TORTURE_FLAG 217 "torture_onoff task: 103 "torture_onoff task: offlining %d\n", 218 torture_type, cpu); 104 torture_type, cpu); 219 starttime = jiffies; 105 starttime = jiffies; 220 (*n_offl_attempts)++; 106 (*n_offl_attempts)++; 221 ret = remove_cpu(cpu); !! 107 ret = cpu_down(cpu); 222 if (ret) { 108 if (ret) { 223 s = ""; << 224 if (!rcu_inkernel_boot_has_end << 225 // PCI probe frequentl << 226 (*n_offl_attempts)--; << 227 s = " (-EBUSY forgiven << 228 } << 229 if (verbose) 109 if (verbose) 230 pr_alert("%s" TORTURE_ 110 pr_alert("%s" TORTURE_FLAG 231 "torture_onof !! 111 "torture_onoff task: offline %d failed: errno %d\n", 232 torture_type, !! 112 torture_type, cpu, ret); 233 } else { 113 } else { 234 if (verbose > 1) !! 114 if (verbose) 235 pr_alert("%s" TORTURE_ 115 pr_alert("%s" TORTURE_FLAG 236 "torture_onof 116 "torture_onoff task: offlined %d\n", 237 torture_type, 117 torture_type, cpu); 238 if (onoff_f) << 239 onoff_f(); << 240 (*n_offl_successes)++; 118 (*n_offl_successes)++; 241 delta = jiffies - starttime; 119 delta = jiffies - starttime; 242 *sum_offl += delta; !! 120 sum_offl += delta; 243 if (*min_offl < 0) { 121 if (*min_offl < 0) { 244 *min_offl = delta; 122 *min_offl = delta; 245 *max_offl = delta; 123 *max_offl = delta; 246 } 124 } 247 if (*min_offl > delta) 125 if (*min_offl > delta) 248 *min_offl = delta; 126 *min_offl = delta; 249 if (*max_offl < delta) 127 if (*max_offl < delta) 250 *max_offl = delta; 128 *max_offl = delta; 251 WRITE_ONCE(torture_online_cpus << 252 WARN_ON_ONCE(torture_online_cp << 253 } 129 } 254 130 255 return true; 131 return true; 256 } 132 } 257 EXPORT_SYMBOL_GPL(torture_offline); 133 EXPORT_SYMBOL_GPL(torture_offline); 258 134 259 /* 135 /* 260 * Attempt to bring a CPU online. Return fals 136 * Attempt to bring a CPU online. Return false if the CPU is already 261 * online or if it is not subject to CPU-hotpl 137 * online or if it is not subject to CPU-hotplug operations. The 262 * caller can detect other failures by looking 138 * caller can detect other failures by looking at the statistics. 263 */ 139 */ 264 bool torture_online(int cpu, long *n_onl_attem 140 bool torture_online(int cpu, long *n_onl_attempts, long *n_onl_successes, 265 unsigned long *sum_onl, in 141 unsigned long *sum_onl, int *min_onl, int *max_onl) 266 { 142 { 267 unsigned long delta; 143 unsigned long delta; 268 int ret; 144 int ret; 269 char *s; << 270 unsigned long starttime; 145 unsigned long starttime; 271 146 272 if (cpu_online(cpu) || !cpu_is_hotplug 147 if (cpu_online(cpu) || !cpu_is_hotpluggable(cpu)) 273 return false; 148 return false; 274 149 275 if (verbose > 1) !! 150 if (verbose) 276 pr_alert("%s" TORTURE_FLAG 151 pr_alert("%s" TORTURE_FLAG 277 "torture_onoff task: 152 "torture_onoff task: onlining %d\n", 278 torture_type, cpu); 153 torture_type, cpu); 279 starttime = jiffies; 154 starttime = jiffies; 280 (*n_onl_attempts)++; 155 (*n_onl_attempts)++; 281 ret = add_cpu(cpu); !! 156 ret = cpu_up(cpu); 282 if (ret) { 157 if (ret) { 283 s = ""; << 284 if (!rcu_inkernel_boot_has_end << 285 // PCI probe frequentl << 286 (*n_onl_attempts)--; << 287 s = " (-EBUSY forgiven << 288 } << 289 if (verbose) 158 if (verbose) 290 pr_alert("%s" TORTURE_ 159 pr_alert("%s" TORTURE_FLAG 291 "torture_onof !! 160 "torture_onoff task: online %d failed: errno %d\n", 292 torture_type, !! 161 torture_type, cpu, ret); 293 } else { 162 } else { 294 if (verbose > 1) !! 163 if (verbose) 295 pr_alert("%s" TORTURE_ 164 pr_alert("%s" TORTURE_FLAG 296 "torture_onof 165 "torture_onoff task: onlined %d\n", 297 torture_type, 166 torture_type, cpu); 298 (*n_onl_successes)++; 167 (*n_onl_successes)++; 299 delta = jiffies - starttime; 168 delta = jiffies - starttime; 300 *sum_onl += delta; 169 *sum_onl += delta; 301 if (*min_onl < 0) { 170 if (*min_onl < 0) { 302 *min_onl = delta; 171 *min_onl = delta; 303 *max_onl = delta; 172 *max_onl = delta; 304 } 173 } 305 if (*min_onl > delta) 174 if (*min_onl > delta) 306 *min_onl = delta; 175 *min_onl = delta; 307 if (*max_onl < delta) 176 if (*max_onl < delta) 308 *max_onl = delta; 177 *max_onl = delta; 309 WRITE_ONCE(torture_online_cpus << 310 } 178 } 311 179 312 return true; 180 return true; 313 } 181 } 314 EXPORT_SYMBOL_GPL(torture_online); 182 EXPORT_SYMBOL_GPL(torture_online); 315 183 316 /* 184 /* 317 * Get everything online at the beginning and << 318 */ << 319 static void torture_online_all(char *phase) << 320 { << 321 int cpu; << 322 int ret; << 323 << 324 for_each_possible_cpu(cpu) { << 325 if (cpu_online(cpu)) << 326 continue; << 327 ret = add_cpu(cpu); << 328 if (ret && verbose) { << 329 pr_alert("%s" TORTURE_ << 330 "%s: %s onlin << 331 __func__, pha << 332 } << 333 } << 334 } << 335 << 336 /* << 337 * Execute random CPU-hotplug operations at th 185 * Execute random CPU-hotplug operations at the interval specified 338 * by the onoff_interval. 186 * by the onoff_interval. 339 */ 187 */ 340 static int 188 static int 341 torture_onoff(void *arg) 189 torture_onoff(void *arg) 342 { 190 { 343 int cpu; 191 int cpu; 344 int maxcpu = -1; 192 int maxcpu = -1; 345 DEFINE_TORTURE_RANDOM(rand); 193 DEFINE_TORTURE_RANDOM(rand); 346 194 347 VERBOSE_TOROUT_STRING("torture_onoff t 195 VERBOSE_TOROUT_STRING("torture_onoff task started"); 348 for_each_online_cpu(cpu) 196 for_each_online_cpu(cpu) 349 maxcpu = cpu; 197 maxcpu = cpu; 350 WARN_ON(maxcpu < 0); 198 WARN_ON(maxcpu < 0); 351 torture_online_all("Initial"); !! 199 352 if (maxcpu == 0) { 200 if (maxcpu == 0) { 353 VERBOSE_TOROUT_STRING("Only on 201 VERBOSE_TOROUT_STRING("Only one CPU, so CPU-hotplug testing is disabled"); 354 goto stop; 202 goto stop; 355 } 203 } 356 204 357 if (onoff_holdoff > 0) { 205 if (onoff_holdoff > 0) { 358 VERBOSE_TOROUT_STRING("torture 206 VERBOSE_TOROUT_STRING("torture_onoff begin holdoff"); 359 torture_hrtimeout_jiffies(onof !! 207 schedule_timeout_interruptible(onoff_holdoff); 360 VERBOSE_TOROUT_STRING("torture 208 VERBOSE_TOROUT_STRING("torture_onoff end holdoff"); 361 } 209 } 362 while (!torture_must_stop()) { 210 while (!torture_must_stop()) { 363 if (disable_onoff_at_boot && ! !! 211 cpu = (torture_random(&rand) >> 4) % (maxcpu + 1); 364 torture_hrtimeout_jiff << 365 continue; << 366 } << 367 cpu = torture_random(&rand) % << 368 if (!torture_offline(cpu, 212 if (!torture_offline(cpu, 369 &n_offlin 213 &n_offline_attempts, &n_offline_successes, 370 &sum_offl 214 &sum_offline, &min_offline, &max_offline)) 371 torture_online(cpu, 215 torture_online(cpu, 372 &n_onli 216 &n_online_attempts, &n_online_successes, 373 &sum_on 217 &sum_online, &min_online, &max_online); 374 torture_hrtimeout_jiffies(onof !! 218 schedule_timeout_interruptible(onoff_interval); 375 } 219 } 376 220 377 stop: 221 stop: 378 torture_kthread_stopping("torture_onof 222 torture_kthread_stopping("torture_onoff"); 379 torture_online_all("Final"); << 380 return 0; 223 return 0; 381 } 224 } 382 225 383 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 226 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 384 227 385 /* 228 /* 386 * Initiate online-offline handling. 229 * Initiate online-offline handling. 387 */ 230 */ 388 int torture_onoff_init(long ooholdoff, long oo !! 231 int torture_onoff_init(long ooholdoff, long oointerval) 389 { 232 { >> 233 int ret = 0; >> 234 390 #ifdef CONFIG_HOTPLUG_CPU 235 #ifdef CONFIG_HOTPLUG_CPU 391 onoff_holdoff = ooholdoff; 236 onoff_holdoff = ooholdoff; 392 onoff_interval = oointerval; 237 onoff_interval = oointerval; 393 onoff_f = f; << 394 if (onoff_interval <= 0) 238 if (onoff_interval <= 0) 395 return 0; 239 return 0; 396 return torture_create_kthread(torture_ !! 240 ret = torture_create_kthread(torture_onoff, NULL, onoff_task); 397 #else /* #ifdef CONFIG_HOTPLUG_CPU */ !! 241 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 398 return 0; !! 242 return ret; 399 #endif /* #else #ifdef CONFIG_HOTPLUG_CPU */ << 400 } 243 } 401 EXPORT_SYMBOL_GPL(torture_onoff_init); 244 EXPORT_SYMBOL_GPL(torture_onoff_init); 402 245 403 /* 246 /* 404 * Clean up after online/offline testing. 247 * Clean up after online/offline testing. 405 */ 248 */ 406 static void torture_onoff_cleanup(void) 249 static void torture_onoff_cleanup(void) 407 { 250 { 408 #ifdef CONFIG_HOTPLUG_CPU 251 #ifdef CONFIG_HOTPLUG_CPU 409 if (onoff_task == NULL) 252 if (onoff_task == NULL) 410 return; 253 return; 411 VERBOSE_TOROUT_STRING("Stopping tortur 254 VERBOSE_TOROUT_STRING("Stopping torture_onoff task"); 412 kthread_stop(onoff_task); 255 kthread_stop(onoff_task); 413 onoff_task = NULL; 256 onoff_task = NULL; 414 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 257 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 415 } 258 } >> 259 EXPORT_SYMBOL_GPL(torture_onoff_cleanup); 416 260 417 /* 261 /* 418 * Print online/offline testing statistics. 262 * Print online/offline testing statistics. 419 */ 263 */ 420 void torture_onoff_stats(void) 264 void torture_onoff_stats(void) 421 { 265 { 422 #ifdef CONFIG_HOTPLUG_CPU 266 #ifdef CONFIG_HOTPLUG_CPU 423 pr_cont("onoff: %ld/%ld:%ld/%ld %d,%d: 267 pr_cont("onoff: %ld/%ld:%ld/%ld %d,%d:%d,%d %lu:%lu (HZ=%d) ", 424 n_online_successes, n_online_a 268 n_online_successes, n_online_attempts, 425 n_offline_successes, n_offline 269 n_offline_successes, n_offline_attempts, 426 min_online, max_online, 270 min_online, max_online, 427 min_offline, max_offline, 271 min_offline, max_offline, 428 sum_online, sum_offline, HZ); 272 sum_online, sum_offline, HZ); 429 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 273 #endif /* #ifdef CONFIG_HOTPLUG_CPU */ 430 } 274 } 431 EXPORT_SYMBOL_GPL(torture_onoff_stats); 275 EXPORT_SYMBOL_GPL(torture_onoff_stats); 432 276 433 /* 277 /* 434 * Were all the online/offline operations succ 278 * Were all the online/offline operations successful? 435 */ 279 */ 436 bool torture_onoff_failures(void) 280 bool torture_onoff_failures(void) 437 { 281 { 438 #ifdef CONFIG_HOTPLUG_CPU 282 #ifdef CONFIG_HOTPLUG_CPU 439 return n_online_successes != n_online_ 283 return n_online_successes != n_online_attempts || 440 n_offline_successes != n_offlin 284 n_offline_successes != n_offline_attempts; 441 #else /* #ifdef CONFIG_HOTPLUG_CPU */ 285 #else /* #ifdef CONFIG_HOTPLUG_CPU */ 442 return false; 286 return false; 443 #endif /* #else #ifdef CONFIG_HOTPLUG_CPU */ 287 #endif /* #else #ifdef CONFIG_HOTPLUG_CPU */ 444 } 288 } 445 EXPORT_SYMBOL_GPL(torture_onoff_failures); 289 EXPORT_SYMBOL_GPL(torture_onoff_failures); 446 290 447 #define TORTURE_RANDOM_MULT 39916801 /* p 291 #define TORTURE_RANDOM_MULT 39916801 /* prime */ 448 #define TORTURE_RANDOM_ADD 479001701 /* p 292 #define TORTURE_RANDOM_ADD 479001701 /* prime */ 449 #define TORTURE_RANDOM_REFRESH 10000 293 #define TORTURE_RANDOM_REFRESH 10000 450 294 451 /* 295 /* 452 * Crude but fast random-number generator. Us 296 * Crude but fast random-number generator. Uses a linear congruential 453 * generator, with occasional help from cpu_cl 297 * generator, with occasional help from cpu_clock(). 454 */ 298 */ 455 unsigned long 299 unsigned long 456 torture_random(struct torture_random_state *tr 300 torture_random(struct torture_random_state *trsp) 457 { 301 { 458 if (--trsp->trs_count < 0) { 302 if (--trsp->trs_count < 0) { 459 trsp->trs_state += (unsigned l !! 303 trsp->trs_state += (unsigned long)local_clock(); 460 trsp->trs_count = TORTURE_RAND 304 trsp->trs_count = TORTURE_RANDOM_REFRESH; 461 } 305 } 462 trsp->trs_state = trsp->trs_state * TO 306 trsp->trs_state = trsp->trs_state * TORTURE_RANDOM_MULT + 463 TORTURE_RANDOM_ADD; 307 TORTURE_RANDOM_ADD; 464 return swahw32(trsp->trs_state); 308 return swahw32(trsp->trs_state); 465 } 309 } 466 EXPORT_SYMBOL_GPL(torture_random); 310 EXPORT_SYMBOL_GPL(torture_random); 467 311 468 /* 312 /* 469 * Variables for shuffling. The idea is to en 313 * Variables for shuffling. The idea is to ensure that each CPU stays 470 * idle for an extended period to test interac 314 * idle for an extended period to test interactions with dyntick idle, 471 * as well as interactions with any per-CPU va 315 * as well as interactions with any per-CPU variables. 472 */ 316 */ 473 struct shuffle_task { 317 struct shuffle_task { 474 struct list_head st_l; 318 struct list_head st_l; 475 struct task_struct *st_t; 319 struct task_struct *st_t; 476 }; 320 }; 477 321 478 static long shuffle_interval; /* In jiffies. 322 static long shuffle_interval; /* In jiffies. */ 479 static struct task_struct *shuffler_task; 323 static struct task_struct *shuffler_task; 480 static cpumask_var_t shuffle_tmp_mask; 324 static cpumask_var_t shuffle_tmp_mask; 481 static int shuffle_idle_cpu; /* Force all t 325 static int shuffle_idle_cpu; /* Force all torture tasks off this CPU */ 482 static struct list_head shuffle_task_list = LI 326 static struct list_head shuffle_task_list = LIST_HEAD_INIT(shuffle_task_list); 483 static DEFINE_MUTEX(shuffle_task_mutex); 327 static DEFINE_MUTEX(shuffle_task_mutex); 484 328 485 /* 329 /* 486 * Register a task to be shuffled. If there i 330 * Register a task to be shuffled. If there is no memory, just splat 487 * and don't bother registering. 331 * and don't bother registering. 488 */ 332 */ 489 void torture_shuffle_task_register(struct task 333 void torture_shuffle_task_register(struct task_struct *tp) 490 { 334 { 491 struct shuffle_task *stp; 335 struct shuffle_task *stp; 492 336 493 if (WARN_ON_ONCE(tp == NULL)) 337 if (WARN_ON_ONCE(tp == NULL)) 494 return; 338 return; 495 stp = kmalloc(sizeof(*stp), GFP_KERNEL 339 stp = kmalloc(sizeof(*stp), GFP_KERNEL); 496 if (WARN_ON_ONCE(stp == NULL)) 340 if (WARN_ON_ONCE(stp == NULL)) 497 return; 341 return; 498 stp->st_t = tp; 342 stp->st_t = tp; 499 mutex_lock(&shuffle_task_mutex); 343 mutex_lock(&shuffle_task_mutex); 500 list_add(&stp->st_l, &shuffle_task_lis 344 list_add(&stp->st_l, &shuffle_task_list); 501 mutex_unlock(&shuffle_task_mutex); 345 mutex_unlock(&shuffle_task_mutex); 502 } 346 } 503 EXPORT_SYMBOL_GPL(torture_shuffle_task_registe 347 EXPORT_SYMBOL_GPL(torture_shuffle_task_register); 504 348 505 /* 349 /* 506 * Unregister all tasks, for example, at the e 350 * Unregister all tasks, for example, at the end of the torture run. 507 */ 351 */ 508 static void torture_shuffle_task_unregister_al 352 static void torture_shuffle_task_unregister_all(void) 509 { 353 { 510 struct shuffle_task *stp; 354 struct shuffle_task *stp; 511 struct shuffle_task *p; 355 struct shuffle_task *p; 512 356 513 mutex_lock(&shuffle_task_mutex); 357 mutex_lock(&shuffle_task_mutex); 514 list_for_each_entry_safe(stp, p, &shuf 358 list_for_each_entry_safe(stp, p, &shuffle_task_list, st_l) { 515 list_del(&stp->st_l); 359 list_del(&stp->st_l); 516 kfree(stp); 360 kfree(stp); 517 } 361 } 518 mutex_unlock(&shuffle_task_mutex); 362 mutex_unlock(&shuffle_task_mutex); 519 } 363 } 520 364 521 /* Shuffle tasks such that we allow shuffle_id 365 /* Shuffle tasks such that we allow shuffle_idle_cpu to become idle. 522 * A special case is when shuffle_idle_cpu = - 366 * A special case is when shuffle_idle_cpu = -1, in which case we allow 523 * the tasks to run on all CPUs. 367 * the tasks to run on all CPUs. 524 */ 368 */ 525 static void torture_shuffle_tasks(struct tortu !! 369 static void torture_shuffle_tasks(void) 526 { 370 { 527 struct shuffle_task *stp; 371 struct shuffle_task *stp; 528 372 529 cpumask_setall(shuffle_tmp_mask); 373 cpumask_setall(shuffle_tmp_mask); 530 cpus_read_lock(); !! 374 get_online_cpus(); 531 375 532 /* No point in shuffling if there is o 376 /* No point in shuffling if there is only one online CPU (ex: UP) */ 533 if (num_online_cpus() == 1) { 377 if (num_online_cpus() == 1) { 534 cpus_read_unlock(); !! 378 put_online_cpus(); 535 return; 379 return; 536 } 380 } 537 381 538 /* Advance to the next CPU. Upon over 382 /* Advance to the next CPU. Upon overflow, don't idle any CPUs. */ 539 shuffle_idle_cpu = cpumask_next(shuffl 383 shuffle_idle_cpu = cpumask_next(shuffle_idle_cpu, shuffle_tmp_mask); 540 if (shuffle_idle_cpu >= nr_cpu_ids) 384 if (shuffle_idle_cpu >= nr_cpu_ids) 541 shuffle_idle_cpu = -1; 385 shuffle_idle_cpu = -1; 542 else 386 else 543 cpumask_clear_cpu(shuffle_idle 387 cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask); 544 388 545 mutex_lock(&shuffle_task_mutex); 389 mutex_lock(&shuffle_task_mutex); 546 list_for_each_entry(stp, &shuffle_task !! 390 list_for_each_entry(stp, &shuffle_task_list, st_l) 547 if (!random_shuffle || torture !! 391 set_cpus_allowed_ptr(stp->st_t, shuffle_tmp_mask); 548 set_cpus_allowed_ptr(s << 549 } << 550 mutex_unlock(&shuffle_task_mutex); 392 mutex_unlock(&shuffle_task_mutex); 551 393 552 cpus_read_unlock(); !! 394 put_online_cpus(); 553 } 395 } 554 396 555 /* Shuffle tasks across CPUs, with the intent 397 /* Shuffle tasks across CPUs, with the intent of allowing each CPU in the 556 * system to become idle at a time and cut off 398 * system to become idle at a time and cut off its timer ticks. This is meant 557 * to test the support for such tickless idle 399 * to test the support for such tickless idle CPU in RCU. 558 */ 400 */ 559 static int torture_shuffle(void *arg) 401 static int torture_shuffle(void *arg) 560 { 402 { 561 DEFINE_TORTURE_RANDOM(rand); << 562 << 563 VERBOSE_TOROUT_STRING("torture_shuffle 403 VERBOSE_TOROUT_STRING("torture_shuffle task started"); 564 do { 404 do { 565 torture_hrtimeout_jiffies(shuf !! 405 schedule_timeout_interruptible(shuffle_interval); 566 torture_shuffle_tasks(&rand); !! 406 torture_shuffle_tasks(); 567 torture_shutdown_absorb("tortu 407 torture_shutdown_absorb("torture_shuffle"); 568 } while (!torture_must_stop()); 408 } while (!torture_must_stop()); 569 torture_kthread_stopping("torture_shuf 409 torture_kthread_stopping("torture_shuffle"); 570 return 0; 410 return 0; 571 } 411 } 572 412 573 /* 413 /* 574 * Start the shuffler, with shuffint in jiffie 414 * Start the shuffler, with shuffint in jiffies. 575 */ 415 */ 576 int torture_shuffle_init(long shuffint) 416 int torture_shuffle_init(long shuffint) 577 { 417 { 578 shuffle_interval = shuffint; 418 shuffle_interval = shuffint; 579 419 580 shuffle_idle_cpu = -1; 420 shuffle_idle_cpu = -1; 581 421 582 if (!alloc_cpumask_var(&shuffle_tmp_ma 422 if (!alloc_cpumask_var(&shuffle_tmp_mask, GFP_KERNEL)) { 583 TOROUT_ERRSTRING("Failed to al !! 423 VERBOSE_TOROUT_ERRSTRING("Failed to alloc mask"); 584 return -ENOMEM; 424 return -ENOMEM; 585 } 425 } 586 426 587 /* Create the shuffler thread */ 427 /* Create the shuffler thread */ 588 return torture_create_kthread(torture_ 428 return torture_create_kthread(torture_shuffle, NULL, shuffler_task); 589 } 429 } 590 EXPORT_SYMBOL_GPL(torture_shuffle_init); 430 EXPORT_SYMBOL_GPL(torture_shuffle_init); 591 431 592 /* 432 /* 593 * Stop the shuffling. 433 * Stop the shuffling. 594 */ 434 */ 595 static void torture_shuffle_cleanup(void) 435 static void torture_shuffle_cleanup(void) 596 { 436 { 597 torture_shuffle_task_unregister_all(); 437 torture_shuffle_task_unregister_all(); 598 if (shuffler_task) { 438 if (shuffler_task) { 599 VERBOSE_TOROUT_STRING("Stoppin 439 VERBOSE_TOROUT_STRING("Stopping torture_shuffle task"); 600 kthread_stop(shuffler_task); 440 kthread_stop(shuffler_task); 601 free_cpumask_var(shuffle_tmp_m 441 free_cpumask_var(shuffle_tmp_mask); 602 } 442 } 603 shuffler_task = NULL; 443 shuffler_task = NULL; 604 } 444 } >> 445 EXPORT_SYMBOL_GPL(torture_shuffle_cleanup); 605 446 606 /* 447 /* 607 * Variables for auto-shutdown. This allows " 448 * Variables for auto-shutdown. This allows "lights out" torture runs 608 * to be fully scripted. 449 * to be fully scripted. 609 */ 450 */ 610 static struct task_struct *shutdown_task; 451 static struct task_struct *shutdown_task; 611 static ktime_t shutdown_time; /* tim 452 static ktime_t shutdown_time; /* time to system shutdown. */ 612 static void (*torture_shutdown_hook)(void); 453 static void (*torture_shutdown_hook)(void); 613 454 614 /* 455 /* 615 * Absorb kthreads into a kernel function that 456 * Absorb kthreads into a kernel function that won't return, so that 616 * they won't ever access module text or data 457 * they won't ever access module text or data again. 617 */ 458 */ 618 void torture_shutdown_absorb(const char *title 459 void torture_shutdown_absorb(const char *title) 619 { 460 { 620 while (READ_ONCE(fullstop) == FULLSTOP 461 while (READ_ONCE(fullstop) == FULLSTOP_SHUTDOWN) { 621 pr_notice("torture thread %s p 462 pr_notice("torture thread %s parking due to system shutdown\n", 622 title); 463 title); 623 schedule_timeout_uninterruptib 464 schedule_timeout_uninterruptible(MAX_SCHEDULE_TIMEOUT); 624 } 465 } 625 } 466 } 626 EXPORT_SYMBOL_GPL(torture_shutdown_absorb); 467 EXPORT_SYMBOL_GPL(torture_shutdown_absorb); 627 468 628 /* 469 /* 629 * Cause the torture test to shutdown the syst 470 * Cause the torture test to shutdown the system after the test has 630 * run for the time specified by the shutdown_ 471 * run for the time specified by the shutdown_secs parameter. 631 */ 472 */ 632 static int torture_shutdown(void *arg) 473 static int torture_shutdown(void *arg) 633 { 474 { 634 ktime_t ktime_snap; 475 ktime_t ktime_snap; 635 476 636 VERBOSE_TOROUT_STRING("torture_shutdow 477 VERBOSE_TOROUT_STRING("torture_shutdown task started"); 637 ktime_snap = ktime_get(); 478 ktime_snap = ktime_get(); 638 while (ktime_before(ktime_snap, shutdo 479 while (ktime_before(ktime_snap, shutdown_time) && 639 !torture_must_stop()) { 480 !torture_must_stop()) { 640 if (verbose) 481 if (verbose) 641 pr_alert("%s" TORTURE_ 482 pr_alert("%s" TORTURE_FLAG 642 "torture_shut 483 "torture_shutdown task: %llu ms remaining\n", 643 torture_type, 484 torture_type, 644 ktime_ms_delt 485 ktime_ms_delta(shutdown_time, ktime_snap)); 645 set_current_state(TASK_INTERRU 486 set_current_state(TASK_INTERRUPTIBLE); 646 schedule_hrtimeout(&shutdown_t 487 schedule_hrtimeout(&shutdown_time, HRTIMER_MODE_ABS); 647 ktime_snap = ktime_get(); 488 ktime_snap = ktime_get(); 648 } 489 } 649 if (torture_must_stop()) { 490 if (torture_must_stop()) { 650 torture_kthread_stopping("tort 491 torture_kthread_stopping("torture_shutdown"); 651 return 0; 492 return 0; 652 } 493 } 653 494 654 /* OK, shut down the system. */ 495 /* OK, shut down the system. */ 655 496 656 VERBOSE_TOROUT_STRING("torture_shutdow 497 VERBOSE_TOROUT_STRING("torture_shutdown task shutting down system"); 657 shutdown_task = NULL; /* Avoid self- 498 shutdown_task = NULL; /* Avoid self-kill deadlock. */ 658 if (torture_shutdown_hook) 499 if (torture_shutdown_hook) 659 torture_shutdown_hook(); 500 torture_shutdown_hook(); 660 else 501 else 661 VERBOSE_TOROUT_STRING("No tort 502 VERBOSE_TOROUT_STRING("No torture_shutdown_hook(), skipping."); 662 if (ftrace_dump_at_shutdown) !! 503 ftrace_dump(DUMP_ALL); 663 rcu_ftrace_dump(DUMP_ALL); << 664 kernel_power_off(); /* Shut down t 504 kernel_power_off(); /* Shut down the system. */ 665 return 0; 505 return 0; 666 } 506 } 667 507 668 /* 508 /* 669 * Start up the shutdown task. 509 * Start up the shutdown task. 670 */ 510 */ 671 int torture_shutdown_init(int ssecs, void (*cl 511 int torture_shutdown_init(int ssecs, void (*cleanup)(void)) 672 { 512 { >> 513 int ret = 0; >> 514 673 torture_shutdown_hook = cleanup; 515 torture_shutdown_hook = cleanup; 674 if (ssecs > 0) { 516 if (ssecs > 0) { 675 shutdown_time = ktime_add(ktim 517 shutdown_time = ktime_add(ktime_get(), ktime_set(ssecs, 0)); 676 return torture_create_kthread( !! 518 ret = torture_create_kthread(torture_shutdown, NULL, 677 !! 519 shutdown_task); 678 } 520 } 679 return 0; !! 521 return ret; 680 } 522 } 681 EXPORT_SYMBOL_GPL(torture_shutdown_init); 523 EXPORT_SYMBOL_GPL(torture_shutdown_init); 682 524 683 /* 525 /* 684 * Detect and respond to a system shutdown. 526 * Detect and respond to a system shutdown. 685 */ 527 */ 686 static int torture_shutdown_notify(struct noti 528 static int torture_shutdown_notify(struct notifier_block *unused1, 687 unsigned lo 529 unsigned long unused2, void *unused3) 688 { 530 { 689 mutex_lock(&fullstop_mutex); 531 mutex_lock(&fullstop_mutex); 690 if (READ_ONCE(fullstop) == FULLSTOP_DO 532 if (READ_ONCE(fullstop) == FULLSTOP_DONTSTOP) { 691 VERBOSE_TOROUT_STRING("Unsched 533 VERBOSE_TOROUT_STRING("Unscheduled system shutdown detected"); 692 WRITE_ONCE(fullstop, FULLSTOP_ 534 WRITE_ONCE(fullstop, FULLSTOP_SHUTDOWN); 693 } else { 535 } else { 694 pr_warn("Concurrent rmmod and 536 pr_warn("Concurrent rmmod and shutdown illegal!\n"); 695 } 537 } 696 mutex_unlock(&fullstop_mutex); 538 mutex_unlock(&fullstop_mutex); 697 return NOTIFY_DONE; 539 return NOTIFY_DONE; 698 } 540 } 699 541 700 static struct notifier_block torture_shutdown_ 542 static struct notifier_block torture_shutdown_nb = { 701 .notifier_call = torture_shutdown_noti 543 .notifier_call = torture_shutdown_notify, 702 }; 544 }; 703 545 704 /* 546 /* 705 * Shut down the shutdown task. Say what??? 547 * Shut down the shutdown task. Say what??? Heh! This can happen if 706 * the torture module gets an rmmod before the 548 * the torture module gets an rmmod before the shutdown time arrives. ;-) 707 */ 549 */ 708 static void torture_shutdown_cleanup(void) 550 static void torture_shutdown_cleanup(void) 709 { 551 { 710 unregister_reboot_notifier(&torture_sh 552 unregister_reboot_notifier(&torture_shutdown_nb); 711 if (shutdown_task != NULL) { 553 if (shutdown_task != NULL) { 712 VERBOSE_TOROUT_STRING("Stoppin 554 VERBOSE_TOROUT_STRING("Stopping torture_shutdown task"); 713 kthread_stop(shutdown_task); 555 kthread_stop(shutdown_task); 714 } 556 } 715 shutdown_task = NULL; 557 shutdown_task = NULL; 716 } 558 } 717 559 718 /* 560 /* 719 * Variables for stuttering, which means to pe 561 * Variables for stuttering, which means to periodically pause and 720 * restart testing in order to catch bugs that 562 * restart testing in order to catch bugs that appear when load is 721 * suddenly applied to or removed from the sys 563 * suddenly applied to or removed from the system. 722 */ 564 */ 723 static struct task_struct *stutter_task; 565 static struct task_struct *stutter_task; 724 static ktime_t stutter_till_abs_time; !! 566 static int stutter_pause_test; 725 static int stutter; 567 static int stutter; 726 static int stutter_gap; << 727 568 728 /* 569 /* 729 * Block until the stutter interval ends. Thi 570 * Block until the stutter interval ends. This must be called periodically 730 * by all running kthreads that need to be sub 571 * by all running kthreads that need to be subject to stuttering. 731 */ 572 */ 732 bool stutter_wait(const char *title) !! 573 void stutter_wait(const char *title) 733 { 574 { 734 bool ret = false; !! 575 cond_resched_rcu_qs(); 735 ktime_t till_ns; !! 576 while (READ_ONCE(stutter_pause_test) || 736 !! 577 (torture_runnable && !READ_ONCE(*torture_runnable))) { 737 cond_resched_tasks_rcu_qs(); !! 578 if (stutter_pause_test) 738 till_ns = READ_ONCE(stutter_till_abs_t !! 579 if (READ_ONCE(stutter_pause_test) == 1) 739 if (till_ns && ktime_before(ktime_get( !! 580 schedule_timeout_interruptible(1); 740 torture_hrtimeout_ns(till_ns, !! 581 else 741 ret = true; !! 582 while (READ_ONCE(stutter_pause_test)) >> 583 cond_resched(); >> 584 else >> 585 schedule_timeout_interruptible(round_jiffies_relative(HZ)); >> 586 torture_shutdown_absorb(title); 742 } 587 } 743 torture_shutdown_absorb(title); << 744 return ret; << 745 } 588 } 746 EXPORT_SYMBOL_GPL(stutter_wait); 589 EXPORT_SYMBOL_GPL(stutter_wait); 747 590 748 /* 591 /* 749 * Cause the torture test to "stutter", starti 592 * Cause the torture test to "stutter", starting and stopping all 750 * threads periodically. 593 * threads periodically. 751 */ 594 */ 752 static int torture_stutter(void *arg) 595 static int torture_stutter(void *arg) 753 { 596 { 754 ktime_t till_ns; << 755 << 756 VERBOSE_TOROUT_STRING("torture_stutter 597 VERBOSE_TOROUT_STRING("torture_stutter task started"); 757 do { 598 do { 758 if (!torture_must_stop() && st !! 599 if (!torture_must_stop()) { 759 till_ns = ktime_add_ns !! 600 if (stutter > 1) { 760 !! 601 schedule_timeout_interruptible(stutter - 1); 761 WRITE_ONCE(stutter_til !! 602 WRITE_ONCE(stutter_pause_test, 2); 762 torture_hrtimeout_jiff !! 603 } >> 604 schedule_timeout_interruptible(1); >> 605 WRITE_ONCE(stutter_pause_test, 1); 763 } 606 } 764 if (!torture_must_stop()) 607 if (!torture_must_stop()) 765 torture_hrtimeout_jiff !! 608 schedule_timeout_interruptible(stutter); >> 609 WRITE_ONCE(stutter_pause_test, 0); 766 torture_shutdown_absorb("tortu 610 torture_shutdown_absorb("torture_stutter"); 767 } while (!torture_must_stop()); 611 } while (!torture_must_stop()); 768 torture_kthread_stopping("torture_stut 612 torture_kthread_stopping("torture_stutter"); 769 return 0; 613 return 0; 770 } 614 } 771 615 772 /* 616 /* 773 * Initialize and kick off the torture_stutter 617 * Initialize and kick off the torture_stutter kthread. 774 */ 618 */ 775 int torture_stutter_init(const int s, const in !! 619 int torture_stutter_init(int s) 776 { 620 { >> 621 int ret; >> 622 777 stutter = s; 623 stutter = s; 778 stutter_gap = sgap; !! 624 ret = torture_create_kthread(torture_stutter, NULL, stutter_task); 779 return torture_create_kthread(torture_ !! 625 return ret; 780 } 626 } 781 EXPORT_SYMBOL_GPL(torture_stutter_init); 627 EXPORT_SYMBOL_GPL(torture_stutter_init); 782 628 783 /* 629 /* 784 * Cleanup after the torture_stutter kthread. 630 * Cleanup after the torture_stutter kthread. 785 */ 631 */ 786 static void torture_stutter_cleanup(void) 632 static void torture_stutter_cleanup(void) 787 { 633 { 788 if (!stutter_task) 634 if (!stutter_task) 789 return; 635 return; 790 VERBOSE_TOROUT_STRING("Stopping tortur 636 VERBOSE_TOROUT_STRING("Stopping torture_stutter task"); 791 kthread_stop(stutter_task); 637 kthread_stop(stutter_task); 792 stutter_task = NULL; 638 stutter_task = NULL; 793 } 639 } 794 640 795 static void << 796 torture_print_module_parms(void) << 797 { << 798 pr_alert("torture module --- %s: disa << 799 torture_type, disable_onoff_a << 800 } << 801 << 802 /* 641 /* 803 * Initialize torture module. Please note tha 642 * Initialize torture module. Please note that this is -not- invoked via 804 * the usual module_init() mechanism, but rath 643 * the usual module_init() mechanism, but rather by an explicit call from 805 * the client torture module. This call must 644 * the client torture module. This call must be paired with a later 806 * torture_init_end(). 645 * torture_init_end(). 807 * 646 * 808 * The runnable parameter points to a flag tha 647 * The runnable parameter points to a flag that controls whether or not 809 * the test is currently runnable. If there i 648 * the test is currently runnable. If there is no such flag, pass in NULL. 810 */ 649 */ 811 bool torture_init_begin(char *ttype, int v) !! 650 bool torture_init_begin(char *ttype, bool v, int *runnable) 812 { 651 { 813 mutex_lock(&fullstop_mutex); 652 mutex_lock(&fullstop_mutex); 814 if (torture_type != NULL) { 653 if (torture_type != NULL) { 815 pr_alert("%s: Refusing %s init !! 654 pr_alert("torture_init_begin: Refusing %s init: %s running.\n", 816 __func__, ttype, tor !! 655 ttype, torture_type); 817 pr_alert("%s: One torture test !! 656 pr_alert("torture_init_begin: One torture test at a time!\n"); 818 mutex_unlock(&fullstop_mutex); 657 mutex_unlock(&fullstop_mutex); 819 return false; 658 return false; 820 } 659 } 821 torture_type = ttype; 660 torture_type = ttype; 822 verbose = v; 661 verbose = v; >> 662 torture_runnable = runnable; 823 fullstop = FULLSTOP_DONTSTOP; 663 fullstop = FULLSTOP_DONTSTOP; 824 torture_print_module_parms(); << 825 return true; 664 return true; 826 } 665 } 827 EXPORT_SYMBOL_GPL(torture_init_begin); 666 EXPORT_SYMBOL_GPL(torture_init_begin); 828 667 829 /* 668 /* 830 * Tell the torture module that initialization 669 * Tell the torture module that initialization is complete. 831 */ 670 */ 832 void torture_init_end(void) 671 void torture_init_end(void) 833 { 672 { 834 mutex_unlock(&fullstop_mutex); 673 mutex_unlock(&fullstop_mutex); 835 register_reboot_notifier(&torture_shut 674 register_reboot_notifier(&torture_shutdown_nb); 836 } 675 } 837 EXPORT_SYMBOL_GPL(torture_init_end); 676 EXPORT_SYMBOL_GPL(torture_init_end); 838 677 839 /* 678 /* 840 * Clean up torture module. Please note that 679 * Clean up torture module. Please note that this is -not- invoked via 841 * the usual module_exit() mechanism, but rath 680 * the usual module_exit() mechanism, but rather by an explicit call from 842 * the client torture module. Returns true if 681 * the client torture module. Returns true if a race with system shutdown 843 * is detected, otherwise, all kthreads starte 682 * is detected, otherwise, all kthreads started by functions in this file 844 * will be shut down. 683 * will be shut down. 845 * 684 * 846 * This must be called before the caller start 685 * This must be called before the caller starts shutting down its own 847 * kthreads. 686 * kthreads. 848 * 687 * 849 * Both torture_cleanup_begin() and torture_cl 688 * Both torture_cleanup_begin() and torture_cleanup_end() must be paired, 850 * in order to correctly perform the cleanup. 689 * in order to correctly perform the cleanup. They are separated because 851 * threads can still need to reference the tor 690 * threads can still need to reference the torture_type type, thus nullify 852 * only after completing all other relevant ca 691 * only after completing all other relevant calls. 853 */ 692 */ 854 bool torture_cleanup_begin(void) 693 bool torture_cleanup_begin(void) 855 { 694 { 856 mutex_lock(&fullstop_mutex); 695 mutex_lock(&fullstop_mutex); 857 if (READ_ONCE(fullstop) == FULLSTOP_SH 696 if (READ_ONCE(fullstop) == FULLSTOP_SHUTDOWN) { 858 pr_warn("Concurrent rmmod and 697 pr_warn("Concurrent rmmod and shutdown illegal!\n"); 859 mutex_unlock(&fullstop_mutex); 698 mutex_unlock(&fullstop_mutex); 860 schedule_timeout_uninterruptib 699 schedule_timeout_uninterruptible(10); 861 return true; 700 return true; 862 } 701 } 863 WRITE_ONCE(fullstop, FULLSTOP_RMMOD); 702 WRITE_ONCE(fullstop, FULLSTOP_RMMOD); 864 mutex_unlock(&fullstop_mutex); 703 mutex_unlock(&fullstop_mutex); 865 torture_shutdown_cleanup(); 704 torture_shutdown_cleanup(); 866 torture_shuffle_cleanup(); 705 torture_shuffle_cleanup(); 867 torture_stutter_cleanup(); 706 torture_stutter_cleanup(); 868 torture_onoff_cleanup(); 707 torture_onoff_cleanup(); 869 return false; 708 return false; 870 } 709 } 871 EXPORT_SYMBOL_GPL(torture_cleanup_begin); 710 EXPORT_SYMBOL_GPL(torture_cleanup_begin); 872 711 873 void torture_cleanup_end(void) 712 void torture_cleanup_end(void) 874 { 713 { 875 mutex_lock(&fullstop_mutex); 714 mutex_lock(&fullstop_mutex); 876 torture_type = NULL; 715 torture_type = NULL; 877 mutex_unlock(&fullstop_mutex); 716 mutex_unlock(&fullstop_mutex); 878 } 717 } 879 EXPORT_SYMBOL_GPL(torture_cleanup_end); 718 EXPORT_SYMBOL_GPL(torture_cleanup_end); 880 719 881 /* 720 /* 882 * Is it time for the current torture test to 721 * Is it time for the current torture test to stop? 883 */ 722 */ 884 bool torture_must_stop(void) 723 bool torture_must_stop(void) 885 { 724 { 886 return torture_must_stop_irq() || kthr 725 return torture_must_stop_irq() || kthread_should_stop(); 887 } 726 } 888 EXPORT_SYMBOL_GPL(torture_must_stop); 727 EXPORT_SYMBOL_GPL(torture_must_stop); 889 728 890 /* 729 /* 891 * Is it time for the current torture test to 730 * Is it time for the current torture test to stop? This is the irq-safe 892 * version, hence no check for kthread_should_ 731 * version, hence no check for kthread_should_stop(). 893 */ 732 */ 894 bool torture_must_stop_irq(void) 733 bool torture_must_stop_irq(void) 895 { 734 { 896 return READ_ONCE(fullstop) != FULLSTOP 735 return READ_ONCE(fullstop) != FULLSTOP_DONTSTOP; 897 } 736 } 898 EXPORT_SYMBOL_GPL(torture_must_stop_irq); 737 EXPORT_SYMBOL_GPL(torture_must_stop_irq); 899 738 900 /* 739 /* 901 * Each kthread must wait for kthread_should_s 740 * Each kthread must wait for kthread_should_stop() before returning from 902 * its top-level function, otherwise segfaults 741 * its top-level function, otherwise segfaults ensue. This function 903 * prints a "stopping" message and waits for k 742 * prints a "stopping" message and waits for kthread_should_stop(), and 904 * should be called from all torture kthreads 743 * should be called from all torture kthreads immediately prior to 905 * returning. 744 * returning. 906 */ 745 */ 907 void torture_kthread_stopping(char *title) 746 void torture_kthread_stopping(char *title) 908 { 747 { 909 char buf[128]; 748 char buf[128]; 910 749 911 snprintf(buf, sizeof(buf), "%s is stop !! 750 snprintf(buf, sizeof(buf), "Stopping %s", title); 912 VERBOSE_TOROUT_STRING(buf); 751 VERBOSE_TOROUT_STRING(buf); 913 while (!kthread_should_stop()) { 752 while (!kthread_should_stop()) { 914 torture_shutdown_absorb(title) 753 torture_shutdown_absorb(title); 915 schedule_timeout_uninterruptib !! 754 schedule_timeout_uninterruptible(1); 916 } 755 } 917 } 756 } 918 EXPORT_SYMBOL_GPL(torture_kthread_stopping); 757 EXPORT_SYMBOL_GPL(torture_kthread_stopping); 919 758 920 /* 759 /* 921 * Create a generic torture kthread that is im 760 * Create a generic torture kthread that is immediately runnable. If you 922 * need the kthread to be stopped so that you 761 * need the kthread to be stopped so that you can do something to it before 923 * it starts, you will need to open-code your 762 * it starts, you will need to open-code your own. 924 */ 763 */ 925 int _torture_create_kthread(int (*fn)(void *ar 764 int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m, 926 char *f, struct ta !! 765 char *f, struct task_struct **tp) 927 { 766 { 928 int ret = 0; 767 int ret = 0; 929 768 930 VERBOSE_TOROUT_STRING(m); 769 VERBOSE_TOROUT_STRING(m); 931 *tp = kthread_create(fn, arg, "%s", s) !! 770 *tp = kthread_run(fn, arg, "%s", s); 932 if (IS_ERR(*tp)) { 771 if (IS_ERR(*tp)) { 933 ret = PTR_ERR(*tp); 772 ret = PTR_ERR(*tp); 934 TOROUT_ERRSTRING(f); !! 773 VERBOSE_TOROUT_ERRSTRING(f); 935 *tp = NULL; 774 *tp = NULL; 936 return ret; << 937 } 775 } 938 << 939 if (cbf) << 940 cbf(*tp); << 941 << 942 wake_up_process(*tp); // Process is s << 943 torture_shuffle_task_register(*tp); 776 torture_shuffle_task_register(*tp); 944 return ret; 777 return ret; 945 } 778 } 946 EXPORT_SYMBOL_GPL(_torture_create_kthread); 779 EXPORT_SYMBOL_GPL(_torture_create_kthread); 947 780 948 /* 781 /* 949 * Stop a generic kthread, emitting a message. 782 * Stop a generic kthread, emitting a message. 950 */ 783 */ 951 void _torture_stop_kthread(char *m, struct tas 784 void _torture_stop_kthread(char *m, struct task_struct **tp) 952 { 785 { 953 if (*tp == NULL) 786 if (*tp == NULL) 954 return; 787 return; 955 VERBOSE_TOROUT_STRING(m); 788 VERBOSE_TOROUT_STRING(m); 956 kthread_stop(*tp); 789 kthread_stop(*tp); 957 *tp = NULL; 790 *tp = NULL; 958 } 791 } 959 EXPORT_SYMBOL_GPL(_torture_stop_kthread); 792 EXPORT_SYMBOL_GPL(_torture_stop_kthread); 960 793
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.