Merge tag 'vfs-5.7-merge-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux-block.git] / kernel / torture.c
index 7c13f5558b71939348ae3dca2d866b3fb83c490d..a1a41484ff6d6688bef6def0974d9df9d020b278 100644 (file)
@@ -42,6 +42,9 @@
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Paul E. McKenney <paulmck@linux.ibm.com>");
 
+static bool disable_onoff_at_boot;
+module_param(disable_onoff_at_boot, bool, 0444);
+
 static char *torture_type;
 static int verbose;
 
@@ -84,6 +87,7 @@ bool torture_offline(int cpu, long *n_offl_attempts, long *n_offl_successes,
 {
        unsigned long delta;
        int ret;
+       char *s;
        unsigned long starttime;
 
        if (!cpu_online(cpu) || !cpu_is_hotpluggable(cpu))
@@ -97,12 +101,18 @@ bool torture_offline(int cpu, long *n_offl_attempts, long *n_offl_successes,
                         torture_type, cpu);
        starttime = jiffies;
        (*n_offl_attempts)++;
-       ret = cpu_down(cpu);
+       ret = remove_cpu(cpu);
        if (ret) {
+               s = "";
+               if (!rcu_inkernel_boot_has_ended() && ret == -EBUSY) {
+                       // PCI probe frequently disables hotplug during boot.
+                       (*n_offl_attempts)--;
+                       s = " (-EBUSY forgiven during boot)";
+               }
                if (verbose)
                        pr_alert("%s" TORTURE_FLAG
-                                "torture_onoff task: offline %d failed: errno %d\n",
-                                torture_type, cpu, ret);
+                                "torture_onoff task: offline %d failed%s: errno %d\n",
+                                torture_type, cpu, s, ret);
        } else {
                if (verbose > 1)
                        pr_alert("%s" TORTURE_FLAG
@@ -137,6 +147,7 @@ bool torture_online(int cpu, long *n_onl_attempts, long *n_onl_successes,
 {
        unsigned long delta;
        int ret;
+       char *s;
        unsigned long starttime;
 
        if (cpu_online(cpu) || !cpu_is_hotpluggable(cpu))
@@ -148,12 +159,18 @@ bool torture_online(int cpu, long *n_onl_attempts, long *n_onl_successes,
                         torture_type, cpu);
        starttime = jiffies;
        (*n_onl_attempts)++;
-       ret = cpu_up(cpu);
+       ret = add_cpu(cpu);
        if (ret) {
+               s = "";
+               if (!rcu_inkernel_boot_has_ended() && ret == -EBUSY) {
+                       // PCI probe frequently disables hotplug during boot.
+                       (*n_onl_attempts)--;
+                       s = " (-EBUSY forgiven during boot)";
+               }
                if (verbose)
                        pr_alert("%s" TORTURE_FLAG
-                                "torture_onoff task: online %d failed: errno %d\n",
-                                torture_type, cpu, ret);
+                                "torture_onoff task: online %d failed%s: errno %d\n",
+                                torture_type, cpu, s, ret);
        } else {
                if (verbose > 1)
                        pr_alert("%s" TORTURE_FLAG
@@ -192,17 +209,18 @@ torture_onoff(void *arg)
        for_each_online_cpu(cpu)
                maxcpu = cpu;
        WARN_ON(maxcpu < 0);
-       if (!IS_MODULE(CONFIG_TORTURE_TEST))
+       if (!IS_MODULE(CONFIG_TORTURE_TEST)) {
                for_each_possible_cpu(cpu) {
                        if (cpu_online(cpu))
                                continue;
-                       ret = cpu_up(cpu);
+                       ret = add_cpu(cpu);
                        if (ret && verbose) {
                                pr_alert("%s" TORTURE_FLAG
                                         "%s: Initial online %d: errno %d\n",
                                         __func__, torture_type, cpu, ret);
                        }
                }
+       }
 
        if (maxcpu == 0) {
                VERBOSE_TOROUT_STRING("Only one CPU, so CPU-hotplug testing is disabled");
@@ -215,6 +233,10 @@ torture_onoff(void *arg)
                VERBOSE_TOROUT_STRING("torture_onoff end holdoff");
        }
        while (!torture_must_stop()) {
+               if (disable_onoff_at_boot && !rcu_inkernel_boot_has_ended()) {
+                       schedule_timeout_interruptible(HZ / 10);
+                       continue;
+               }
                cpu = (torture_random(&rand) >> 4) % (maxcpu + 1);
                if (!torture_offline(cpu,
                                     &n_offline_attempts, &n_offline_successes,