xref: /openbmc/linux/kernel/torture.c (revision 57a2fe90fcdaa812ac1aa6c91ba0e591c30f461a)
1 /*
2  * Common functions for in-kernel torture tests.
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  *
18  * Copyright (C) IBM Corporation, 2014
19  *
20  * Author: Paul E. McKenney <paulmck@us.ibm.com>
21  *	Based on kernel/rcu/torture.c.
22  */
23 #include <linux/types.h>
24 #include <linux/kernel.h>
25 #include <linux/init.h>
26 #include <linux/module.h>
27 #include <linux/kthread.h>
28 #include <linux/err.h>
29 #include <linux/spinlock.h>
30 #include <linux/smp.h>
31 #include <linux/interrupt.h>
32 #include <linux/sched.h>
33 #include <linux/atomic.h>
34 #include <linux/bitops.h>
35 #include <linux/completion.h>
36 #include <linux/moduleparam.h>
37 #include <linux/percpu.h>
38 #include <linux/notifier.h>
39 #include <linux/reboot.h>
40 #include <linux/freezer.h>
41 #include <linux/cpu.h>
42 #include <linux/delay.h>
43 #include <linux/stat.h>
44 #include <linux/slab.h>
45 #include <linux/trace_clock.h>
46 #include <asm/byteorder.h>
47 #include <linux/torture.h>
48 
49 MODULE_LICENSE("GPL");
50 MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com>");
51 
52 static char *torture_type;
53 static bool verbose;
54 
55 /* Mediate rmmod and system shutdown.  Concurrent rmmod & shutdown illegal! */
56 #define FULLSTOP_DONTSTOP 0	/* Normal operation. */
57 #define FULLSTOP_SHUTDOWN 1	/* System shutdown with torture running. */
58 #define FULLSTOP_RMMOD    2	/* Normal rmmod of torture. */
59 static int fullstop = FULLSTOP_RMMOD;
60 static DEFINE_MUTEX(fullstop_mutex);
61 static int *torture_runnable;
62 
63 #ifdef CONFIG_HOTPLUG_CPU
64 
65 /*
66  * Variables for online-offline handling.  Only present if CPU hotplug
67  * is enabled, otherwise does nothing.
68  */
69 
70 static struct task_struct *onoff_task;
71 static long onoff_holdoff;
72 static long onoff_interval;
73 static long n_offline_attempts;
74 static long n_offline_successes;
75 static unsigned long sum_offline;
76 static int min_offline = -1;
77 static int max_offline;
78 static long n_online_attempts;
79 static long n_online_successes;
80 static unsigned long sum_online;
81 static int min_online = -1;
82 static int max_online;
83 
84 /*
85  * Execute random CPU-hotplug operations at the interval specified
86  * by the onoff_interval.
87  */
88 static int
89 torture_onoff(void *arg)
90 {
91 	int cpu;
92 	unsigned long delta;
93 	int maxcpu = -1;
94 	DEFINE_TORTURE_RANDOM(rand);
95 	int ret;
96 	unsigned long starttime;
97 
98 	VERBOSE_TOROUT_STRING("torture_onoff task started");
99 	for_each_online_cpu(cpu)
100 		maxcpu = cpu;
101 	WARN_ON(maxcpu < 0);
102 	if (onoff_holdoff > 0) {
103 		VERBOSE_TOROUT_STRING("torture_onoff begin holdoff");
104 		schedule_timeout_interruptible(onoff_holdoff);
105 		VERBOSE_TOROUT_STRING("torture_onoff end holdoff");
106 	}
107 	while (!torture_must_stop()) {
108 		cpu = (torture_random(&rand) >> 4) % (maxcpu + 1);
109 		if (cpu_online(cpu) && cpu_is_hotpluggable(cpu)) {
110 			if (verbose)
111 				pr_alert("%s" TORTURE_FLAG
112 					 "torture_onoff task: offlining %d\n",
113 					 torture_type, cpu);
114 			starttime = jiffies;
115 			n_offline_attempts++;
116 			ret = cpu_down(cpu);
117 			if (ret) {
118 				if (verbose)
119 					pr_alert("%s" TORTURE_FLAG
120 						 "torture_onoff task: offline %d failed: errno %d\n",
121 						 torture_type, cpu, ret);
122 			} else {
123 				if (verbose)
124 					pr_alert("%s" TORTURE_FLAG
125 						 "torture_onoff task: offlined %d\n",
126 						 torture_type, cpu);
127 				n_offline_successes++;
128 				delta = jiffies - starttime;
129 				sum_offline += delta;
130 				if (min_offline < 0) {
131 					min_offline = delta;
132 					max_offline = delta;
133 				}
134 				if (min_offline > delta)
135 					min_offline = delta;
136 				if (max_offline < delta)
137 					max_offline = delta;
138 			}
139 		} else if (cpu_is_hotpluggable(cpu)) {
140 			if (verbose)
141 				pr_alert("%s" TORTURE_FLAG
142 					 "torture_onoff task: onlining %d\n",
143 					 torture_type, cpu);
144 			starttime = jiffies;
145 			n_online_attempts++;
146 			ret = cpu_up(cpu);
147 			if (ret) {
148 				if (verbose)
149 					pr_alert("%s" TORTURE_FLAG
150 						 "torture_onoff task: online %d failed: errno %d\n",
151 						 torture_type, cpu, ret);
152 			} else {
153 				if (verbose)
154 					pr_alert("%s" TORTURE_FLAG
155 						 "torture_onoff task: onlined %d\n",
156 						 torture_type, cpu);
157 				n_online_successes++;
158 				delta = jiffies - starttime;
159 				sum_online += delta;
160 				if (min_online < 0) {
161 					min_online = delta;
162 					max_online = delta;
163 				}
164 				if (min_online > delta)
165 					min_online = delta;
166 				if (max_online < delta)
167 					max_online = delta;
168 			}
169 		}
170 		schedule_timeout_interruptible(onoff_interval);
171 	}
172 	VERBOSE_TOROUT_STRING("torture_onoff task stopping");
173 	return 0;
174 }
175 
176 #endif /* #ifdef CONFIG_HOTPLUG_CPU */
177 
178 /*
179  * Initiate online-offline handling.
180  */
181 int torture_onoff_init(long ooholdoff, long oointerval)
182 {
183 #ifdef CONFIG_HOTPLUG_CPU
184 	int ret;
185 
186 	onoff_holdoff = ooholdoff;
187 	onoff_interval = oointerval;
188 	if (onoff_interval <= 0)
189 		return 0;
190 	onoff_task = kthread_run(torture_onoff, NULL, "torture_onoff");
191 	if (IS_ERR(onoff_task)) {
192 		ret = PTR_ERR(onoff_task);
193 		onoff_task = NULL;
194 		return ret;
195 	}
196 	torture_shuffle_task_register(onoff_task);
197 #endif /* #ifdef CONFIG_HOTPLUG_CPU */
198 	return 0;
199 }
200 EXPORT_SYMBOL_GPL(torture_onoff_init);
201 
202 /*
203  * Clean up after online/offline testing.
204  */
205 static void torture_onoff_cleanup(void)
206 {
207 #ifdef CONFIG_HOTPLUG_CPU
208 	if (onoff_task == NULL)
209 		return;
210 	VERBOSE_TOROUT_STRING("Stopping torture_onoff task");
211 	kthread_stop(onoff_task);
212 	onoff_task = NULL;
213 #endif /* #ifdef CONFIG_HOTPLUG_CPU */
214 }
215 EXPORT_SYMBOL_GPL(torture_onoff_cleanup);
216 
217 /*
218  * Print online/offline testing statistics.
219  */
220 char *torture_onoff_stats(char *page)
221 {
222 #ifdef CONFIG_HOTPLUG_CPU
223 	page += sprintf(page,
224 		       "onoff: %ld/%ld:%ld/%ld %d,%d:%d,%d %lu:%lu (HZ=%d) ",
225 		       n_online_successes, n_online_attempts,
226 		       n_offline_successes, n_offline_attempts,
227 		       min_online, max_online,
228 		       min_offline, max_offline,
229 		       sum_online, sum_offline, HZ);
230 #endif /* #ifdef CONFIG_HOTPLUG_CPU */
231 	return page;
232 }
233 EXPORT_SYMBOL_GPL(torture_onoff_stats);
234 
235 /*
236  * Were all the online/offline operations successful?
237  */
238 bool torture_onoff_failures(void)
239 {
240 #ifdef CONFIG_HOTPLUG_CPU
241 	return n_online_successes != n_online_attempts ||
242 	       n_offline_successes != n_offline_attempts;
243 #else /* #ifdef CONFIG_HOTPLUG_CPU */
244 	return false;
245 #endif /* #else #ifdef CONFIG_HOTPLUG_CPU */
246 }
247 EXPORT_SYMBOL_GPL(torture_onoff_failures);
248 
249 #define TORTURE_RANDOM_MULT	39916801  /* prime */
250 #define TORTURE_RANDOM_ADD	479001701 /* prime */
251 #define TORTURE_RANDOM_REFRESH	10000
252 
253 /*
254  * Crude but fast random-number generator.  Uses a linear congruential
255  * generator, with occasional help from cpu_clock().
256  */
257 unsigned long
258 torture_random(struct torture_random_state *trsp)
259 {
260 	if (--trsp->trs_count < 0) {
261 		trsp->trs_state += (unsigned long)local_clock();
262 		trsp->trs_count = TORTURE_RANDOM_REFRESH;
263 	}
264 	trsp->trs_state = trsp->trs_state * TORTURE_RANDOM_MULT +
265 		TORTURE_RANDOM_ADD;
266 	return swahw32(trsp->trs_state);
267 }
268 EXPORT_SYMBOL_GPL(torture_random);
269 
270 /*
271  * Variables for shuffling.  The idea is to ensure that each CPU stays
272  * idle for an extended period to test interactions with dyntick idle,
273  * as well as interactions with any per-CPU varibles.
274  */
275 struct shuffle_task {
276 	struct list_head st_l;
277 	struct task_struct *st_t;
278 };
279 
280 static long shuffle_interval;	/* In jiffies. */
281 static struct task_struct *shuffler_task;
282 static cpumask_var_t shuffle_tmp_mask;
283 static int shuffle_idle_cpu;	/* Force all torture tasks off this CPU */
284 static struct list_head shuffle_task_list = LIST_HEAD_INIT(shuffle_task_list);
285 static DEFINE_MUTEX(shuffle_task_mutex);
286 
287 /*
288  * Register a task to be shuffled.  If there is no memory, just splat
289  * and don't bother registering.
290  */
291 void torture_shuffle_task_register(struct task_struct *tp)
292 {
293 	struct shuffle_task *stp;
294 
295 	if (WARN_ON_ONCE(tp == NULL))
296 		return;
297 	stp = kmalloc(sizeof(*stp), GFP_KERNEL);
298 	if (WARN_ON_ONCE(stp == NULL))
299 		return;
300 	stp->st_t = tp;
301 	mutex_lock(&shuffle_task_mutex);
302 	list_add(&stp->st_l, &shuffle_task_list);
303 	mutex_unlock(&shuffle_task_mutex);
304 }
305 EXPORT_SYMBOL_GPL(torture_shuffle_task_register);
306 
307 /*
308  * Unregister all tasks, for example, at the end of the torture run.
309  */
310 static void torture_shuffle_task_unregister_all(void)
311 {
312 	struct shuffle_task *stp;
313 	struct shuffle_task *p;
314 
315 	mutex_lock(&shuffle_task_mutex);
316 	list_for_each_entry_safe(stp, p, &shuffle_task_list, st_l) {
317 		list_del(&stp->st_l);
318 		kfree(stp);
319 	}
320 	mutex_unlock(&shuffle_task_mutex);
321 }
322 
323 /* Shuffle tasks such that we allow shuffle_idle_cpu to become idle.
324  * A special case is when shuffle_idle_cpu = -1, in which case we allow
325  * the tasks to run on all CPUs.
326  */
327 static void torture_shuffle_tasks(void)
328 {
329 	struct shuffle_task *stp;
330 
331 	cpumask_setall(shuffle_tmp_mask);
332 	get_online_cpus();
333 
334 	/* No point in shuffling if there is only one online CPU (ex: UP) */
335 	if (num_online_cpus() == 1) {
336 		put_online_cpus();
337 		return;
338 	}
339 
340 	/* Advance to the next CPU.  Upon overflow, don't idle any CPUs. */
341 	shuffle_idle_cpu = cpumask_next(shuffle_idle_cpu, shuffle_tmp_mask);
342 	if (shuffle_idle_cpu >= nr_cpu_ids)
343 		shuffle_idle_cpu = -1;
344 	if (shuffle_idle_cpu != -1) {
345 		cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask);
346 		if (cpumask_empty(shuffle_tmp_mask)) {
347 			put_online_cpus();
348 			return;
349 		}
350 	}
351 
352 	mutex_lock(&shuffle_task_mutex);
353 	list_for_each_entry(stp, &shuffle_task_list, st_l)
354 		set_cpus_allowed_ptr(stp->st_t, shuffle_tmp_mask);
355 	mutex_unlock(&shuffle_task_mutex);
356 
357 	put_online_cpus();
358 }
359 
360 /* Shuffle tasks across CPUs, with the intent of allowing each CPU in the
361  * system to become idle at a time and cut off its timer ticks. This is meant
362  * to test the support for such tickless idle CPU in RCU.
363  */
364 static int torture_shuffle(void *arg)
365 {
366 	VERBOSE_TOROUT_STRING("torture_shuffle task started");
367 	do {
368 		schedule_timeout_interruptible(shuffle_interval);
369 		torture_shuffle_tasks();
370 		torture_shutdown_absorb("torture_shuffle");
371 	} while (!torture_must_stop());
372 	VERBOSE_TOROUT_STRING("torture_shuffle task stopping");
373 	return 0;
374 }
375 
376 /*
377  * Start the shuffler, with shuffint in jiffies.
378  */
379 int torture_shuffle_init(long shuffint)
380 {
381 	int ret;
382 
383 	shuffle_interval = shuffint;
384 
385 	shuffle_idle_cpu = -1;
386 
387 	if (!alloc_cpumask_var(&shuffle_tmp_mask, GFP_KERNEL)) {
388 		VERBOSE_TOROUT_ERRSTRING("Failed to alloc mask");
389 		return -ENOMEM;
390 	}
391 
392 	/* Create the shuffler thread */
393 	shuffler_task = kthread_run(torture_shuffle, NULL, "torture_shuffle");
394 	if (IS_ERR(shuffler_task)) {
395 		ret = PTR_ERR(shuffler_task);
396 		free_cpumask_var(shuffle_tmp_mask);
397 		VERBOSE_TOROUT_ERRSTRING("Failed to create shuffler");
398 		shuffler_task = NULL;
399 		return ret;
400 	}
401 	torture_shuffle_task_register(shuffler_task);
402 	return 0;
403 }
404 EXPORT_SYMBOL_GPL(torture_shuffle_init);
405 
406 /*
407  * Stop the shuffling.
408  */
409 static void torture_shuffle_cleanup(void)
410 {
411 	torture_shuffle_task_unregister_all();
412 	if (shuffler_task) {
413 		VERBOSE_TOROUT_STRING("Stopping torture_shuffle task");
414 		kthread_stop(shuffler_task);
415 		free_cpumask_var(shuffle_tmp_mask);
416 	}
417 	shuffler_task = NULL;
418 }
419 EXPORT_SYMBOL_GPL(torture_shuffle_cleanup);
420 
421 /*
422  * Absorb kthreads into a kernel function that won't return, so that
423  * they won't ever access module text or data again.
424  */
425 void torture_shutdown_absorb(const char *title)
426 {
427 	while (ACCESS_ONCE(fullstop) == FULLSTOP_SHUTDOWN) {
428 		pr_notice("torture thread %s parking due to system shutdown\n",
429 			  title);
430 		schedule_timeout_uninterruptible(MAX_SCHEDULE_TIMEOUT);
431 	}
432 }
433 EXPORT_SYMBOL_GPL(torture_shutdown_absorb);
434 
435 /*
436  * Detect and respond to a system shutdown.
437  */
438 static int torture_shutdown_notify(struct notifier_block *unused1,
439 				   unsigned long unused2, void *unused3)
440 {
441 	mutex_lock(&fullstop_mutex);
442 	if (ACCESS_ONCE(fullstop) == FULLSTOP_DONTSTOP) {
443 		VERBOSE_TOROUT_STRING("Unscheduled system shutdown detected");
444 		ACCESS_ONCE(fullstop) = FULLSTOP_SHUTDOWN;
445 	} else {
446 		pr_warn("Concurrent rmmod and shutdown illegal!\n");
447 	}
448 	mutex_unlock(&fullstop_mutex);
449 	return NOTIFY_DONE;
450 }
451 
452 static struct notifier_block torture_shutdown_nb = {
453 	.notifier_call = torture_shutdown_notify,
454 };
455 
456 /*
457  * Variables for stuttering, which means to periodically pause and
458  * restart testing in order to catch bugs that appear when load is
459  * suddenly applied to or removed from the system.
460  */
461 static struct task_struct *stutter_task;
462 static int stutter_pause_test;
463 static int stutter;
464 
465 /*
466  * Block until the stutter interval ends.  This must be called periodically
467  * by all running kthreads that need to be subject to stuttering.
468  */
469 void stutter_wait(const char *title)
470 {
471 	while (ACCESS_ONCE(stutter_pause_test) ||
472 	       (torture_runnable && !ACCESS_ONCE(*torture_runnable))) {
473 		if (stutter_pause_test)
474 			schedule_timeout_interruptible(1);
475 		else
476 			schedule_timeout_interruptible(round_jiffies_relative(HZ));
477 		torture_shutdown_absorb(title);
478 	}
479 }
480 EXPORT_SYMBOL_GPL(stutter_wait);
481 
482 /*
483  * Cause the torture test to "stutter", starting and stopping all
484  * threads periodically.
485  */
486 static int torture_stutter(void *arg)
487 {
488 	VERBOSE_TOROUT_STRING("torture_stutter task started");
489 	do {
490 		if (!torture_must_stop()) {
491 			schedule_timeout_interruptible(stutter);
492 			ACCESS_ONCE(stutter_pause_test) = 1;
493 		}
494 		if (!torture_must_stop())
495 			schedule_timeout_interruptible(stutter);
496 		ACCESS_ONCE(stutter_pause_test) = 0;
497 		torture_shutdown_absorb("torture_stutter");
498 	} while (!torture_must_stop());
499 	VERBOSE_TOROUT_STRING("torture_stutter task stopping");
500 	return 0;
501 }
502 
503 /*
504  * Initialize and kick off the torture_stutter kthread.
505  */
506 int torture_stutter_init(int s)
507 {
508 	int ret;
509 
510 	stutter = s;
511 	stutter_task = kthread_run(torture_stutter, NULL, "torture_stutter");
512 	if (IS_ERR(stutter_task)) {
513 		ret = PTR_ERR(stutter_task);
514 		VERBOSE_TOROUT_ERRSTRING("Failed to create stutter");
515 		stutter_task = NULL;
516 		return ret;
517 	}
518 	torture_shuffle_task_register(stutter_task);
519 	return 0;
520 }
521 EXPORT_SYMBOL_GPL(torture_stutter_init);
522 
523 /*
524  * Cleanup after the torture_stutter kthread.
525  */
526 void torture_stutter_cleanup(void)
527 {
528 	if (!stutter_task)
529 		return;
530 	VERBOSE_TOROUT_STRING("Stopping torture_stutter task");
531 	kthread_stop(stutter_task);
532 	stutter_task = NULL;
533 }
534 EXPORT_SYMBOL_GPL(torture_stutter_cleanup);
535 
536 /*
537  * Initialize torture module.  Please note that this is -not- invoked via
538  * the usual module_init() mechanism, but rather by an explicit call from
539  * the client torture module.  This call must be paired with a later
540  * torture_init_end().
541  *
542  * The runnable parameter points to a flag that controls whether or not
543  * the test is currently runnable.  If there is no such flag, pass in NULL.
544  */
545 void __init torture_init_begin(char *ttype, bool v, int *runnable)
546 {
547 	mutex_lock(&fullstop_mutex);
548 	torture_type = ttype;
549 	verbose = v;
550 	torture_runnable = runnable;
551 	fullstop = FULLSTOP_DONTSTOP;
552 
553 }
554 EXPORT_SYMBOL_GPL(torture_init_begin);
555 
556 /*
557  * Tell the torture module that initialization is complete.
558  */
559 void __init torture_init_end(void)
560 {
561 	mutex_unlock(&fullstop_mutex);
562 	register_reboot_notifier(&torture_shutdown_nb);
563 }
564 EXPORT_SYMBOL_GPL(torture_init_end);
565 
566 /*
567  * Clean up torture module.  Please note that this is -not- invoked via
568  * the usual module_exit() mechanism, but rather by an explicit call from
569  * the client torture module.  Returns true if a race with system shutdown
570  * is detected.
571  *
572  * This must be called before the caller starts shutting down its own
573  * kthreads.
574  */
575 bool torture_cleanup(void)
576 {
577 	mutex_lock(&fullstop_mutex);
578 	if (ACCESS_ONCE(fullstop) == FULLSTOP_SHUTDOWN) {
579 		pr_warn("Concurrent rmmod and shutdown illegal!\n");
580 		mutex_unlock(&fullstop_mutex);
581 		schedule_timeout_uninterruptible(10);
582 		return true;
583 	}
584 	ACCESS_ONCE(fullstop) = FULLSTOP_RMMOD;
585 	mutex_unlock(&fullstop_mutex);
586 	unregister_reboot_notifier(&torture_shutdown_nb);
587 	torture_shuffle_cleanup();
588 	torture_onoff_cleanup();
589 	return false;
590 }
591 EXPORT_SYMBOL_GPL(torture_cleanup);
592 
593 /*
594  * Is it time for the current torture test to stop?
595  */
596 bool torture_must_stop(void)
597 {
598 	return torture_must_stop_irq() || kthread_should_stop();
599 }
600 EXPORT_SYMBOL_GPL(torture_must_stop);
601 
602 /*
603  * Is it time for the current torture test to stop?  This is the irq-safe
604  * version, hence no check for kthread_should_stop().
605  */
606 bool torture_must_stop_irq(void)
607 {
608 	return ACCESS_ONCE(fullstop) != FULLSTOP_DONTSTOP;
609 }
610 EXPORT_SYMBOL_GPL(torture_must_stop_irq);
611