diff options
Diffstat (limited to 'kernel/rcutorture.c')
| -rw-r--r-- | kernel/rcutorture.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 7c4142a79f0a..9b4a975a4b4a 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
| @@ -126,6 +126,7 @@ static atomic_t n_rcu_torture_mberror; | |||
| 126 | static atomic_t n_rcu_torture_error; | 126 | static atomic_t n_rcu_torture_error; |
| 127 | static long n_rcu_torture_timers = 0; | 127 | static long n_rcu_torture_timers = 0; |
| 128 | static struct list_head rcu_torture_removed; | 128 | static struct list_head rcu_torture_removed; |
| 129 | static cpumask_var_t shuffle_tmp_mask; | ||
| 129 | 130 | ||
| 130 | static int stutter_pause_test = 0; | 131 | static int stutter_pause_test = 0; |
| 131 | 132 | ||
| @@ -889,10 +890,9 @@ static int rcu_idle_cpu; /* Force all torture tasks off this CPU */ | |||
| 889 | */ | 890 | */ |
| 890 | static void rcu_torture_shuffle_tasks(void) | 891 | static void rcu_torture_shuffle_tasks(void) |
| 891 | { | 892 | { |
| 892 | cpumask_t tmp_mask; | ||
| 893 | int i; | 893 | int i; |
| 894 | 894 | ||
| 895 | cpus_setall(tmp_mask); | 895 | cpumask_setall(shuffle_tmp_mask); |
| 896 | get_online_cpus(); | 896 | get_online_cpus(); |
| 897 | 897 | ||
| 898 | /* No point in shuffling if there is only one online CPU (ex: UP) */ | 898 | /* No point in shuffling if there is only one online CPU (ex: UP) */ |
| @@ -902,29 +902,29 @@ static void rcu_torture_shuffle_tasks(void) | |||
| 902 | } | 902 | } |
| 903 | 903 | ||
| 904 | if (rcu_idle_cpu != -1) | 904 | if (rcu_idle_cpu != -1) |
| 905 | cpu_clear(rcu_idle_cpu, tmp_mask); | 905 | cpumask_clear_cpu(rcu_idle_cpu, shuffle_tmp_mask); |
| 906 | 906 | ||
| 907 | set_cpus_allowed_ptr(current, &tmp_mask); | 907 | set_cpus_allowed_ptr(current, shuffle_tmp_mask); |
| 908 | 908 | ||
| 909 | if (reader_tasks) { | 909 | if (reader_tasks) { |
| 910 | for (i = 0; i < nrealreaders; i++) | 910 | for (i = 0; i < nrealreaders; i++) |
| 911 | if (reader_tasks[i]) | 911 | if (reader_tasks[i]) |
| 912 | set_cpus_allowed_ptr(reader_tasks[i], | 912 | set_cpus_allowed_ptr(reader_tasks[i], |
| 913 | &tmp_mask); | 913 | shuffle_tmp_mask); |
| 914 | } | 914 | } |
| 915 | 915 | ||
| 916 | if (fakewriter_tasks) { | 916 | if (fakewriter_tasks) { |
| 917 | for (i = 0; i < nfakewriters; i++) | 917 | for (i = 0; i < nfakewriters; i++) |
| 918 | if (fakewriter_tasks[i]) | 918 | if (fakewriter_tasks[i]) |
| 919 | set_cpus_allowed_ptr(fakewriter_tasks[i], | 919 | set_cpus_allowed_ptr(fakewriter_tasks[i], |
| 920 | &tmp_mask); | 920 | shuffle_tmp_mask); |
| 921 | } | 921 | } |
| 922 | 922 | ||
| 923 | if (writer_task) | 923 | if (writer_task) |
| 924 | set_cpus_allowed_ptr(writer_task, &tmp_mask); | 924 | set_cpus_allowed_ptr(writer_task, shuffle_tmp_mask); |
| 925 | 925 | ||
| 926 | if (stats_task) | 926 | if (stats_task) |
| 927 | set_cpus_allowed_ptr(stats_task, &tmp_mask); | 927 | set_cpus_allowed_ptr(stats_task, shuffle_tmp_mask); |
| 928 | 928 | ||
| 929 | if (rcu_idle_cpu == -1) | 929 | if (rcu_idle_cpu == -1) |
| 930 | rcu_idle_cpu = num_online_cpus() - 1; | 930 | rcu_idle_cpu = num_online_cpus() - 1; |
| @@ -1012,6 +1012,7 @@ rcu_torture_cleanup(void) | |||
| 1012 | if (shuffler_task) { | 1012 | if (shuffler_task) { |
| 1013 | VERBOSE_PRINTK_STRING("Stopping rcu_torture_shuffle task"); | 1013 | VERBOSE_PRINTK_STRING("Stopping rcu_torture_shuffle task"); |
| 1014 | kthread_stop(shuffler_task); | 1014 | kthread_stop(shuffler_task); |
| 1015 | free_cpumask_var(shuffle_tmp_mask); | ||
| 1015 | } | 1016 | } |
| 1016 | shuffler_task = NULL; | 1017 | shuffler_task = NULL; |
| 1017 | 1018 | ||
| @@ -1190,10 +1191,18 @@ rcu_torture_init(void) | |||
| 1190 | } | 1191 | } |
| 1191 | if (test_no_idle_hz) { | 1192 | if (test_no_idle_hz) { |
| 1192 | rcu_idle_cpu = num_online_cpus() - 1; | 1193 | rcu_idle_cpu = num_online_cpus() - 1; |
| 1194 | |||
| 1195 | if (!alloc_cpumask_var(&shuffle_tmp_mask, GFP_KERNEL)) { | ||
| 1196 | firsterr = -ENOMEM; | ||
| 1197 | VERBOSE_PRINTK_ERRSTRING("Failed to alloc mask"); | ||
| 1198 | goto unwind; | ||
| 1199 | } | ||
| 1200 | |||
| 1193 | /* Create the shuffler thread */ | 1201 | /* Create the shuffler thread */ |
| 1194 | shuffler_task = kthread_run(rcu_torture_shuffle, NULL, | 1202 | shuffler_task = kthread_run(rcu_torture_shuffle, NULL, |
| 1195 | "rcu_torture_shuffle"); | 1203 | "rcu_torture_shuffle"); |
| 1196 | if (IS_ERR(shuffler_task)) { | 1204 | if (IS_ERR(shuffler_task)) { |
| 1205 | free_cpumask_var(shuffle_tmp_mask); | ||
| 1197 | firsterr = PTR_ERR(shuffler_task); | 1206 | firsterr = PTR_ERR(shuffler_task); |
| 1198 | VERBOSE_PRINTK_ERRSTRING("Failed to create shuffler"); | 1207 | VERBOSE_PRINTK_ERRSTRING("Failed to create shuffler"); |
| 1199 | shuffler_task = NULL; | 1208 | shuffler_task = NULL; |
