Merge tag 'smp-core-2020-03-30' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-rpi.git] / kernel / torture.c
index a479689..a1a4148 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))
@@ -99,10 +103,16 @@ bool torture_offline(int cpu, long *n_offl_attempts, long *n_offl_successes,
        (*n_offl_attempts)++;
        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))
@@ -150,10 +161,16 @@ bool torture_online(int cpu, long *n_onl_attempts, long *n_onl_successes,
        (*n_onl_attempts)++;
        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
@@ -216,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,