diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/locking/locktorture.c | 10 | ||||
-rw-r--r-- | kernel/rcu/rcutorture.c | 217 | ||||
-rw-r--r-- | kernel/rcu/tiny_plugin.h | 8 | ||||
-rw-r--r-- | kernel/rcu/tree.c | 309 | ||||
-rw-r--r-- | kernel/rcu/tree.h | 11 | ||||
-rw-r--r-- | kernel/rcu/tree_plugin.h | 136 | ||||
-rw-r--r-- | kernel/rcu/update.c | 30 | ||||
-rw-r--r-- | kernel/sched/core.c | 7 | ||||
-rw-r--r-- | kernel/softirq.c | 4 | ||||
-rw-r--r-- | kernel/torture.c | 40 |
10 files changed, 506 insertions, 266 deletions
diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c index f26b1a18e34e..dbafeac18e4d 100644 --- a/kernel/locking/locktorture.c +++ b/kernel/locking/locktorture.c | |||
@@ -82,14 +82,14 @@ struct lock_writer_stress_stats { | |||
82 | }; | 82 | }; |
83 | static struct lock_writer_stress_stats *lwsa; | 83 | static struct lock_writer_stress_stats *lwsa; |
84 | 84 | ||
85 | #if defined(MODULE) || defined(CONFIG_LOCK_TORTURE_TEST_RUNNABLE) | 85 | #if defined(MODULE) |
86 | #define LOCKTORTURE_RUNNABLE_INIT 1 | 86 | #define LOCKTORTURE_RUNNABLE_INIT 1 |
87 | #else | 87 | #else |
88 | #define LOCKTORTURE_RUNNABLE_INIT 0 | 88 | #define LOCKTORTURE_RUNNABLE_INIT 0 |
89 | #endif | 89 | #endif |
90 | int locktorture_runnable = LOCKTORTURE_RUNNABLE_INIT; | 90 | int locktorture_runnable = LOCKTORTURE_RUNNABLE_INIT; |
91 | module_param(locktorture_runnable, int, 0444); | 91 | module_param(locktorture_runnable, int, 0444); |
92 | MODULE_PARM_DESC(locktorture_runnable, "Start locktorture at boot"); | 92 | MODULE_PARM_DESC(locktorture_runnable, "Start locktorture at module init"); |
93 | 93 | ||
94 | /* Forward reference. */ | 94 | /* Forward reference. */ |
95 | static void lock_torture_cleanup(void); | 95 | static void lock_torture_cleanup(void); |
@@ -219,7 +219,8 @@ static int lock_torture_writer(void *arg) | |||
219 | set_user_nice(current, 19); | 219 | set_user_nice(current, 19); |
220 | 220 | ||
221 | do { | 221 | do { |
222 | schedule_timeout_uninterruptible(1); | 222 | if ((torture_random(&rand) & 0xfffff) == 0) |
223 | schedule_timeout_uninterruptible(1); | ||
223 | cur_ops->writelock(); | 224 | cur_ops->writelock(); |
224 | if (WARN_ON_ONCE(lock_is_write_held)) | 225 | if (WARN_ON_ONCE(lock_is_write_held)) |
225 | lwsp->n_write_lock_fail++; | 226 | lwsp->n_write_lock_fail++; |
@@ -354,7 +355,8 @@ static int __init lock_torture_init(void) | |||
354 | &lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops, | 355 | &lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops, |
355 | }; | 356 | }; |
356 | 357 | ||
357 | torture_init_begin(torture_type, verbose, &locktorture_runnable); | 358 | if (!torture_init_begin(torture_type, verbose, &locktorture_runnable)) |
359 | return -EBUSY; | ||
358 | 360 | ||
359 | /* Process args and tell the world that the torturer is on the job. */ | 361 | /* Process args and tell the world that the torturer is on the job. */ |
360 | for (i = 0; i < ARRAY_SIZE(torture_ops); i++) { | 362 | for (i = 0; i < ARRAY_SIZE(torture_ops); i++) { |
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c index bd30bc61bc05..7fa34f86e5ba 100644 --- a/kernel/rcu/rcutorture.c +++ b/kernel/rcu/rcutorture.c | |||
@@ -58,9 +58,11 @@ torture_param(int, fqs_duration, 0, | |||
58 | "Duration of fqs bursts (us), 0 to disable"); | 58 | "Duration of fqs bursts (us), 0 to disable"); |
59 | torture_param(int, fqs_holdoff, 0, "Holdoff time within fqs bursts (us)"); | 59 | torture_param(int, fqs_holdoff, 0, "Holdoff time within fqs bursts (us)"); |
60 | torture_param(int, fqs_stutter, 3, "Wait time between fqs bursts (s)"); | 60 | torture_param(int, fqs_stutter, 3, "Wait time between fqs bursts (s)"); |
61 | torture_param(bool, gp_cond, false, "Use conditional/async GP wait primitives"); | ||
61 | torture_param(bool, gp_exp, false, "Use expedited GP wait primitives"); | 62 | torture_param(bool, gp_exp, false, "Use expedited GP wait primitives"); |
62 | torture_param(bool, gp_normal, false, | 63 | torture_param(bool, gp_normal, false, |
63 | "Use normal (non-expedited) GP wait primitives"); | 64 | "Use normal (non-expedited) GP wait primitives"); |
65 | torture_param(bool, gp_sync, false, "Use synchronous GP wait primitives"); | ||
64 | torture_param(int, irqreader, 1, "Allow RCU readers from irq handlers"); | 66 | torture_param(int, irqreader, 1, "Allow RCU readers from irq handlers"); |
65 | torture_param(int, n_barrier_cbs, 0, | 67 | torture_param(int, n_barrier_cbs, 0, |
66 | "# of callbacks/kthreads for barrier testing"); | 68 | "# of callbacks/kthreads for barrier testing"); |
@@ -138,6 +140,18 @@ static long n_barrier_attempts; | |||
138 | static long n_barrier_successes; | 140 | static long n_barrier_successes; |
139 | static struct list_head rcu_torture_removed; | 141 | static struct list_head rcu_torture_removed; |
140 | 142 | ||
143 | static int rcu_torture_writer_state; | ||
144 | #define RTWS_FIXED_DELAY 0 | ||
145 | #define RTWS_DELAY 1 | ||
146 | #define RTWS_REPLACE 2 | ||
147 | #define RTWS_DEF_FREE 3 | ||
148 | #define RTWS_EXP_SYNC 4 | ||
149 | #define RTWS_COND_GET 5 | ||
150 | #define RTWS_COND_SYNC 6 | ||
151 | #define RTWS_SYNC 7 | ||
152 | #define RTWS_STUTTER 8 | ||
153 | #define RTWS_STOPPING 9 | ||
154 | |||
141 | #if defined(MODULE) || defined(CONFIG_RCU_TORTURE_TEST_RUNNABLE) | 155 | #if defined(MODULE) || defined(CONFIG_RCU_TORTURE_TEST_RUNNABLE) |
142 | #define RCUTORTURE_RUNNABLE_INIT 1 | 156 | #define RCUTORTURE_RUNNABLE_INIT 1 |
143 | #else | 157 | #else |
@@ -214,6 +228,7 @@ rcu_torture_free(struct rcu_torture *p) | |||
214 | */ | 228 | */ |
215 | 229 | ||
216 | struct rcu_torture_ops { | 230 | struct rcu_torture_ops { |
231 | int ttype; | ||
217 | void (*init)(void); | 232 | void (*init)(void); |
218 | int (*readlock)(void); | 233 | int (*readlock)(void); |
219 | void (*read_delay)(struct torture_random_state *rrsp); | 234 | void (*read_delay)(struct torture_random_state *rrsp); |
@@ -222,6 +237,8 @@ struct rcu_torture_ops { | |||
222 | void (*deferred_free)(struct rcu_torture *p); | 237 | void (*deferred_free)(struct rcu_torture *p); |
223 | void (*sync)(void); | 238 | void (*sync)(void); |
224 | void (*exp_sync)(void); | 239 | void (*exp_sync)(void); |
240 | unsigned long (*get_state)(void); | ||
241 | void (*cond_sync)(unsigned long oldstate); | ||
225 | void (*call)(struct rcu_head *head, void (*func)(struct rcu_head *rcu)); | 242 | void (*call)(struct rcu_head *head, void (*func)(struct rcu_head *rcu)); |
226 | void (*cb_barrier)(void); | 243 | void (*cb_barrier)(void); |
227 | void (*fqs)(void); | 244 | void (*fqs)(void); |
@@ -273,10 +290,48 @@ static int rcu_torture_completed(void) | |||
273 | return rcu_batches_completed(); | 290 | return rcu_batches_completed(); |
274 | } | 291 | } |
275 | 292 | ||
293 | /* | ||
294 | * Update callback in the pipe. This should be invoked after a grace period. | ||
295 | */ | ||
296 | static bool | ||
297 | rcu_torture_pipe_update_one(struct rcu_torture *rp) | ||
298 | { | ||
299 | int i; | ||
300 | |||
301 | i = rp->rtort_pipe_count; | ||
302 | if (i > RCU_TORTURE_PIPE_LEN) | ||
303 | i = RCU_TORTURE_PIPE_LEN; | ||
304 | atomic_inc(&rcu_torture_wcount[i]); | ||
305 | if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) { | ||
306 | rp->rtort_mbtest = 0; | ||
307 | return true; | ||
308 | } | ||
309 | return false; | ||
310 | } | ||
311 | |||
312 | /* | ||
313 | * Update all callbacks in the pipe. Suitable for synchronous grace-period | ||
314 | * primitives. | ||
315 | */ | ||
316 | static void | ||
317 | rcu_torture_pipe_update(struct rcu_torture *old_rp) | ||
318 | { | ||
319 | struct rcu_torture *rp; | ||
320 | struct rcu_torture *rp1; | ||
321 | |||
322 | if (old_rp) | ||
323 | list_add(&old_rp->rtort_free, &rcu_torture_removed); | ||
324 | list_for_each_entry_safe(rp, rp1, &rcu_torture_removed, rtort_free) { | ||
325 | if (rcu_torture_pipe_update_one(rp)) { | ||
326 | list_del(&rp->rtort_free); | ||
327 | rcu_torture_free(rp); | ||
328 | } | ||
329 | } | ||
330 | } | ||
331 | |||
276 | static void | 332 | static void |
277 | rcu_torture_cb(struct rcu_head *p) | 333 | rcu_torture_cb(struct rcu_head *p) |
278 | { | 334 | { |
279 | int i; | ||
280 | struct rcu_torture *rp = container_of(p, struct rcu_torture, rtort_rcu); | 335 | struct rcu_torture *rp = container_of(p, struct rcu_torture, rtort_rcu); |
281 | 336 | ||
282 | if (torture_must_stop_irq()) { | 337 | if (torture_must_stop_irq()) { |
@@ -284,16 +339,10 @@ rcu_torture_cb(struct rcu_head *p) | |||
284 | /* The next initialization will pick up the pieces. */ | 339 | /* The next initialization will pick up the pieces. */ |
285 | return; | 340 | return; |
286 | } | 341 | } |
287 | i = rp->rtort_pipe_count; | 342 | if (rcu_torture_pipe_update_one(rp)) |
288 | if (i > RCU_TORTURE_PIPE_LEN) | ||
289 | i = RCU_TORTURE_PIPE_LEN; | ||
290 | atomic_inc(&rcu_torture_wcount[i]); | ||
291 | if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) { | ||
292 | rp->rtort_mbtest = 0; | ||
293 | rcu_torture_free(rp); | 343 | rcu_torture_free(rp); |
294 | } else { | 344 | else |
295 | cur_ops->deferred_free(rp); | 345 | cur_ops->deferred_free(rp); |
296 | } | ||
297 | } | 346 | } |
298 | 347 | ||
299 | static int rcu_no_completed(void) | 348 | static int rcu_no_completed(void) |
@@ -312,6 +361,7 @@ static void rcu_sync_torture_init(void) | |||
312 | } | 361 | } |
313 | 362 | ||
314 | static struct rcu_torture_ops rcu_ops = { | 363 | static struct rcu_torture_ops rcu_ops = { |
364 | .ttype = RCU_FLAVOR, | ||
315 | .init = rcu_sync_torture_init, | 365 | .init = rcu_sync_torture_init, |
316 | .readlock = rcu_torture_read_lock, | 366 | .readlock = rcu_torture_read_lock, |
317 | .read_delay = rcu_read_delay, | 367 | .read_delay = rcu_read_delay, |
@@ -320,6 +370,8 @@ static struct rcu_torture_ops rcu_ops = { | |||
320 | .deferred_free = rcu_torture_deferred_free, | 370 | .deferred_free = rcu_torture_deferred_free, |
321 | .sync = synchronize_rcu, | 371 | .sync = synchronize_rcu, |
322 | .exp_sync = synchronize_rcu_expedited, | 372 | .exp_sync = synchronize_rcu_expedited, |
373 | .get_state = get_state_synchronize_rcu, | ||
374 | .cond_sync = cond_synchronize_rcu, | ||
323 | .call = call_rcu, | 375 | .call = call_rcu, |
324 | .cb_barrier = rcu_barrier, | 376 | .cb_barrier = rcu_barrier, |
325 | .fqs = rcu_force_quiescent_state, | 377 | .fqs = rcu_force_quiescent_state, |
@@ -355,6 +407,7 @@ static void rcu_bh_torture_deferred_free(struct rcu_torture *p) | |||
355 | } | 407 | } |
356 | 408 | ||
357 | static struct rcu_torture_ops rcu_bh_ops = { | 409 | static struct rcu_torture_ops rcu_bh_ops = { |
410 | .ttype = RCU_BH_FLAVOR, | ||
358 | .init = rcu_sync_torture_init, | 411 | .init = rcu_sync_torture_init, |
359 | .readlock = rcu_bh_torture_read_lock, | 412 | .readlock = rcu_bh_torture_read_lock, |
360 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 413 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ |
@@ -397,6 +450,7 @@ call_rcu_busted(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
397 | } | 450 | } |
398 | 451 | ||
399 | static struct rcu_torture_ops rcu_busted_ops = { | 452 | static struct rcu_torture_ops rcu_busted_ops = { |
453 | .ttype = INVALID_RCU_FLAVOR, | ||
400 | .init = rcu_sync_torture_init, | 454 | .init = rcu_sync_torture_init, |
401 | .readlock = rcu_torture_read_lock, | 455 | .readlock = rcu_torture_read_lock, |
402 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 456 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ |
@@ -479,9 +533,11 @@ static void srcu_torture_stats(char *page) | |||
479 | page += sprintf(page, "%s%s per-CPU(idx=%d):", | 533 | page += sprintf(page, "%s%s per-CPU(idx=%d):", |
480 | torture_type, TORTURE_FLAG, idx); | 534 | torture_type, TORTURE_FLAG, idx); |
481 | for_each_possible_cpu(cpu) { | 535 | for_each_possible_cpu(cpu) { |
482 | page += sprintf(page, " %d(%lu,%lu)", cpu, | 536 | long c0, c1; |
483 | per_cpu_ptr(srcu_ctl.per_cpu_ref, cpu)->c[!idx], | 537 | |
484 | per_cpu_ptr(srcu_ctl.per_cpu_ref, cpu)->c[idx]); | 538 | c0 = (long)per_cpu_ptr(srcu_ctl.per_cpu_ref, cpu)->c[!idx]; |
539 | c1 = (long)per_cpu_ptr(srcu_ctl.per_cpu_ref, cpu)->c[idx]; | ||
540 | page += sprintf(page, " %d(%ld,%ld)", cpu, c0, c1); | ||
485 | } | 541 | } |
486 | sprintf(page, "\n"); | 542 | sprintf(page, "\n"); |
487 | } | 543 | } |
@@ -492,6 +548,7 @@ static void srcu_torture_synchronize_expedited(void) | |||
492 | } | 548 | } |
493 | 549 | ||
494 | static struct rcu_torture_ops srcu_ops = { | 550 | static struct rcu_torture_ops srcu_ops = { |
551 | .ttype = SRCU_FLAVOR, | ||
495 | .init = rcu_sync_torture_init, | 552 | .init = rcu_sync_torture_init, |
496 | .readlock = srcu_torture_read_lock, | 553 | .readlock = srcu_torture_read_lock, |
497 | .read_delay = srcu_read_delay, | 554 | .read_delay = srcu_read_delay, |
@@ -527,6 +584,7 @@ static void rcu_sched_torture_deferred_free(struct rcu_torture *p) | |||
527 | } | 584 | } |
528 | 585 | ||
529 | static struct rcu_torture_ops sched_ops = { | 586 | static struct rcu_torture_ops sched_ops = { |
587 | .ttype = RCU_SCHED_FLAVOR, | ||
530 | .init = rcu_sync_torture_init, | 588 | .init = rcu_sync_torture_init, |
531 | .readlock = sched_torture_read_lock, | 589 | .readlock = sched_torture_read_lock, |
532 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 590 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ |
@@ -688,23 +746,59 @@ rcu_torture_fqs(void *arg) | |||
688 | static int | 746 | static int |
689 | rcu_torture_writer(void *arg) | 747 | rcu_torture_writer(void *arg) |
690 | { | 748 | { |
691 | bool exp; | 749 | unsigned long gp_snap; |
750 | bool gp_cond1 = gp_cond, gp_exp1 = gp_exp, gp_normal1 = gp_normal; | ||
751 | bool gp_sync1 = gp_sync; | ||
692 | int i; | 752 | int i; |
693 | struct rcu_torture *rp; | 753 | struct rcu_torture *rp; |
694 | struct rcu_torture *rp1; | ||
695 | struct rcu_torture *old_rp; | 754 | struct rcu_torture *old_rp; |
696 | static DEFINE_TORTURE_RANDOM(rand); | 755 | static DEFINE_TORTURE_RANDOM(rand); |
756 | int synctype[] = { RTWS_DEF_FREE, RTWS_EXP_SYNC, | ||
757 | RTWS_COND_GET, RTWS_SYNC }; | ||
758 | int nsynctypes = 0; | ||
697 | 759 | ||
698 | VERBOSE_TOROUT_STRING("rcu_torture_writer task started"); | 760 | VERBOSE_TOROUT_STRING("rcu_torture_writer task started"); |
699 | set_user_nice(current, MAX_NICE); | 761 | |
762 | /* Initialize synctype[] array. If none set, take default. */ | ||
763 | if (!gp_cond1 && !gp_exp1 && !gp_normal1 && !gp_sync) | ||
764 | gp_cond1 = gp_exp1 = gp_normal1 = gp_sync1 = true; | ||
765 | if (gp_cond1 && cur_ops->get_state && cur_ops->cond_sync) | ||
766 | synctype[nsynctypes++] = RTWS_COND_GET; | ||
767 | else if (gp_cond && (!cur_ops->get_state || !cur_ops->cond_sync)) | ||
768 | pr_alert("rcu_torture_writer: gp_cond without primitives.\n"); | ||
769 | if (gp_exp1 && cur_ops->exp_sync) | ||
770 | synctype[nsynctypes++] = RTWS_EXP_SYNC; | ||
771 | else if (gp_exp && !cur_ops->exp_sync) | ||
772 | pr_alert("rcu_torture_writer: gp_exp without primitives.\n"); | ||
773 | if (gp_normal1 && cur_ops->deferred_free) | ||
774 | synctype[nsynctypes++] = RTWS_DEF_FREE; | ||
775 | else if (gp_normal && !cur_ops->deferred_free) | ||
776 | pr_alert("rcu_torture_writer: gp_normal without primitives.\n"); | ||
777 | if (gp_sync1 && cur_ops->sync) | ||
778 | synctype[nsynctypes++] = RTWS_SYNC; | ||
779 | else if (gp_sync && !cur_ops->sync) | ||
780 | pr_alert("rcu_torture_writer: gp_sync without primitives.\n"); | ||
781 | if (WARN_ONCE(nsynctypes == 0, | ||
782 | "rcu_torture_writer: No update-side primitives.\n")) { | ||
783 | /* | ||
784 | * No updates primitives, so don't try updating. | ||
785 | * The resulting test won't be testing much, hence the | ||
786 | * above WARN_ONCE(). | ||
787 | */ | ||
788 | rcu_torture_writer_state = RTWS_STOPPING; | ||
789 | torture_kthread_stopping("rcu_torture_writer"); | ||
790 | } | ||
700 | 791 | ||
701 | do { | 792 | do { |
793 | rcu_torture_writer_state = RTWS_FIXED_DELAY; | ||
702 | schedule_timeout_uninterruptible(1); | 794 | schedule_timeout_uninterruptible(1); |
703 | rp = rcu_torture_alloc(); | 795 | rp = rcu_torture_alloc(); |
704 | if (rp == NULL) | 796 | if (rp == NULL) |
705 | continue; | 797 | continue; |
706 | rp->rtort_pipe_count = 0; | 798 | rp->rtort_pipe_count = 0; |
799 | rcu_torture_writer_state = RTWS_DELAY; | ||
707 | udelay(torture_random(&rand) & 0x3ff); | 800 | udelay(torture_random(&rand) & 0x3ff); |
801 | rcu_torture_writer_state = RTWS_REPLACE; | ||
708 | old_rp = rcu_dereference_check(rcu_torture_current, | 802 | old_rp = rcu_dereference_check(rcu_torture_current, |
709 | current == writer_task); | 803 | current == writer_task); |
710 | rp->rtort_mbtest = 1; | 804 | rp->rtort_mbtest = 1; |
@@ -716,35 +810,42 @@ rcu_torture_writer(void *arg) | |||
716 | i = RCU_TORTURE_PIPE_LEN; | 810 | i = RCU_TORTURE_PIPE_LEN; |
717 | atomic_inc(&rcu_torture_wcount[i]); | 811 | atomic_inc(&rcu_torture_wcount[i]); |
718 | old_rp->rtort_pipe_count++; | 812 | old_rp->rtort_pipe_count++; |
719 | if (gp_normal == gp_exp) | 813 | switch (synctype[torture_random(&rand) % nsynctypes]) { |
720 | exp = !!(torture_random(&rand) & 0x80); | 814 | case RTWS_DEF_FREE: |
721 | else | 815 | rcu_torture_writer_state = RTWS_DEF_FREE; |
722 | exp = gp_exp; | ||
723 | if (!exp) { | ||
724 | cur_ops->deferred_free(old_rp); | 816 | cur_ops->deferred_free(old_rp); |
725 | } else { | 817 | break; |
818 | case RTWS_EXP_SYNC: | ||
819 | rcu_torture_writer_state = RTWS_EXP_SYNC; | ||
726 | cur_ops->exp_sync(); | 820 | cur_ops->exp_sync(); |
727 | list_add(&old_rp->rtort_free, | 821 | rcu_torture_pipe_update(old_rp); |
728 | &rcu_torture_removed); | 822 | break; |
729 | list_for_each_entry_safe(rp, rp1, | 823 | case RTWS_COND_GET: |
730 | &rcu_torture_removed, | 824 | rcu_torture_writer_state = RTWS_COND_GET; |
731 | rtort_free) { | 825 | gp_snap = cur_ops->get_state(); |
732 | i = rp->rtort_pipe_count; | 826 | i = torture_random(&rand) % 16; |
733 | if (i > RCU_TORTURE_PIPE_LEN) | 827 | if (i != 0) |
734 | i = RCU_TORTURE_PIPE_LEN; | 828 | schedule_timeout_interruptible(i); |
735 | atomic_inc(&rcu_torture_wcount[i]); | 829 | udelay(torture_random(&rand) % 1000); |
736 | if (++rp->rtort_pipe_count >= | 830 | rcu_torture_writer_state = RTWS_COND_SYNC; |
737 | RCU_TORTURE_PIPE_LEN) { | 831 | cur_ops->cond_sync(gp_snap); |
738 | rp->rtort_mbtest = 0; | 832 | rcu_torture_pipe_update(old_rp); |
739 | list_del(&rp->rtort_free); | 833 | break; |
740 | rcu_torture_free(rp); | 834 | case RTWS_SYNC: |
741 | } | 835 | rcu_torture_writer_state = RTWS_SYNC; |
742 | } | 836 | cur_ops->sync(); |
837 | rcu_torture_pipe_update(old_rp); | ||
838 | break; | ||
839 | default: | ||
840 | WARN_ON_ONCE(1); | ||
841 | break; | ||
743 | } | 842 | } |
744 | } | 843 | } |
745 | rcutorture_record_progress(++rcu_torture_current_version); | 844 | rcutorture_record_progress(++rcu_torture_current_version); |
845 | rcu_torture_writer_state = RTWS_STUTTER; | ||
746 | stutter_wait("rcu_torture_writer"); | 846 | stutter_wait("rcu_torture_writer"); |
747 | } while (!torture_must_stop()); | 847 | } while (!torture_must_stop()); |
848 | rcu_torture_writer_state = RTWS_STOPPING; | ||
748 | torture_kthread_stopping("rcu_torture_writer"); | 849 | torture_kthread_stopping("rcu_torture_writer"); |
749 | return 0; | 850 | return 0; |
750 | } | 851 | } |
@@ -784,7 +885,7 @@ rcu_torture_fakewriter(void *arg) | |||
784 | return 0; | 885 | return 0; |
785 | } | 886 | } |
786 | 887 | ||
787 | void rcutorture_trace_dump(void) | 888 | static void rcutorture_trace_dump(void) |
788 | { | 889 | { |
789 | static atomic_t beenhere = ATOMIC_INIT(0); | 890 | static atomic_t beenhere = ATOMIC_INIT(0); |
790 | 891 | ||
@@ -918,11 +1019,13 @@ rcu_torture_reader(void *arg) | |||
918 | __this_cpu_inc(rcu_torture_batch[completed]); | 1019 | __this_cpu_inc(rcu_torture_batch[completed]); |
919 | preempt_enable(); | 1020 | preempt_enable(); |
920 | cur_ops->readunlock(idx); | 1021 | cur_ops->readunlock(idx); |
921 | schedule(); | 1022 | cond_resched(); |
922 | stutter_wait("rcu_torture_reader"); | 1023 | stutter_wait("rcu_torture_reader"); |
923 | } while (!torture_must_stop()); | 1024 | } while (!torture_must_stop()); |
924 | if (irqreader && cur_ops->irq_capable) | 1025 | if (irqreader && cur_ops->irq_capable) { |
925 | del_timer_sync(&t); | 1026 | del_timer_sync(&t); |
1027 | destroy_timer_on_stack(&t); | ||
1028 | } | ||
926 | torture_kthread_stopping("rcu_torture_reader"); | 1029 | torture_kthread_stopping("rcu_torture_reader"); |
927 | return 0; | 1030 | return 0; |
928 | } | 1031 | } |
@@ -937,6 +1040,7 @@ rcu_torture_printk(char *page) | |||
937 | int i; | 1040 | int i; |
938 | long pipesummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 }; | 1041 | long pipesummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 }; |
939 | long batchsummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 }; | 1042 | long batchsummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 }; |
1043 | static unsigned long rtcv_snap = ULONG_MAX; | ||
940 | 1044 | ||
941 | for_each_possible_cpu(cpu) { | 1045 | for_each_possible_cpu(cpu) { |
942 | for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) { | 1046 | for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) { |
@@ -997,6 +1101,22 @@ rcu_torture_printk(char *page) | |||
997 | page += sprintf(page, "\n"); | 1101 | page += sprintf(page, "\n"); |
998 | if (cur_ops->stats) | 1102 | if (cur_ops->stats) |
999 | cur_ops->stats(page); | 1103 | cur_ops->stats(page); |
1104 | if (rtcv_snap == rcu_torture_current_version && | ||
1105 | rcu_torture_current != NULL) { | ||
1106 | int __maybe_unused flags; | ||
1107 | unsigned long __maybe_unused gpnum; | ||
1108 | unsigned long __maybe_unused completed; | ||
1109 | |||
1110 | rcutorture_get_gp_data(cur_ops->ttype, | ||
1111 | &flags, &gpnum, &completed); | ||
1112 | page += sprintf(page, | ||
1113 | "??? Writer stall state %d g%lu c%lu f%#x\n", | ||
1114 | rcu_torture_writer_state, | ||
1115 | gpnum, completed, flags); | ||
1116 | show_rcu_gp_kthreads(); | ||
1117 | rcutorture_trace_dump(); | ||
1118 | } | ||
1119 | rtcv_snap = rcu_torture_current_version; | ||
1000 | } | 1120 | } |
1001 | 1121 | ||
1002 | /* | 1122 | /* |
@@ -1146,7 +1266,7 @@ static int __init rcu_torture_stall_init(void) | |||
1146 | } | 1266 | } |
1147 | 1267 | ||
1148 | /* Callback function for RCU barrier testing. */ | 1268 | /* Callback function for RCU barrier testing. */ |
1149 | void rcu_torture_barrier_cbf(struct rcu_head *rcu) | 1269 | static void rcu_torture_barrier_cbf(struct rcu_head *rcu) |
1150 | { | 1270 | { |
1151 | atomic_inc(&barrier_cbs_invoked); | 1271 | atomic_inc(&barrier_cbs_invoked); |
1152 | } | 1272 | } |
@@ -1416,7 +1536,8 @@ rcu_torture_init(void) | |||
1416 | &rcu_ops, &rcu_bh_ops, &rcu_busted_ops, &srcu_ops, &sched_ops, | 1536 | &rcu_ops, &rcu_bh_ops, &rcu_busted_ops, &srcu_ops, &sched_ops, |
1417 | }; | 1537 | }; |
1418 | 1538 | ||
1419 | torture_init_begin(torture_type, verbose, &rcutorture_runnable); | 1539 | if (!torture_init_begin(torture_type, verbose, &rcutorture_runnable)) |
1540 | return -EBUSY; | ||
1420 | 1541 | ||
1421 | /* Process args and tell the world that the torturer is on the job. */ | 1542 | /* Process args and tell the world that the torturer is on the job. */ |
1422 | for (i = 0; i < ARRAY_SIZE(torture_ops); i++) { | 1543 | for (i = 0; i < ARRAY_SIZE(torture_ops); i++) { |
@@ -1441,10 +1562,13 @@ rcu_torture_init(void) | |||
1441 | if (cur_ops->init) | 1562 | if (cur_ops->init) |
1442 | cur_ops->init(); /* no "goto unwind" prior to this point!!! */ | 1563 | cur_ops->init(); /* no "goto unwind" prior to this point!!! */ |
1443 | 1564 | ||
1444 | if (nreaders >= 0) | 1565 | if (nreaders >= 0) { |
1445 | nrealreaders = nreaders; | 1566 | nrealreaders = nreaders; |
1446 | else | 1567 | } else { |
1447 | nrealreaders = 2 * num_online_cpus(); | 1568 | nrealreaders = num_online_cpus() - 1; |
1569 | if (nrealreaders <= 0) | ||
1570 | nrealreaders = 1; | ||
1571 | } | ||
1448 | rcu_torture_print_module_parms(cur_ops, "Start of test"); | 1572 | rcu_torture_print_module_parms(cur_ops, "Start of test"); |
1449 | 1573 | ||
1450 | /* Set up the freelist. */ | 1574 | /* Set up the freelist. */ |
@@ -1533,7 +1657,8 @@ rcu_torture_init(void) | |||
1533 | fqs_duration = 0; | 1657 | fqs_duration = 0; |
1534 | if (fqs_duration) { | 1658 | if (fqs_duration) { |
1535 | /* Create the fqs thread */ | 1659 | /* Create the fqs thread */ |
1536 | torture_create_kthread(rcu_torture_fqs, NULL, fqs_task); | 1660 | firsterr = torture_create_kthread(rcu_torture_fqs, NULL, |
1661 | fqs_task); | ||
1537 | if (firsterr) | 1662 | if (firsterr) |
1538 | goto unwind; | 1663 | goto unwind; |
1539 | } | 1664 | } |
diff --git a/kernel/rcu/tiny_plugin.h b/kernel/rcu/tiny_plugin.h index 431528520562..858c56569127 100644 --- a/kernel/rcu/tiny_plugin.h +++ b/kernel/rcu/tiny_plugin.h | |||
@@ -144,7 +144,7 @@ static void check_cpu_stall(struct rcu_ctrlblk *rcp) | |||
144 | return; | 144 | return; |
145 | rcp->ticks_this_gp++; | 145 | rcp->ticks_this_gp++; |
146 | j = jiffies; | 146 | j = jiffies; |
147 | js = rcp->jiffies_stall; | 147 | js = ACCESS_ONCE(rcp->jiffies_stall); |
148 | if (*rcp->curtail && ULONG_CMP_GE(j, js)) { | 148 | if (*rcp->curtail && ULONG_CMP_GE(j, js)) { |
149 | pr_err("INFO: %s stall on CPU (%lu ticks this GP) idle=%llx (t=%lu jiffies q=%ld)\n", | 149 | pr_err("INFO: %s stall on CPU (%lu ticks this GP) idle=%llx (t=%lu jiffies q=%ld)\n", |
150 | rcp->name, rcp->ticks_this_gp, rcu_dynticks_nesting, | 150 | rcp->name, rcp->ticks_this_gp, rcu_dynticks_nesting, |
@@ -152,17 +152,17 @@ static void check_cpu_stall(struct rcu_ctrlblk *rcp) | |||
152 | dump_stack(); | 152 | dump_stack(); |
153 | } | 153 | } |
154 | if (*rcp->curtail && ULONG_CMP_GE(j, js)) | 154 | if (*rcp->curtail && ULONG_CMP_GE(j, js)) |
155 | rcp->jiffies_stall = jiffies + | 155 | ACCESS_ONCE(rcp->jiffies_stall) = jiffies + |
156 | 3 * rcu_jiffies_till_stall_check() + 3; | 156 | 3 * rcu_jiffies_till_stall_check() + 3; |
157 | else if (ULONG_CMP_GE(j, js)) | 157 | else if (ULONG_CMP_GE(j, js)) |
158 | rcp->jiffies_stall = jiffies + rcu_jiffies_till_stall_check(); | 158 | ACCESS_ONCE(rcp->jiffies_stall) = jiffies + rcu_jiffies_till_stall_check(); |
159 | } | 159 | } |
160 | 160 | ||
161 | static void reset_cpu_stall_ticks(struct rcu_ctrlblk *rcp) | 161 | static void reset_cpu_stall_ticks(struct rcu_ctrlblk *rcp) |
162 | { | 162 | { |
163 | rcp->ticks_this_gp = 0; | 163 | rcp->ticks_this_gp = 0; |
164 | rcp->gp_start = jiffies; | 164 | rcp->gp_start = jiffies; |
165 | rcp->jiffies_stall = jiffies + rcu_jiffies_till_stall_check(); | 165 | ACCESS_ONCE(rcp->jiffies_stall) = jiffies + rcu_jiffies_till_stall_check(); |
166 | } | 166 | } |
167 | 167 | ||
168 | static void check_cpu_stalls(void) | 168 | static void check_cpu_stalls(void) |
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 0c47e300210a..3e3f13e8b429 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c | |||
@@ -101,7 +101,7 @@ DEFINE_PER_CPU(struct rcu_data, sname##_data) | |||
101 | RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched); | 101 | RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched); |
102 | RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh); | 102 | RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh); |
103 | 103 | ||
104 | static struct rcu_state *rcu_state; | 104 | static struct rcu_state *rcu_state_p; |
105 | LIST_HEAD(rcu_struct_flavors); | 105 | LIST_HEAD(rcu_struct_flavors); |
106 | 106 | ||
107 | /* Increase (but not decrease) the CONFIG_RCU_FANOUT_LEAF at boot time. */ | 107 | /* Increase (but not decrease) the CONFIG_RCU_FANOUT_LEAF at boot time. */ |
@@ -243,7 +243,7 @@ static ulong jiffies_till_next_fqs = ULONG_MAX; | |||
243 | module_param(jiffies_till_first_fqs, ulong, 0644); | 243 | module_param(jiffies_till_first_fqs, ulong, 0644); |
244 | module_param(jiffies_till_next_fqs, ulong, 0644); | 244 | module_param(jiffies_till_next_fqs, ulong, 0644); |
245 | 245 | ||
246 | static void rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, | 246 | static bool rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, |
247 | struct rcu_data *rdp); | 247 | struct rcu_data *rdp); |
248 | static void force_qs_rnp(struct rcu_state *rsp, | 248 | static void force_qs_rnp(struct rcu_state *rsp, |
249 | int (*f)(struct rcu_data *rsp, bool *isidle, | 249 | int (*f)(struct rcu_data *rsp, bool *isidle, |
@@ -271,6 +271,15 @@ long rcu_batches_completed_bh(void) | |||
271 | EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); | 271 | EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); |
272 | 272 | ||
273 | /* | 273 | /* |
274 | * Force a quiescent state. | ||
275 | */ | ||
276 | void rcu_force_quiescent_state(void) | ||
277 | { | ||
278 | force_quiescent_state(rcu_state_p); | ||
279 | } | ||
280 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); | ||
281 | |||
282 | /* | ||
274 | * Force a quiescent state for RCU BH. | 283 | * Force a quiescent state for RCU BH. |
275 | */ | 284 | */ |
276 | void rcu_bh_force_quiescent_state(void) | 285 | void rcu_bh_force_quiescent_state(void) |
@@ -280,6 +289,21 @@ void rcu_bh_force_quiescent_state(void) | |||
280 | EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state); | 289 | EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state); |
281 | 290 | ||
282 | /* | 291 | /* |
292 | * Show the state of the grace-period kthreads. | ||
293 | */ | ||
294 | void show_rcu_gp_kthreads(void) | ||
295 | { | ||
296 | struct rcu_state *rsp; | ||
297 | |||
298 | for_each_rcu_flavor(rsp) { | ||
299 | pr_info("%s: wait state: %d ->state: %#lx\n", | ||
300 | rsp->name, rsp->gp_state, rsp->gp_kthread->state); | ||
301 | /* sched_show_task(rsp->gp_kthread); */ | ||
302 | } | ||
303 | } | ||
304 | EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads); | ||
305 | |||
306 | /* | ||
283 | * Record the number of times rcutorture tests have been initiated and | 307 | * Record the number of times rcutorture tests have been initiated and |
284 | * terminated. This information allows the debugfs tracing stats to be | 308 | * terminated. This information allows the debugfs tracing stats to be |
285 | * correlated to the rcutorture messages, even when the rcutorture module | 309 | * correlated to the rcutorture messages, even when the rcutorture module |
@@ -294,6 +318,39 @@ void rcutorture_record_test_transition(void) | |||
294 | EXPORT_SYMBOL_GPL(rcutorture_record_test_transition); | 318 | EXPORT_SYMBOL_GPL(rcutorture_record_test_transition); |
295 | 319 | ||
296 | /* | 320 | /* |
321 | * Send along grace-period-related data for rcutorture diagnostics. | ||
322 | */ | ||
323 | void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags, | ||
324 | unsigned long *gpnum, unsigned long *completed) | ||
325 | { | ||
326 | struct rcu_state *rsp = NULL; | ||
327 | |||
328 | switch (test_type) { | ||
329 | case RCU_FLAVOR: | ||
330 | rsp = rcu_state_p; | ||
331 | break; | ||
332 | case RCU_BH_FLAVOR: | ||
333 | rsp = &rcu_bh_state; | ||
334 | break; | ||
335 | case RCU_SCHED_FLAVOR: | ||
336 | rsp = &rcu_sched_state; | ||
337 | break; | ||
338 | default: | ||
339 | break; | ||
340 | } | ||
341 | if (rsp != NULL) { | ||
342 | *flags = ACCESS_ONCE(rsp->gp_flags); | ||
343 | *gpnum = ACCESS_ONCE(rsp->gpnum); | ||
344 | *completed = ACCESS_ONCE(rsp->completed); | ||
345 | return; | ||
346 | } | ||
347 | *flags = 0; | ||
348 | *gpnum = 0; | ||
349 | *completed = 0; | ||
350 | } | ||
351 | EXPORT_SYMBOL_GPL(rcutorture_get_gp_data); | ||
352 | |||
353 | /* | ||
297 | * Record the number of writer passes through the current rcutorture test. | 354 | * Record the number of writer passes through the current rcutorture test. |
298 | * This is also used to correlate debugfs tracing stats with the rcutorture | 355 | * This is also used to correlate debugfs tracing stats with the rcutorture |
299 | * messages. | 356 | * messages. |
@@ -324,6 +381,28 @@ cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp) | |||
324 | } | 381 | } |
325 | 382 | ||
326 | /* | 383 | /* |
384 | * Return the root node of the specified rcu_state structure. | ||
385 | */ | ||
386 | static struct rcu_node *rcu_get_root(struct rcu_state *rsp) | ||
387 | { | ||
388 | return &rsp->node[0]; | ||
389 | } | ||
390 | |||
391 | /* | ||
392 | * Is there any need for future grace periods? | ||
393 | * Interrupts must be disabled. If the caller does not hold the root | ||
394 | * rnp_node structure's ->lock, the results are advisory only. | ||
395 | */ | ||
396 | static int rcu_future_needs_gp(struct rcu_state *rsp) | ||
397 | { | ||
398 | struct rcu_node *rnp = rcu_get_root(rsp); | ||
399 | int idx = (ACCESS_ONCE(rnp->completed) + 1) & 0x1; | ||
400 | int *fp = &rnp->need_future_gp[idx]; | ||
401 | |||
402 | return ACCESS_ONCE(*fp); | ||
403 | } | ||
404 | |||
405 | /* | ||
327 | * Does the current CPU require a not-yet-started grace period? | 406 | * Does the current CPU require a not-yet-started grace period? |
328 | * The caller must have disabled interrupts to prevent races with | 407 | * The caller must have disabled interrupts to prevent races with |
329 | * normal callback registry. | 408 | * normal callback registry. |
@@ -335,7 +414,7 @@ cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) | |||
335 | 414 | ||
336 | if (rcu_gp_in_progress(rsp)) | 415 | if (rcu_gp_in_progress(rsp)) |
337 | return 0; /* No, a grace period is already in progress. */ | 416 | return 0; /* No, a grace period is already in progress. */ |
338 | if (rcu_nocb_needs_gp(rsp)) | 417 | if (rcu_future_needs_gp(rsp)) |
339 | return 1; /* Yes, a no-CBs CPU needs one. */ | 418 | return 1; /* Yes, a no-CBs CPU needs one. */ |
340 | if (!rdp->nxttail[RCU_NEXT_TAIL]) | 419 | if (!rdp->nxttail[RCU_NEXT_TAIL]) |
341 | return 0; /* No, this is a no-CBs (or offline) CPU. */ | 420 | return 0; /* No, this is a no-CBs (or offline) CPU. */ |
@@ -350,14 +429,6 @@ cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) | |||
350 | } | 429 | } |
351 | 430 | ||
352 | /* | 431 | /* |
353 | * Return the root node of the specified rcu_state structure. | ||
354 | */ | ||
355 | static struct rcu_node *rcu_get_root(struct rcu_state *rsp) | ||
356 | { | ||
357 | return &rsp->node[0]; | ||
358 | } | ||
359 | |||
360 | /* | ||
361 | * rcu_eqs_enter_common - current CPU is moving towards extended quiescent state | 432 | * rcu_eqs_enter_common - current CPU is moving towards extended quiescent state |
362 | * | 433 | * |
363 | * If the new value of the ->dynticks_nesting counter now is zero, | 434 | * If the new value of the ->dynticks_nesting counter now is zero, |
@@ -758,7 +829,12 @@ static int dyntick_save_progress_counter(struct rcu_data *rdp, | |||
758 | { | 829 | { |
759 | rdp->dynticks_snap = atomic_add_return(0, &rdp->dynticks->dynticks); | 830 | rdp->dynticks_snap = atomic_add_return(0, &rdp->dynticks->dynticks); |
760 | rcu_sysidle_check_cpu(rdp, isidle, maxj); | 831 | rcu_sysidle_check_cpu(rdp, isidle, maxj); |
761 | return (rdp->dynticks_snap & 0x1) == 0; | 832 | if ((rdp->dynticks_snap & 0x1) == 0) { |
833 | trace_rcu_fqs(rdp->rsp->name, rdp->gpnum, rdp->cpu, TPS("dti")); | ||
834 | return 1; | ||
835 | } else { | ||
836 | return 0; | ||
837 | } | ||
762 | } | 838 | } |
763 | 839 | ||
764 | /* | 840 | /* |
@@ -834,7 +910,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp, | |||
834 | * we will beat on the first one until it gets unstuck, then move | 910 | * we will beat on the first one until it gets unstuck, then move |
835 | * to the next. Only do this for the primary flavor of RCU. | 911 | * to the next. Only do this for the primary flavor of RCU. |
836 | */ | 912 | */ |
837 | if (rdp->rsp == rcu_state && | 913 | if (rdp->rsp == rcu_state_p && |
838 | ULONG_CMP_GE(jiffies, rdp->rsp->jiffies_resched)) { | 914 | ULONG_CMP_GE(jiffies, rdp->rsp->jiffies_resched)) { |
839 | rdp->rsp->jiffies_resched += 5; | 915 | rdp->rsp->jiffies_resched += 5; |
840 | resched_cpu(rdp->cpu); | 916 | resched_cpu(rdp->cpu); |
@@ -851,7 +927,7 @@ static void record_gp_stall_check_time(struct rcu_state *rsp) | |||
851 | rsp->gp_start = j; | 927 | rsp->gp_start = j; |
852 | smp_wmb(); /* Record start time before stall time. */ | 928 | smp_wmb(); /* Record start time before stall time. */ |
853 | j1 = rcu_jiffies_till_stall_check(); | 929 | j1 = rcu_jiffies_till_stall_check(); |
854 | rsp->jiffies_stall = j + j1; | 930 | ACCESS_ONCE(rsp->jiffies_stall) = j + j1; |
855 | rsp->jiffies_resched = j + j1 / 2; | 931 | rsp->jiffies_resched = j + j1 / 2; |
856 | } | 932 | } |
857 | 933 | ||
@@ -890,12 +966,12 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
890 | /* Only let one CPU complain about others per time interval. */ | 966 | /* Only let one CPU complain about others per time interval. */ |
891 | 967 | ||
892 | raw_spin_lock_irqsave(&rnp->lock, flags); | 968 | raw_spin_lock_irqsave(&rnp->lock, flags); |
893 | delta = jiffies - rsp->jiffies_stall; | 969 | delta = jiffies - ACCESS_ONCE(rsp->jiffies_stall); |
894 | if (delta < RCU_STALL_RAT_DELAY || !rcu_gp_in_progress(rsp)) { | 970 | if (delta < RCU_STALL_RAT_DELAY || !rcu_gp_in_progress(rsp)) { |
895 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 971 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
896 | return; | 972 | return; |
897 | } | 973 | } |
898 | rsp->jiffies_stall = jiffies + 3 * rcu_jiffies_till_stall_check() + 3; | 974 | ACCESS_ONCE(rsp->jiffies_stall) = jiffies + 3 * rcu_jiffies_till_stall_check() + 3; |
899 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 975 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
900 | 976 | ||
901 | /* | 977 | /* |
@@ -932,9 +1008,9 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
932 | print_cpu_stall_info_end(); | 1008 | print_cpu_stall_info_end(); |
933 | for_each_possible_cpu(cpu) | 1009 | for_each_possible_cpu(cpu) |
934 | totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen; | 1010 | totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen; |
935 | pr_cont("(detected by %d, t=%ld jiffies, g=%lu, c=%lu, q=%lu)\n", | 1011 | pr_cont("(detected by %d, t=%ld jiffies, g=%ld, c=%ld, q=%lu)\n", |
936 | smp_processor_id(), (long)(jiffies - rsp->gp_start), | 1012 | smp_processor_id(), (long)(jiffies - rsp->gp_start), |
937 | rsp->gpnum, rsp->completed, totqlen); | 1013 | (long)rsp->gpnum, (long)rsp->completed, totqlen); |
938 | if (ndetected == 0) | 1014 | if (ndetected == 0) |
939 | pr_err("INFO: Stall ended before state dump start\n"); | 1015 | pr_err("INFO: Stall ended before state dump start\n"); |
940 | else if (!trigger_all_cpu_backtrace()) | 1016 | else if (!trigger_all_cpu_backtrace()) |
@@ -947,12 +1023,6 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
947 | force_quiescent_state(rsp); /* Kick them all. */ | 1023 | force_quiescent_state(rsp); /* Kick them all. */ |
948 | } | 1024 | } |
949 | 1025 | ||
950 | /* | ||
951 | * This function really isn't for public consumption, but RCU is special in | ||
952 | * that context switches can allow the state machine to make progress. | ||
953 | */ | ||
954 | extern void resched_cpu(int cpu); | ||
955 | |||
956 | static void print_cpu_stall(struct rcu_state *rsp) | 1026 | static void print_cpu_stall(struct rcu_state *rsp) |
957 | { | 1027 | { |
958 | int cpu; | 1028 | int cpu; |
@@ -971,14 +1041,15 @@ static void print_cpu_stall(struct rcu_state *rsp) | |||
971 | print_cpu_stall_info_end(); | 1041 | print_cpu_stall_info_end(); |
972 | for_each_possible_cpu(cpu) | 1042 | for_each_possible_cpu(cpu) |
973 | totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen; | 1043 | totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen; |
974 | pr_cont(" (t=%lu jiffies g=%lu c=%lu q=%lu)\n", | 1044 | pr_cont(" (t=%lu jiffies g=%ld c=%ld q=%lu)\n", |
975 | jiffies - rsp->gp_start, rsp->gpnum, rsp->completed, totqlen); | 1045 | jiffies - rsp->gp_start, |
1046 | (long)rsp->gpnum, (long)rsp->completed, totqlen); | ||
976 | if (!trigger_all_cpu_backtrace()) | 1047 | if (!trigger_all_cpu_backtrace()) |
977 | dump_stack(); | 1048 | dump_stack(); |
978 | 1049 | ||
979 | raw_spin_lock_irqsave(&rnp->lock, flags); | 1050 | raw_spin_lock_irqsave(&rnp->lock, flags); |
980 | if (ULONG_CMP_GE(jiffies, rsp->jiffies_stall)) | 1051 | if (ULONG_CMP_GE(jiffies, ACCESS_ONCE(rsp->jiffies_stall))) |
981 | rsp->jiffies_stall = jiffies + | 1052 | ACCESS_ONCE(rsp->jiffies_stall) = jiffies + |
982 | 3 * rcu_jiffies_till_stall_check() + 3; | 1053 | 3 * rcu_jiffies_till_stall_check() + 3; |
983 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 1054 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
984 | 1055 | ||
@@ -1062,7 +1133,7 @@ void rcu_cpu_stall_reset(void) | |||
1062 | struct rcu_state *rsp; | 1133 | struct rcu_state *rsp; |
1063 | 1134 | ||
1064 | for_each_rcu_flavor(rsp) | 1135 | for_each_rcu_flavor(rsp) |
1065 | rsp->jiffies_stall = jiffies + ULONG_MAX / 2; | 1136 | ACCESS_ONCE(rsp->jiffies_stall) = jiffies + ULONG_MAX / 2; |
1066 | } | 1137 | } |
1067 | 1138 | ||
1068 | /* | 1139 | /* |
@@ -1123,15 +1194,18 @@ static void trace_rcu_future_gp(struct rcu_node *rnp, struct rcu_data *rdp, | |||
1123 | /* | 1194 | /* |
1124 | * Start some future grace period, as needed to handle newly arrived | 1195 | * Start some future grace period, as needed to handle newly arrived |
1125 | * callbacks. The required future grace periods are recorded in each | 1196 | * callbacks. The required future grace periods are recorded in each |
1126 | * rcu_node structure's ->need_future_gp field. | 1197 | * rcu_node structure's ->need_future_gp field. Returns true if there |
1198 | * is reason to awaken the grace-period kthread. | ||
1127 | * | 1199 | * |
1128 | * The caller must hold the specified rcu_node structure's ->lock. | 1200 | * The caller must hold the specified rcu_node structure's ->lock. |
1129 | */ | 1201 | */ |
1130 | static unsigned long __maybe_unused | 1202 | static bool __maybe_unused |
1131 | rcu_start_future_gp(struct rcu_node *rnp, struct rcu_data *rdp) | 1203 | rcu_start_future_gp(struct rcu_node *rnp, struct rcu_data *rdp, |
1204 | unsigned long *c_out) | ||
1132 | { | 1205 | { |
1133 | unsigned long c; | 1206 | unsigned long c; |
1134 | int i; | 1207 | int i; |
1208 | bool ret = false; | ||
1135 | struct rcu_node *rnp_root = rcu_get_root(rdp->rsp); | 1209 | struct rcu_node *rnp_root = rcu_get_root(rdp->rsp); |
1136 | 1210 | ||
1137 | /* | 1211 | /* |
@@ -1142,7 +1216,7 @@ rcu_start_future_gp(struct rcu_node *rnp, struct rcu_data *rdp) | |||
1142 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startleaf")); | 1216 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startleaf")); |
1143 | if (rnp->need_future_gp[c & 0x1]) { | 1217 | if (rnp->need_future_gp[c & 0x1]) { |
1144 | trace_rcu_future_gp(rnp, rdp, c, TPS("Prestartleaf")); | 1218 | trace_rcu_future_gp(rnp, rdp, c, TPS("Prestartleaf")); |
1145 | return c; | 1219 | goto out; |
1146 | } | 1220 | } |
1147 | 1221 | ||
1148 | /* | 1222 | /* |
@@ -1156,7 +1230,7 @@ rcu_start_future_gp(struct rcu_node *rnp, struct rcu_data *rdp) | |||
1156 | ACCESS_ONCE(rnp->gpnum) != ACCESS_ONCE(rnp->completed)) { | 1230 | ACCESS_ONCE(rnp->gpnum) != ACCESS_ONCE(rnp->completed)) { |
1157 | rnp->need_future_gp[c & 0x1]++; | 1231 | rnp->need_future_gp[c & 0x1]++; |
1158 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startedleaf")); | 1232 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startedleaf")); |
1159 | return c; | 1233 | goto out; |
1160 | } | 1234 | } |
1161 | 1235 | ||
1162 | /* | 1236 | /* |
@@ -1197,12 +1271,15 @@ rcu_start_future_gp(struct rcu_node *rnp, struct rcu_data *rdp) | |||
1197 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startedleafroot")); | 1271 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startedleafroot")); |
1198 | } else { | 1272 | } else { |
1199 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startedroot")); | 1273 | trace_rcu_future_gp(rnp, rdp, c, TPS("Startedroot")); |
1200 | rcu_start_gp_advanced(rdp->rsp, rnp_root, rdp); | 1274 | ret = rcu_start_gp_advanced(rdp->rsp, rnp_root, rdp); |
1201 | } | 1275 | } |
1202 | unlock_out: | 1276 | unlock_out: |
1203 | if (rnp != rnp_root) | 1277 | if (rnp != rnp_root) |
1204 | raw_spin_unlock(&rnp_root->lock); | 1278 | raw_spin_unlock(&rnp_root->lock); |
1205 | return c; | 1279 | out: |
1280 | if (c_out != NULL) | ||
1281 | *c_out = c; | ||
1282 | return ret; | ||
1206 | } | 1283 | } |
1207 | 1284 | ||
1208 | /* | 1285 | /* |
@@ -1226,25 +1303,43 @@ static int rcu_future_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp) | |||
1226 | } | 1303 | } |
1227 | 1304 | ||
1228 | /* | 1305 | /* |
1306 | * Awaken the grace-period kthread for the specified flavor of RCU. | ||
1307 | * Don't do a self-awaken, and don't bother awakening when there is | ||
1308 | * nothing for the grace-period kthread to do (as in several CPUs | ||
1309 | * raced to awaken, and we lost), and finally don't try to awaken | ||
1310 | * a kthread that has not yet been created. | ||
1311 | */ | ||
1312 | static void rcu_gp_kthread_wake(struct rcu_state *rsp) | ||
1313 | { | ||
1314 | if (current == rsp->gp_kthread || | ||
1315 | !ACCESS_ONCE(rsp->gp_flags) || | ||
1316 | !rsp->gp_kthread) | ||
1317 | return; | ||
1318 | wake_up(&rsp->gp_wq); | ||
1319 | } | ||
1320 | |||
1321 | /* | ||
1229 | * If there is room, assign a ->completed number to any callbacks on | 1322 | * If there is room, assign a ->completed number to any callbacks on |
1230 | * this CPU that have not already been assigned. Also accelerate any | 1323 | * this CPU that have not already been assigned. Also accelerate any |
1231 | * callbacks that were previously assigned a ->completed number that has | 1324 | * callbacks that were previously assigned a ->completed number that has |
1232 | * since proven to be too conservative, which can happen if callbacks get | 1325 | * since proven to be too conservative, which can happen if callbacks get |
1233 | * assigned a ->completed number while RCU is idle, but with reference to | 1326 | * assigned a ->completed number while RCU is idle, but with reference to |
1234 | * a non-root rcu_node structure. This function is idempotent, so it does | 1327 | * a non-root rcu_node structure. This function is idempotent, so it does |
1235 | * not hurt to call it repeatedly. | 1328 | * not hurt to call it repeatedly. Returns an flag saying that we should |
1329 | * awaken the RCU grace-period kthread. | ||
1236 | * | 1330 | * |
1237 | * The caller must hold rnp->lock with interrupts disabled. | 1331 | * The caller must hold rnp->lock with interrupts disabled. |
1238 | */ | 1332 | */ |
1239 | static void rcu_accelerate_cbs(struct rcu_state *rsp, struct rcu_node *rnp, | 1333 | static bool rcu_accelerate_cbs(struct rcu_state *rsp, struct rcu_node *rnp, |
1240 | struct rcu_data *rdp) | 1334 | struct rcu_data *rdp) |
1241 | { | 1335 | { |
1242 | unsigned long c; | 1336 | unsigned long c; |
1243 | int i; | 1337 | int i; |
1338 | bool ret; | ||
1244 | 1339 | ||
1245 | /* If the CPU has no callbacks, nothing to do. */ | 1340 | /* If the CPU has no callbacks, nothing to do. */ |
1246 | if (!rdp->nxttail[RCU_NEXT_TAIL] || !*rdp->nxttail[RCU_DONE_TAIL]) | 1341 | if (!rdp->nxttail[RCU_NEXT_TAIL] || !*rdp->nxttail[RCU_DONE_TAIL]) |
1247 | return; | 1342 | return false; |
1248 | 1343 | ||
1249 | /* | 1344 | /* |
1250 | * Starting from the sublist containing the callbacks most | 1345 | * Starting from the sublist containing the callbacks most |
@@ -1273,7 +1368,7 @@ static void rcu_accelerate_cbs(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1273 | * be grouped into. | 1368 | * be grouped into. |
1274 | */ | 1369 | */ |
1275 | if (++i >= RCU_NEXT_TAIL) | 1370 | if (++i >= RCU_NEXT_TAIL) |
1276 | return; | 1371 | return false; |
1277 | 1372 | ||
1278 | /* | 1373 | /* |
1279 | * Assign all subsequent callbacks' ->completed number to the next | 1374 | * Assign all subsequent callbacks' ->completed number to the next |
@@ -1285,13 +1380,14 @@ static void rcu_accelerate_cbs(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1285 | rdp->nxtcompleted[i] = c; | 1380 | rdp->nxtcompleted[i] = c; |
1286 | } | 1381 | } |
1287 | /* Record any needed additional grace periods. */ | 1382 | /* Record any needed additional grace periods. */ |
1288 | rcu_start_future_gp(rnp, rdp); | 1383 | ret = rcu_start_future_gp(rnp, rdp, NULL); |
1289 | 1384 | ||
1290 | /* Trace depending on how much we were able to accelerate. */ | 1385 | /* Trace depending on how much we were able to accelerate. */ |
1291 | if (!*rdp->nxttail[RCU_WAIT_TAIL]) | 1386 | if (!*rdp->nxttail[RCU_WAIT_TAIL]) |
1292 | trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("AccWaitCB")); | 1387 | trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("AccWaitCB")); |
1293 | else | 1388 | else |
1294 | trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("AccReadyCB")); | 1389 | trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("AccReadyCB")); |
1390 | return ret; | ||
1295 | } | 1391 | } |
1296 | 1392 | ||
1297 | /* | 1393 | /* |
@@ -1300,17 +1396,18 @@ static void rcu_accelerate_cbs(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1300 | * assign ->completed numbers to any callbacks in the RCU_NEXT_TAIL | 1396 | * assign ->completed numbers to any callbacks in the RCU_NEXT_TAIL |
1301 | * sublist. This function is idempotent, so it does not hurt to | 1397 | * sublist. This function is idempotent, so it does not hurt to |
1302 | * invoke it repeatedly. As long as it is not invoked -too- often... | 1398 | * invoke it repeatedly. As long as it is not invoked -too- often... |
1399 | * Returns true if the RCU grace-period kthread needs to be awakened. | ||
1303 | * | 1400 | * |
1304 | * The caller must hold rnp->lock with interrupts disabled. | 1401 | * The caller must hold rnp->lock with interrupts disabled. |
1305 | */ | 1402 | */ |
1306 | static void rcu_advance_cbs(struct rcu_state *rsp, struct rcu_node *rnp, | 1403 | static bool rcu_advance_cbs(struct rcu_state *rsp, struct rcu_node *rnp, |
1307 | struct rcu_data *rdp) | 1404 | struct rcu_data *rdp) |
1308 | { | 1405 | { |
1309 | int i, j; | 1406 | int i, j; |
1310 | 1407 | ||
1311 | /* If the CPU has no callbacks, nothing to do. */ | 1408 | /* If the CPU has no callbacks, nothing to do. */ |
1312 | if (!rdp->nxttail[RCU_NEXT_TAIL] || !*rdp->nxttail[RCU_DONE_TAIL]) | 1409 | if (!rdp->nxttail[RCU_NEXT_TAIL] || !*rdp->nxttail[RCU_DONE_TAIL]) |
1313 | return; | 1410 | return false; |
1314 | 1411 | ||
1315 | /* | 1412 | /* |
1316 | * Find all callbacks whose ->completed numbers indicate that they | 1413 | * Find all callbacks whose ->completed numbers indicate that they |
@@ -1334,26 +1431,30 @@ static void rcu_advance_cbs(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1334 | } | 1431 | } |
1335 | 1432 | ||
1336 | /* Classify any remaining callbacks. */ | 1433 | /* Classify any remaining callbacks. */ |
1337 | rcu_accelerate_cbs(rsp, rnp, rdp); | 1434 | return rcu_accelerate_cbs(rsp, rnp, rdp); |
1338 | } | 1435 | } |
1339 | 1436 | ||
1340 | /* | 1437 | /* |
1341 | * Update CPU-local rcu_data state to record the beginnings and ends of | 1438 | * Update CPU-local rcu_data state to record the beginnings and ends of |
1342 | * grace periods. The caller must hold the ->lock of the leaf rcu_node | 1439 | * grace periods. The caller must hold the ->lock of the leaf rcu_node |
1343 | * structure corresponding to the current CPU, and must have irqs disabled. | 1440 | * structure corresponding to the current CPU, and must have irqs disabled. |
1441 | * Returns true if the grace-period kthread needs to be awakened. | ||
1344 | */ | 1442 | */ |
1345 | static void __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp) | 1443 | static bool __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp, |
1444 | struct rcu_data *rdp) | ||
1346 | { | 1445 | { |
1446 | bool ret; | ||
1447 | |||
1347 | /* Handle the ends of any preceding grace periods first. */ | 1448 | /* Handle the ends of any preceding grace periods first. */ |
1348 | if (rdp->completed == rnp->completed) { | 1449 | if (rdp->completed == rnp->completed) { |
1349 | 1450 | ||
1350 | /* No grace period end, so just accelerate recent callbacks. */ | 1451 | /* No grace period end, so just accelerate recent callbacks. */ |
1351 | rcu_accelerate_cbs(rsp, rnp, rdp); | 1452 | ret = rcu_accelerate_cbs(rsp, rnp, rdp); |
1352 | 1453 | ||
1353 | } else { | 1454 | } else { |
1354 | 1455 | ||
1355 | /* Advance callbacks. */ | 1456 | /* Advance callbacks. */ |
1356 | rcu_advance_cbs(rsp, rnp, rdp); | 1457 | ret = rcu_advance_cbs(rsp, rnp, rdp); |
1357 | 1458 | ||
1358 | /* Remember that we saw this grace-period completion. */ | 1459 | /* Remember that we saw this grace-period completion. */ |
1359 | rdp->completed = rnp->completed; | 1460 | rdp->completed = rnp->completed; |
@@ -1372,11 +1473,13 @@ static void __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp, struc | |||
1372 | rdp->qs_pending = !!(rnp->qsmask & rdp->grpmask); | 1473 | rdp->qs_pending = !!(rnp->qsmask & rdp->grpmask); |
1373 | zero_cpu_stall_ticks(rdp); | 1474 | zero_cpu_stall_ticks(rdp); |
1374 | } | 1475 | } |
1476 | return ret; | ||
1375 | } | 1477 | } |
1376 | 1478 | ||
1377 | static void note_gp_changes(struct rcu_state *rsp, struct rcu_data *rdp) | 1479 | static void note_gp_changes(struct rcu_state *rsp, struct rcu_data *rdp) |
1378 | { | 1480 | { |
1379 | unsigned long flags; | 1481 | unsigned long flags; |
1482 | bool needwake; | ||
1380 | struct rcu_node *rnp; | 1483 | struct rcu_node *rnp; |
1381 | 1484 | ||
1382 | local_irq_save(flags); | 1485 | local_irq_save(flags); |
@@ -1388,8 +1491,10 @@ static void note_gp_changes(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1388 | return; | 1491 | return; |
1389 | } | 1492 | } |
1390 | smp_mb__after_unlock_lock(); | 1493 | smp_mb__after_unlock_lock(); |
1391 | __note_gp_changes(rsp, rnp, rdp); | 1494 | needwake = __note_gp_changes(rsp, rnp, rdp); |
1392 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 1495 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
1496 | if (needwake) | ||
1497 | rcu_gp_kthread_wake(rsp); | ||
1393 | } | 1498 | } |
1394 | 1499 | ||
1395 | /* | 1500 | /* |
@@ -1403,12 +1508,12 @@ static int rcu_gp_init(struct rcu_state *rsp) | |||
1403 | rcu_bind_gp_kthread(); | 1508 | rcu_bind_gp_kthread(); |
1404 | raw_spin_lock_irq(&rnp->lock); | 1509 | raw_spin_lock_irq(&rnp->lock); |
1405 | smp_mb__after_unlock_lock(); | 1510 | smp_mb__after_unlock_lock(); |
1406 | if (rsp->gp_flags == 0) { | 1511 | if (!ACCESS_ONCE(rsp->gp_flags)) { |
1407 | /* Spurious wakeup, tell caller to go back to sleep. */ | 1512 | /* Spurious wakeup, tell caller to go back to sleep. */ |
1408 | raw_spin_unlock_irq(&rnp->lock); | 1513 | raw_spin_unlock_irq(&rnp->lock); |
1409 | return 0; | 1514 | return 0; |
1410 | } | 1515 | } |
1411 | rsp->gp_flags = 0; /* Clear all flags: New grace period. */ | 1516 | ACCESS_ONCE(rsp->gp_flags) = 0; /* Clear all flags: New grace period. */ |
1412 | 1517 | ||
1413 | if (WARN_ON_ONCE(rcu_gp_in_progress(rsp))) { | 1518 | if (WARN_ON_ONCE(rcu_gp_in_progress(rsp))) { |
1414 | /* | 1519 | /* |
@@ -1453,7 +1558,7 @@ static int rcu_gp_init(struct rcu_state *rsp) | |||
1453 | WARN_ON_ONCE(rnp->completed != rsp->completed); | 1558 | WARN_ON_ONCE(rnp->completed != rsp->completed); |
1454 | ACCESS_ONCE(rnp->completed) = rsp->completed; | 1559 | ACCESS_ONCE(rnp->completed) = rsp->completed; |
1455 | if (rnp == rdp->mynode) | 1560 | if (rnp == rdp->mynode) |
1456 | __note_gp_changes(rsp, rnp, rdp); | 1561 | (void)__note_gp_changes(rsp, rnp, rdp); |
1457 | rcu_preempt_boost_start_gp(rnp); | 1562 | rcu_preempt_boost_start_gp(rnp); |
1458 | trace_rcu_grace_period_init(rsp->name, rnp->gpnum, | 1563 | trace_rcu_grace_period_init(rsp->name, rnp->gpnum, |
1459 | rnp->level, rnp->grplo, | 1564 | rnp->level, rnp->grplo, |
@@ -1501,7 +1606,7 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) | |||
1501 | if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) { | 1606 | if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) { |
1502 | raw_spin_lock_irq(&rnp->lock); | 1607 | raw_spin_lock_irq(&rnp->lock); |
1503 | smp_mb__after_unlock_lock(); | 1608 | smp_mb__after_unlock_lock(); |
1504 | rsp->gp_flags &= ~RCU_GP_FLAG_FQS; | 1609 | ACCESS_ONCE(rsp->gp_flags) &= ~RCU_GP_FLAG_FQS; |
1505 | raw_spin_unlock_irq(&rnp->lock); | 1610 | raw_spin_unlock_irq(&rnp->lock); |
1506 | } | 1611 | } |
1507 | return fqs_state; | 1612 | return fqs_state; |
@@ -1513,6 +1618,7 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) | |||
1513 | static void rcu_gp_cleanup(struct rcu_state *rsp) | 1618 | static void rcu_gp_cleanup(struct rcu_state *rsp) |
1514 | { | 1619 | { |
1515 | unsigned long gp_duration; | 1620 | unsigned long gp_duration; |
1621 | bool needgp = false; | ||
1516 | int nocb = 0; | 1622 | int nocb = 0; |
1517 | struct rcu_data *rdp; | 1623 | struct rcu_data *rdp; |
1518 | struct rcu_node *rnp = rcu_get_root(rsp); | 1624 | struct rcu_node *rnp = rcu_get_root(rsp); |
@@ -1548,7 +1654,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp) | |||
1548 | ACCESS_ONCE(rnp->completed) = rsp->gpnum; | 1654 | ACCESS_ONCE(rnp->completed) = rsp->gpnum; |
1549 | rdp = this_cpu_ptr(rsp->rda); | 1655 | rdp = this_cpu_ptr(rsp->rda); |
1550 | if (rnp == rdp->mynode) | 1656 | if (rnp == rdp->mynode) |
1551 | __note_gp_changes(rsp, rnp, rdp); | 1657 | needgp = __note_gp_changes(rsp, rnp, rdp) || needgp; |
1552 | /* smp_mb() provided by prior unlock-lock pair. */ | 1658 | /* smp_mb() provided by prior unlock-lock pair. */ |
1553 | nocb += rcu_future_gp_cleanup(rsp, rnp); | 1659 | nocb += rcu_future_gp_cleanup(rsp, rnp); |
1554 | raw_spin_unlock_irq(&rnp->lock); | 1660 | raw_spin_unlock_irq(&rnp->lock); |
@@ -1564,9 +1670,10 @@ static void rcu_gp_cleanup(struct rcu_state *rsp) | |||
1564 | trace_rcu_grace_period(rsp->name, rsp->completed, TPS("end")); | 1670 | trace_rcu_grace_period(rsp->name, rsp->completed, TPS("end")); |
1565 | rsp->fqs_state = RCU_GP_IDLE; | 1671 | rsp->fqs_state = RCU_GP_IDLE; |
1566 | rdp = this_cpu_ptr(rsp->rda); | 1672 | rdp = this_cpu_ptr(rsp->rda); |
1567 | rcu_advance_cbs(rsp, rnp, rdp); /* Reduce false positives below. */ | 1673 | /* Advance CBs to reduce false positives below. */ |
1568 | if (cpu_needs_another_gp(rsp, rdp)) { | 1674 | needgp = rcu_advance_cbs(rsp, rnp, rdp) || needgp; |
1569 | rsp->gp_flags = RCU_GP_FLAG_INIT; | 1675 | if (needgp || cpu_needs_another_gp(rsp, rdp)) { |
1676 | ACCESS_ONCE(rsp->gp_flags) = RCU_GP_FLAG_INIT; | ||
1570 | trace_rcu_grace_period(rsp->name, | 1677 | trace_rcu_grace_period(rsp->name, |
1571 | ACCESS_ONCE(rsp->gpnum), | 1678 | ACCESS_ONCE(rsp->gpnum), |
1572 | TPS("newreq")); | 1679 | TPS("newreq")); |
@@ -1593,6 +1700,7 @@ static int __noreturn rcu_gp_kthread(void *arg) | |||
1593 | trace_rcu_grace_period(rsp->name, | 1700 | trace_rcu_grace_period(rsp->name, |
1594 | ACCESS_ONCE(rsp->gpnum), | 1701 | ACCESS_ONCE(rsp->gpnum), |
1595 | TPS("reqwait")); | 1702 | TPS("reqwait")); |
1703 | rsp->gp_state = RCU_GP_WAIT_GPS; | ||
1596 | wait_event_interruptible(rsp->gp_wq, | 1704 | wait_event_interruptible(rsp->gp_wq, |
1597 | ACCESS_ONCE(rsp->gp_flags) & | 1705 | ACCESS_ONCE(rsp->gp_flags) & |
1598 | RCU_GP_FLAG_INIT); | 1706 | RCU_GP_FLAG_INIT); |
@@ -1620,6 +1728,7 @@ static int __noreturn rcu_gp_kthread(void *arg) | |||
1620 | trace_rcu_grace_period(rsp->name, | 1728 | trace_rcu_grace_period(rsp->name, |
1621 | ACCESS_ONCE(rsp->gpnum), | 1729 | ACCESS_ONCE(rsp->gpnum), |
1622 | TPS("fqswait")); | 1730 | TPS("fqswait")); |
1731 | rsp->gp_state = RCU_GP_WAIT_FQS; | ||
1623 | ret = wait_event_interruptible_timeout(rsp->gp_wq, | 1732 | ret = wait_event_interruptible_timeout(rsp->gp_wq, |
1624 | ((gf = ACCESS_ONCE(rsp->gp_flags)) & | 1733 | ((gf = ACCESS_ONCE(rsp->gp_flags)) & |
1625 | RCU_GP_FLAG_FQS) || | 1734 | RCU_GP_FLAG_FQS) || |
@@ -1665,14 +1774,6 @@ static int __noreturn rcu_gp_kthread(void *arg) | |||
1665 | } | 1774 | } |
1666 | } | 1775 | } |
1667 | 1776 | ||
1668 | static void rsp_wakeup(struct irq_work *work) | ||
1669 | { | ||
1670 | struct rcu_state *rsp = container_of(work, struct rcu_state, wakeup_work); | ||
1671 | |||
1672 | /* Wake up rcu_gp_kthread() to start the grace period. */ | ||
1673 | wake_up(&rsp->gp_wq); | ||
1674 | } | ||
1675 | |||
1676 | /* | 1777 | /* |
1677 | * Start a new RCU grace period if warranted, re-initializing the hierarchy | 1778 | * Start a new RCU grace period if warranted, re-initializing the hierarchy |
1678 | * in preparation for detecting the next grace period. The caller must hold | 1779 | * in preparation for detecting the next grace period. The caller must hold |
@@ -1681,8 +1782,10 @@ static void rsp_wakeup(struct irq_work *work) | |||
1681 | * Note that it is legal for a dying CPU (which is marked as offline) to | 1782 | * Note that it is legal for a dying CPU (which is marked as offline) to |
1682 | * invoke this function. This can happen when the dying CPU reports its | 1783 | * invoke this function. This can happen when the dying CPU reports its |
1683 | * quiescent state. | 1784 | * quiescent state. |
1785 | * | ||
1786 | * Returns true if the grace-period kthread must be awakened. | ||
1684 | */ | 1787 | */ |
1685 | static void | 1788 | static bool |
1686 | rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, | 1789 | rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, |
1687 | struct rcu_data *rdp) | 1790 | struct rcu_data *rdp) |
1688 | { | 1791 | { |
@@ -1693,20 +1796,18 @@ rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1693 | * or a grace period is already in progress. | 1796 | * or a grace period is already in progress. |
1694 | * Either way, don't start a new grace period. | 1797 | * Either way, don't start a new grace period. |
1695 | */ | 1798 | */ |
1696 | return; | 1799 | return false; |
1697 | } | 1800 | } |
1698 | rsp->gp_flags = RCU_GP_FLAG_INIT; | 1801 | ACCESS_ONCE(rsp->gp_flags) = RCU_GP_FLAG_INIT; |
1699 | trace_rcu_grace_period(rsp->name, ACCESS_ONCE(rsp->gpnum), | 1802 | trace_rcu_grace_period(rsp->name, ACCESS_ONCE(rsp->gpnum), |
1700 | TPS("newreq")); | 1803 | TPS("newreq")); |
1701 | 1804 | ||
1702 | /* | 1805 | /* |
1703 | * We can't do wakeups while holding the rnp->lock, as that | 1806 | * We can't do wakeups while holding the rnp->lock, as that |
1704 | * could cause possible deadlocks with the rq->lock. Defer | 1807 | * could cause possible deadlocks with the rq->lock. Defer |
1705 | * the wakeup to interrupt context. And don't bother waking | 1808 | * the wakeup to our caller. |
1706 | * up the running kthread. | ||
1707 | */ | 1809 | */ |
1708 | if (current != rsp->gp_kthread) | 1810 | return true; |
1709 | irq_work_queue(&rsp->wakeup_work); | ||
1710 | } | 1811 | } |
1711 | 1812 | ||
1712 | /* | 1813 | /* |
@@ -1715,12 +1816,14 @@ rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1715 | * is invoked indirectly from rcu_advance_cbs(), which would result in | 1816 | * is invoked indirectly from rcu_advance_cbs(), which would result in |
1716 | * endless recursion -- or would do so if it wasn't for the self-deadlock | 1817 | * endless recursion -- or would do so if it wasn't for the self-deadlock |
1717 | * that is encountered beforehand. | 1818 | * that is encountered beforehand. |
1819 | * | ||
1820 | * Returns true if the grace-period kthread needs to be awakened. | ||
1718 | */ | 1821 | */ |
1719 | static void | 1822 | static bool rcu_start_gp(struct rcu_state *rsp) |
1720 | rcu_start_gp(struct rcu_state *rsp) | ||
1721 | { | 1823 | { |
1722 | struct rcu_data *rdp = this_cpu_ptr(rsp->rda); | 1824 | struct rcu_data *rdp = this_cpu_ptr(rsp->rda); |
1723 | struct rcu_node *rnp = rcu_get_root(rsp); | 1825 | struct rcu_node *rnp = rcu_get_root(rsp); |
1826 | bool ret = false; | ||
1724 | 1827 | ||
1725 | /* | 1828 | /* |
1726 | * If there is no grace period in progress right now, any | 1829 | * If there is no grace period in progress right now, any |
@@ -1730,8 +1833,9 @@ rcu_start_gp(struct rcu_state *rsp) | |||
1730 | * resulting in pointless grace periods. So, advance callbacks | 1833 | * resulting in pointless grace periods. So, advance callbacks |
1731 | * then start the grace period! | 1834 | * then start the grace period! |
1732 | */ | 1835 | */ |
1733 | rcu_advance_cbs(rsp, rnp, rdp); | 1836 | ret = rcu_advance_cbs(rsp, rnp, rdp) || ret; |
1734 | rcu_start_gp_advanced(rsp, rnp, rdp); | 1837 | ret = rcu_start_gp_advanced(rsp, rnp, rdp) || ret; |
1838 | return ret; | ||
1735 | } | 1839 | } |
1736 | 1840 | ||
1737 | /* | 1841 | /* |
@@ -1820,6 +1924,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp) | |||
1820 | { | 1924 | { |
1821 | unsigned long flags; | 1925 | unsigned long flags; |
1822 | unsigned long mask; | 1926 | unsigned long mask; |
1927 | bool needwake; | ||
1823 | struct rcu_node *rnp; | 1928 | struct rcu_node *rnp; |
1824 | 1929 | ||
1825 | rnp = rdp->mynode; | 1930 | rnp = rdp->mynode; |
@@ -1848,9 +1953,11 @@ rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp) | |||
1848 | * This GP can't end until cpu checks in, so all of our | 1953 | * This GP can't end until cpu checks in, so all of our |
1849 | * callbacks can be processed during the next GP. | 1954 | * callbacks can be processed during the next GP. |
1850 | */ | 1955 | */ |
1851 | rcu_accelerate_cbs(rsp, rnp, rdp); | 1956 | needwake = rcu_accelerate_cbs(rsp, rnp, rdp); |
1852 | 1957 | ||
1853 | rcu_report_qs_rnp(mask, rsp, rnp, flags); /* rlses rnp->lock */ | 1958 | rcu_report_qs_rnp(mask, rsp, rnp, flags); /* rlses rnp->lock */ |
1959 | if (needwake) | ||
1960 | rcu_gp_kthread_wake(rsp); | ||
1854 | } | 1961 | } |
1855 | } | 1962 | } |
1856 | 1963 | ||
@@ -1951,7 +2058,7 @@ rcu_send_cbs_to_orphanage(int cpu, struct rcu_state *rsp, | |||
1951 | static void rcu_adopt_orphan_cbs(struct rcu_state *rsp, unsigned long flags) | 2058 | static void rcu_adopt_orphan_cbs(struct rcu_state *rsp, unsigned long flags) |
1952 | { | 2059 | { |
1953 | int i; | 2060 | int i; |
1954 | struct rcu_data *rdp = __this_cpu_ptr(rsp->rda); | 2061 | struct rcu_data *rdp = raw_cpu_ptr(rsp->rda); |
1955 | 2062 | ||
1956 | /* No-CBs CPUs are handled specially. */ | 2063 | /* No-CBs CPUs are handled specially. */ |
1957 | if (rcu_nocb_adopt_orphan_cbs(rsp, rdp, flags)) | 2064 | if (rcu_nocb_adopt_orphan_cbs(rsp, rdp, flags)) |
@@ -2320,7 +2427,7 @@ static void force_quiescent_state(struct rcu_state *rsp) | |||
2320 | raw_spin_unlock_irqrestore(&rnp_old->lock, flags); | 2427 | raw_spin_unlock_irqrestore(&rnp_old->lock, flags); |
2321 | return; /* Someone beat us to it. */ | 2428 | return; /* Someone beat us to it. */ |
2322 | } | 2429 | } |
2323 | rsp->gp_flags |= RCU_GP_FLAG_FQS; | 2430 | ACCESS_ONCE(rsp->gp_flags) |= RCU_GP_FLAG_FQS; |
2324 | raw_spin_unlock_irqrestore(&rnp_old->lock, flags); | 2431 | raw_spin_unlock_irqrestore(&rnp_old->lock, flags); |
2325 | wake_up(&rsp->gp_wq); /* Memory barrier implied by wake_up() path. */ | 2432 | wake_up(&rsp->gp_wq); /* Memory barrier implied by wake_up() path. */ |
2326 | } | 2433 | } |
@@ -2334,7 +2441,8 @@ static void | |||
2334 | __rcu_process_callbacks(struct rcu_state *rsp) | 2441 | __rcu_process_callbacks(struct rcu_state *rsp) |
2335 | { | 2442 | { |
2336 | unsigned long flags; | 2443 | unsigned long flags; |
2337 | struct rcu_data *rdp = __this_cpu_ptr(rsp->rda); | 2444 | bool needwake; |
2445 | struct rcu_data *rdp = raw_cpu_ptr(rsp->rda); | ||
2338 | 2446 | ||
2339 | WARN_ON_ONCE(rdp->beenonline == 0); | 2447 | WARN_ON_ONCE(rdp->beenonline == 0); |
2340 | 2448 | ||
@@ -2345,8 +2453,10 @@ __rcu_process_callbacks(struct rcu_state *rsp) | |||
2345 | local_irq_save(flags); | 2453 | local_irq_save(flags); |
2346 | if (cpu_needs_another_gp(rsp, rdp)) { | 2454 | if (cpu_needs_another_gp(rsp, rdp)) { |
2347 | raw_spin_lock(&rcu_get_root(rsp)->lock); /* irqs disabled. */ | 2455 | raw_spin_lock(&rcu_get_root(rsp)->lock); /* irqs disabled. */ |
2348 | rcu_start_gp(rsp); | 2456 | needwake = rcu_start_gp(rsp); |
2349 | raw_spin_unlock_irqrestore(&rcu_get_root(rsp)->lock, flags); | 2457 | raw_spin_unlock_irqrestore(&rcu_get_root(rsp)->lock, flags); |
2458 | if (needwake) | ||
2459 | rcu_gp_kthread_wake(rsp); | ||
2350 | } else { | 2460 | } else { |
2351 | local_irq_restore(flags); | 2461 | local_irq_restore(flags); |
2352 | } | 2462 | } |
@@ -2404,6 +2514,8 @@ static void invoke_rcu_core(void) | |||
2404 | static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp, | 2514 | static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp, |
2405 | struct rcu_head *head, unsigned long flags) | 2515 | struct rcu_head *head, unsigned long flags) |
2406 | { | 2516 | { |
2517 | bool needwake; | ||
2518 | |||
2407 | /* | 2519 | /* |
2408 | * If called from an extended quiescent state, invoke the RCU | 2520 | * If called from an extended quiescent state, invoke the RCU |
2409 | * core in order to force a re-evaluation of RCU's idleness. | 2521 | * core in order to force a re-evaluation of RCU's idleness. |
@@ -2433,8 +2545,10 @@ static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp, | |||
2433 | 2545 | ||
2434 | raw_spin_lock(&rnp_root->lock); | 2546 | raw_spin_lock(&rnp_root->lock); |
2435 | smp_mb__after_unlock_lock(); | 2547 | smp_mb__after_unlock_lock(); |
2436 | rcu_start_gp(rsp); | 2548 | needwake = rcu_start_gp(rsp); |
2437 | raw_spin_unlock(&rnp_root->lock); | 2549 | raw_spin_unlock(&rnp_root->lock); |
2550 | if (needwake) | ||
2551 | rcu_gp_kthread_wake(rsp); | ||
2438 | } else { | 2552 | } else { |
2439 | /* Give the grace period a kick. */ | 2553 | /* Give the grace period a kick. */ |
2440 | rdp->blimit = LONG_MAX; | 2554 | rdp->blimit = LONG_MAX; |
@@ -2537,6 +2651,20 @@ void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
2537 | EXPORT_SYMBOL_GPL(call_rcu_bh); | 2651 | EXPORT_SYMBOL_GPL(call_rcu_bh); |
2538 | 2652 | ||
2539 | /* | 2653 | /* |
2654 | * Queue an RCU callback for lazy invocation after a grace period. | ||
2655 | * This will likely be later named something like "call_rcu_lazy()", | ||
2656 | * but this change will require some way of tagging the lazy RCU | ||
2657 | * callbacks in the list of pending callbacks. Until then, this | ||
2658 | * function may only be called from __kfree_rcu(). | ||
2659 | */ | ||
2660 | void kfree_call_rcu(struct rcu_head *head, | ||
2661 | void (*func)(struct rcu_head *rcu)) | ||
2662 | { | ||
2663 | __call_rcu(head, func, rcu_state_p, -1, 1); | ||
2664 | } | ||
2665 | EXPORT_SYMBOL_GPL(kfree_call_rcu); | ||
2666 | |||
2667 | /* | ||
2540 | * Because a context switch is a grace period for RCU-sched and RCU-bh, | 2668 | * Because a context switch is a grace period for RCU-sched and RCU-bh, |
2541 | * any blocking grace-period wait automatically implies a grace period | 2669 | * any blocking grace-period wait automatically implies a grace period |
2542 | * if there is only one CPU online at any point time during execution | 2670 | * if there is only one CPU online at any point time during execution |
@@ -2659,7 +2787,7 @@ unsigned long get_state_synchronize_rcu(void) | |||
2659 | * time-consuming work between get_state_synchronize_rcu() | 2787 | * time-consuming work between get_state_synchronize_rcu() |
2660 | * and cond_synchronize_rcu(). | 2788 | * and cond_synchronize_rcu(). |
2661 | */ | 2789 | */ |
2662 | return smp_load_acquire(&rcu_state->gpnum); | 2790 | return smp_load_acquire(&rcu_state_p->gpnum); |
2663 | } | 2791 | } |
2664 | EXPORT_SYMBOL_GPL(get_state_synchronize_rcu); | 2792 | EXPORT_SYMBOL_GPL(get_state_synchronize_rcu); |
2665 | 2793 | ||
@@ -2685,7 +2813,7 @@ void cond_synchronize_rcu(unsigned long oldstate) | |||
2685 | * Ensure that this load happens before any RCU-destructive | 2813 | * Ensure that this load happens before any RCU-destructive |
2686 | * actions the caller might carry out after we return. | 2814 | * actions the caller might carry out after we return. |
2687 | */ | 2815 | */ |
2688 | newstate = smp_load_acquire(&rcu_state->completed); | 2816 | newstate = smp_load_acquire(&rcu_state_p->completed); |
2689 | if (ULONG_CMP_GE(oldstate, newstate)) | 2817 | if (ULONG_CMP_GE(oldstate, newstate)) |
2690 | synchronize_rcu(); | 2818 | synchronize_rcu(); |
2691 | } | 2819 | } |
@@ -2988,7 +3116,7 @@ static void rcu_barrier_callback(struct rcu_head *rhp) | |||
2988 | static void rcu_barrier_func(void *type) | 3116 | static void rcu_barrier_func(void *type) |
2989 | { | 3117 | { |
2990 | struct rcu_state *rsp = type; | 3118 | struct rcu_state *rsp = type; |
2991 | struct rcu_data *rdp = __this_cpu_ptr(rsp->rda); | 3119 | struct rcu_data *rdp = raw_cpu_ptr(rsp->rda); |
2992 | 3120 | ||
2993 | _rcu_barrier_trace(rsp, "IRQ", -1, rsp->n_barrier_done); | 3121 | _rcu_barrier_trace(rsp, "IRQ", -1, rsp->n_barrier_done); |
2994 | atomic_inc(&rsp->barrier_cpu_count); | 3122 | atomic_inc(&rsp->barrier_cpu_count); |
@@ -3160,7 +3288,7 @@ rcu_boot_init_percpu_data(int cpu, struct rcu_state *rsp) | |||
3160 | * that this CPU cannot possibly have any RCU callbacks in flight yet. | 3288 | * that this CPU cannot possibly have any RCU callbacks in flight yet. |
3161 | */ | 3289 | */ |
3162 | static void | 3290 | static void |
3163 | rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible) | 3291 | rcu_init_percpu_data(int cpu, struct rcu_state *rsp) |
3164 | { | 3292 | { |
3165 | unsigned long flags; | 3293 | unsigned long flags; |
3166 | unsigned long mask; | 3294 | unsigned long mask; |
@@ -3173,7 +3301,6 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible) | |||
3173 | /* Set up local state, ensuring consistent view of global state. */ | 3301 | /* Set up local state, ensuring consistent view of global state. */ |
3174 | raw_spin_lock_irqsave(&rnp->lock, flags); | 3302 | raw_spin_lock_irqsave(&rnp->lock, flags); |
3175 | rdp->beenonline = 1; /* We have now been online. */ | 3303 | rdp->beenonline = 1; /* We have now been online. */ |
3176 | rdp->preemptible = preemptible; | ||
3177 | rdp->qlen_last_fqs_check = 0; | 3304 | rdp->qlen_last_fqs_check = 0; |
3178 | rdp->n_force_qs_snap = rsp->n_force_qs; | 3305 | rdp->n_force_qs_snap = rsp->n_force_qs; |
3179 | rdp->blimit = blimit; | 3306 | rdp->blimit = blimit; |
@@ -3217,8 +3344,7 @@ static void rcu_prepare_cpu(int cpu) | |||
3217 | struct rcu_state *rsp; | 3344 | struct rcu_state *rsp; |
3218 | 3345 | ||
3219 | for_each_rcu_flavor(rsp) | 3346 | for_each_rcu_flavor(rsp) |
3220 | rcu_init_percpu_data(cpu, rsp, | 3347 | rcu_init_percpu_data(cpu, rsp); |
3221 | strcmp(rsp->name, "rcu_preempt") == 0); | ||
3222 | } | 3348 | } |
3223 | 3349 | ||
3224 | /* | 3350 | /* |
@@ -3228,7 +3354,7 @@ static int rcu_cpu_notify(struct notifier_block *self, | |||
3228 | unsigned long action, void *hcpu) | 3354 | unsigned long action, void *hcpu) |
3229 | { | 3355 | { |
3230 | long cpu = (long)hcpu; | 3356 | long cpu = (long)hcpu; |
3231 | struct rcu_data *rdp = per_cpu_ptr(rcu_state->rda, cpu); | 3357 | struct rcu_data *rdp = per_cpu_ptr(rcu_state_p->rda, cpu); |
3232 | struct rcu_node *rnp = rdp->mynode; | 3358 | struct rcu_node *rnp = rdp->mynode; |
3233 | struct rcu_state *rsp; | 3359 | struct rcu_state *rsp; |
3234 | 3360 | ||
@@ -3402,8 +3528,8 @@ static void __init rcu_init_one(struct rcu_state *rsp, | |||
3402 | rnp->qsmaskinit = 0; | 3528 | rnp->qsmaskinit = 0; |
3403 | rnp->grplo = j * cpustride; | 3529 | rnp->grplo = j * cpustride; |
3404 | rnp->grphi = (j + 1) * cpustride - 1; | 3530 | rnp->grphi = (j + 1) * cpustride - 1; |
3405 | if (rnp->grphi >= NR_CPUS) | 3531 | if (rnp->grphi >= nr_cpu_ids) |
3406 | rnp->grphi = NR_CPUS - 1; | 3532 | rnp->grphi = nr_cpu_ids - 1; |
3407 | if (i == 0) { | 3533 | if (i == 0) { |
3408 | rnp->grpnum = 0; | 3534 | rnp->grpnum = 0; |
3409 | rnp->grpmask = 0; | 3535 | rnp->grpmask = 0; |
@@ -3422,7 +3548,6 @@ static void __init rcu_init_one(struct rcu_state *rsp, | |||
3422 | 3548 | ||
3423 | rsp->rda = rda; | 3549 | rsp->rda = rda; |
3424 | init_waitqueue_head(&rsp->gp_wq); | 3550 | init_waitqueue_head(&rsp->gp_wq); |
3425 | init_irq_work(&rsp->wakeup_work, rsp_wakeup); | ||
3426 | rnp = rsp->level[rcu_num_lvls - 1]; | 3551 | rnp = rsp->level[rcu_num_lvls - 1]; |
3427 | for_each_possible_cpu(i) { | 3552 | for_each_possible_cpu(i) { |
3428 | while (i > rnp->grphi) | 3553 | while (i > rnp->grphi) |
diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h index 75dc3c39a02a..bf2c1e669691 100644 --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h | |||
@@ -252,7 +252,6 @@ struct rcu_data { | |||
252 | bool passed_quiesce; /* User-mode/idle loop etc. */ | 252 | bool passed_quiesce; /* User-mode/idle loop etc. */ |
253 | bool qs_pending; /* Core waits for quiesc state. */ | 253 | bool qs_pending; /* Core waits for quiesc state. */ |
254 | bool beenonline; /* CPU online at least once. */ | 254 | bool beenonline; /* CPU online at least once. */ |
255 | bool preemptible; /* Preemptible RCU? */ | ||
256 | struct rcu_node *mynode; /* This CPU's leaf of hierarchy */ | 255 | struct rcu_node *mynode; /* This CPU's leaf of hierarchy */ |
257 | unsigned long grpmask; /* Mask to apply to leaf qsmask. */ | 256 | unsigned long grpmask; /* Mask to apply to leaf qsmask. */ |
258 | #ifdef CONFIG_RCU_CPU_STALL_INFO | 257 | #ifdef CONFIG_RCU_CPU_STALL_INFO |
@@ -406,7 +405,8 @@ struct rcu_state { | |||
406 | unsigned long completed; /* # of last completed gp. */ | 405 | unsigned long completed; /* # of last completed gp. */ |
407 | struct task_struct *gp_kthread; /* Task for grace periods. */ | 406 | struct task_struct *gp_kthread; /* Task for grace periods. */ |
408 | wait_queue_head_t gp_wq; /* Where GP task waits. */ | 407 | wait_queue_head_t gp_wq; /* Where GP task waits. */ |
409 | int gp_flags; /* Commands for GP task. */ | 408 | short gp_flags; /* Commands for GP task. */ |
409 | short gp_state; /* GP kthread sleep state. */ | ||
410 | 410 | ||
411 | /* End of fields guarded by root rcu_node's lock. */ | 411 | /* End of fields guarded by root rcu_node's lock. */ |
412 | 412 | ||
@@ -462,13 +462,17 @@ struct rcu_state { | |||
462 | const char *name; /* Name of structure. */ | 462 | const char *name; /* Name of structure. */ |
463 | char abbr; /* Abbreviated name. */ | 463 | char abbr; /* Abbreviated name. */ |
464 | struct list_head flavors; /* List of RCU flavors. */ | 464 | struct list_head flavors; /* List of RCU flavors. */ |
465 | struct irq_work wakeup_work; /* Postponed wakeups */ | ||
466 | }; | 465 | }; |
467 | 466 | ||
468 | /* Values for rcu_state structure's gp_flags field. */ | 467 | /* Values for rcu_state structure's gp_flags field. */ |
469 | #define RCU_GP_FLAG_INIT 0x1 /* Need grace-period initialization. */ | 468 | #define RCU_GP_FLAG_INIT 0x1 /* Need grace-period initialization. */ |
470 | #define RCU_GP_FLAG_FQS 0x2 /* Need grace-period quiescent-state forcing. */ | 469 | #define RCU_GP_FLAG_FQS 0x2 /* Need grace-period quiescent-state forcing. */ |
471 | 470 | ||
471 | /* Values for rcu_state structure's gp_flags field. */ | ||
472 | #define RCU_GP_WAIT_INIT 0 /* Initial state. */ | ||
473 | #define RCU_GP_WAIT_GPS 1 /* Wait for grace-period start. */ | ||
474 | #define RCU_GP_WAIT_FQS 2 /* Wait for force-quiescent-state time. */ | ||
475 | |||
472 | extern struct list_head rcu_struct_flavors; | 476 | extern struct list_head rcu_struct_flavors; |
473 | 477 | ||
474 | /* Sequence through rcu_state structures for each RCU flavor. */ | 478 | /* Sequence through rcu_state structures for each RCU flavor. */ |
@@ -547,7 +551,6 @@ static void print_cpu_stall_info(struct rcu_state *rsp, int cpu); | |||
547 | static void print_cpu_stall_info_end(void); | 551 | static void print_cpu_stall_info_end(void); |
548 | static void zero_cpu_stall_ticks(struct rcu_data *rdp); | 552 | static void zero_cpu_stall_ticks(struct rcu_data *rdp); |
549 | static void increment_cpu_stall_ticks(void); | 553 | static void increment_cpu_stall_ticks(void); |
550 | static int rcu_nocb_needs_gp(struct rcu_state *rsp); | ||
551 | static void rcu_nocb_gp_set(struct rcu_node *rnp, int nrq); | 554 | static void rcu_nocb_gp_set(struct rcu_node *rnp, int nrq); |
552 | static void rcu_nocb_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp); | 555 | static void rcu_nocb_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp); |
553 | static void rcu_init_one_nocb(struct rcu_node *rnp); | 556 | static void rcu_init_one_nocb(struct rcu_node *rnp); |
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 962d1d589929..29977ae84e7e 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h | |||
@@ -116,7 +116,7 @@ static void __init rcu_bootup_announce_oddness(void) | |||
116 | #ifdef CONFIG_TREE_PREEMPT_RCU | 116 | #ifdef CONFIG_TREE_PREEMPT_RCU |
117 | 117 | ||
118 | RCU_STATE_INITIALIZER(rcu_preempt, 'p', call_rcu); | 118 | RCU_STATE_INITIALIZER(rcu_preempt, 'p', call_rcu); |
119 | static struct rcu_state *rcu_state = &rcu_preempt_state; | 119 | static struct rcu_state *rcu_state_p = &rcu_preempt_state; |
120 | 120 | ||
121 | static int rcu_preempted_readers_exp(struct rcu_node *rnp); | 121 | static int rcu_preempted_readers_exp(struct rcu_node *rnp); |
122 | 122 | ||
@@ -149,15 +149,6 @@ long rcu_batches_completed(void) | |||
149 | EXPORT_SYMBOL_GPL(rcu_batches_completed); | 149 | EXPORT_SYMBOL_GPL(rcu_batches_completed); |
150 | 150 | ||
151 | /* | 151 | /* |
152 | * Force a quiescent state for preemptible RCU. | ||
153 | */ | ||
154 | void rcu_force_quiescent_state(void) | ||
155 | { | ||
156 | force_quiescent_state(&rcu_preempt_state); | ||
157 | } | ||
158 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); | ||
159 | |||
160 | /* | ||
161 | * Record a preemptible-RCU quiescent state for the specified CPU. Note | 152 | * Record a preemptible-RCU quiescent state for the specified CPU. Note |
162 | * that this just means that the task currently running on the CPU is | 153 | * that this just means that the task currently running on the CPU is |
163 | * not in a quiescent state. There might be any number of tasks blocked | 154 | * not in a quiescent state. There might be any number of tasks blocked |
@@ -688,20 +679,6 @@ void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
688 | } | 679 | } |
689 | EXPORT_SYMBOL_GPL(call_rcu); | 680 | EXPORT_SYMBOL_GPL(call_rcu); |
690 | 681 | ||
691 | /* | ||
692 | * Queue an RCU callback for lazy invocation after a grace period. | ||
693 | * This will likely be later named something like "call_rcu_lazy()", | ||
694 | * but this change will require some way of tagging the lazy RCU | ||
695 | * callbacks in the list of pending callbacks. Until then, this | ||
696 | * function may only be called from __kfree_rcu(). | ||
697 | */ | ||
698 | void kfree_call_rcu(struct rcu_head *head, | ||
699 | void (*func)(struct rcu_head *rcu)) | ||
700 | { | ||
701 | __call_rcu(head, func, &rcu_preempt_state, -1, 1); | ||
702 | } | ||
703 | EXPORT_SYMBOL_GPL(kfree_call_rcu); | ||
704 | |||
705 | /** | 682 | /** |
706 | * synchronize_rcu - wait until a grace period has elapsed. | 683 | * synchronize_rcu - wait until a grace period has elapsed. |
707 | * | 684 | * |
@@ -970,7 +947,7 @@ void exit_rcu(void) | |||
970 | 947 | ||
971 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 948 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
972 | 949 | ||
973 | static struct rcu_state *rcu_state = &rcu_sched_state; | 950 | static struct rcu_state *rcu_state_p = &rcu_sched_state; |
974 | 951 | ||
975 | /* | 952 | /* |
976 | * Tell them what RCU they are running. | 953 | * Tell them what RCU they are running. |
@@ -991,16 +968,6 @@ long rcu_batches_completed(void) | |||
991 | EXPORT_SYMBOL_GPL(rcu_batches_completed); | 968 | EXPORT_SYMBOL_GPL(rcu_batches_completed); |
992 | 969 | ||
993 | /* | 970 | /* |
994 | * Force a quiescent state for RCU, which, because there is no preemptible | ||
995 | * RCU, becomes the same as rcu-sched. | ||
996 | */ | ||
997 | void rcu_force_quiescent_state(void) | ||
998 | { | ||
999 | rcu_sched_force_quiescent_state(); | ||
1000 | } | ||
1001 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); | ||
1002 | |||
1003 | /* | ||
1004 | * Because preemptible RCU does not exist, we never have to check for | 971 | * Because preemptible RCU does not exist, we never have to check for |
1005 | * CPUs being in quiescent states. | 972 | * CPUs being in quiescent states. |
1006 | */ | 973 | */ |
@@ -1080,22 +1047,6 @@ static void rcu_preempt_check_callbacks(int cpu) | |||
1080 | } | 1047 | } |
1081 | 1048 | ||
1082 | /* | 1049 | /* |
1083 | * Queue an RCU callback for lazy invocation after a grace period. | ||
1084 | * This will likely be later named something like "call_rcu_lazy()", | ||
1085 | * but this change will require some way of tagging the lazy RCU | ||
1086 | * callbacks in the list of pending callbacks. Until then, this | ||
1087 | * function may only be called from __kfree_rcu(). | ||
1088 | * | ||
1089 | * Because there is no preemptible RCU, we use RCU-sched instead. | ||
1090 | */ | ||
1091 | void kfree_call_rcu(struct rcu_head *head, | ||
1092 | void (*func)(struct rcu_head *rcu)) | ||
1093 | { | ||
1094 | __call_rcu(head, func, &rcu_sched_state, -1, 1); | ||
1095 | } | ||
1096 | EXPORT_SYMBOL_GPL(kfree_call_rcu); | ||
1097 | |||
1098 | /* | ||
1099 | * Wait for an rcu-preempt grace period, but make it happen quickly. | 1050 | * Wait for an rcu-preempt grace period, but make it happen quickly. |
1100 | * But because preemptible RCU does not exist, map to rcu-sched. | 1051 | * But because preemptible RCU does not exist, map to rcu-sched. |
1101 | */ | 1052 | */ |
@@ -1517,11 +1468,11 @@ static int __init rcu_spawn_kthreads(void) | |||
1517 | for_each_possible_cpu(cpu) | 1468 | for_each_possible_cpu(cpu) |
1518 | per_cpu(rcu_cpu_has_work, cpu) = 0; | 1469 | per_cpu(rcu_cpu_has_work, cpu) = 0; |
1519 | BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); | 1470 | BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); |
1520 | rnp = rcu_get_root(rcu_state); | 1471 | rnp = rcu_get_root(rcu_state_p); |
1521 | (void)rcu_spawn_one_boost_kthread(rcu_state, rnp); | 1472 | (void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp); |
1522 | if (NUM_RCU_NODES > 1) { | 1473 | if (NUM_RCU_NODES > 1) { |
1523 | rcu_for_each_leaf_node(rcu_state, rnp) | 1474 | rcu_for_each_leaf_node(rcu_state_p, rnp) |
1524 | (void)rcu_spawn_one_boost_kthread(rcu_state, rnp); | 1475 | (void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp); |
1525 | } | 1476 | } |
1526 | return 0; | 1477 | return 0; |
1527 | } | 1478 | } |
@@ -1529,12 +1480,12 @@ early_initcall(rcu_spawn_kthreads); | |||
1529 | 1480 | ||
1530 | static void rcu_prepare_kthreads(int cpu) | 1481 | static void rcu_prepare_kthreads(int cpu) |
1531 | { | 1482 | { |
1532 | struct rcu_data *rdp = per_cpu_ptr(rcu_state->rda, cpu); | 1483 | struct rcu_data *rdp = per_cpu_ptr(rcu_state_p->rda, cpu); |
1533 | struct rcu_node *rnp = rdp->mynode; | 1484 | struct rcu_node *rnp = rdp->mynode; |
1534 | 1485 | ||
1535 | /* Fire up the incoming CPU's kthread and leaf rcu_node kthread. */ | 1486 | /* Fire up the incoming CPU's kthread and leaf rcu_node kthread. */ |
1536 | if (rcu_scheduler_fully_active) | 1487 | if (rcu_scheduler_fully_active) |
1537 | (void)rcu_spawn_one_boost_kthread(rcu_state, rnp); | 1488 | (void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp); |
1538 | } | 1489 | } |
1539 | 1490 | ||
1540 | #else /* #ifdef CONFIG_RCU_BOOST */ | 1491 | #else /* #ifdef CONFIG_RCU_BOOST */ |
@@ -1744,6 +1695,7 @@ int rcu_needs_cpu(int cpu, unsigned long *dj) | |||
1744 | static void rcu_prepare_for_idle(int cpu) | 1695 | static void rcu_prepare_for_idle(int cpu) |
1745 | { | 1696 | { |
1746 | #ifndef CONFIG_RCU_NOCB_CPU_ALL | 1697 | #ifndef CONFIG_RCU_NOCB_CPU_ALL |
1698 | bool needwake; | ||
1747 | struct rcu_data *rdp; | 1699 | struct rcu_data *rdp; |
1748 | struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); | 1700 | struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); |
1749 | struct rcu_node *rnp; | 1701 | struct rcu_node *rnp; |
@@ -1792,8 +1744,10 @@ static void rcu_prepare_for_idle(int cpu) | |||
1792 | rnp = rdp->mynode; | 1744 | rnp = rdp->mynode; |
1793 | raw_spin_lock(&rnp->lock); /* irqs already disabled. */ | 1745 | raw_spin_lock(&rnp->lock); /* irqs already disabled. */ |
1794 | smp_mb__after_unlock_lock(); | 1746 | smp_mb__after_unlock_lock(); |
1795 | rcu_accelerate_cbs(rsp, rnp, rdp); | 1747 | needwake = rcu_accelerate_cbs(rsp, rnp, rdp); |
1796 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 1748 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
1749 | if (needwake) | ||
1750 | rcu_gp_kthread_wake(rsp); | ||
1797 | } | 1751 | } |
1798 | #endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */ | 1752 | #endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */ |
1799 | } | 1753 | } |
@@ -1855,7 +1809,7 @@ static void rcu_oom_notify_cpu(void *unused) | |||
1855 | struct rcu_data *rdp; | 1809 | struct rcu_data *rdp; |
1856 | 1810 | ||
1857 | for_each_rcu_flavor(rsp) { | 1811 | for_each_rcu_flavor(rsp) { |
1858 | rdp = __this_cpu_ptr(rsp->rda); | 1812 | rdp = raw_cpu_ptr(rsp->rda); |
1859 | if (rdp->qlen_lazy != 0) { | 1813 | if (rdp->qlen_lazy != 0) { |
1860 | atomic_inc(&oom_callback_count); | 1814 | atomic_inc(&oom_callback_count); |
1861 | rsp->call(&rdp->oom_head, rcu_oom_callback); | 1815 | rsp->call(&rdp->oom_head, rcu_oom_callback); |
@@ -1997,7 +1951,7 @@ static void increment_cpu_stall_ticks(void) | |||
1997 | struct rcu_state *rsp; | 1951 | struct rcu_state *rsp; |
1998 | 1952 | ||
1999 | for_each_rcu_flavor(rsp) | 1953 | for_each_rcu_flavor(rsp) |
2000 | __this_cpu_ptr(rsp->rda)->ticks_this_gp++; | 1954 | raw_cpu_inc(rsp->rda->ticks_this_gp); |
2001 | } | 1955 | } |
2002 | 1956 | ||
2003 | #else /* #ifdef CONFIG_RCU_CPU_STALL_INFO */ | 1957 | #else /* #ifdef CONFIG_RCU_CPU_STALL_INFO */ |
@@ -2068,19 +2022,6 @@ static int __init parse_rcu_nocb_poll(char *arg) | |||
2068 | early_param("rcu_nocb_poll", parse_rcu_nocb_poll); | 2022 | early_param("rcu_nocb_poll", parse_rcu_nocb_poll); |
2069 | 2023 | ||
2070 | /* | 2024 | /* |
2071 | * Do any no-CBs CPUs need another grace period? | ||
2072 | * | ||
2073 | * Interrupts must be disabled. If the caller does not hold the root | ||
2074 | * rnp_node structure's ->lock, the results are advisory only. | ||
2075 | */ | ||
2076 | static int rcu_nocb_needs_gp(struct rcu_state *rsp) | ||
2077 | { | ||
2078 | struct rcu_node *rnp = rcu_get_root(rsp); | ||
2079 | |||
2080 | return rnp->need_future_gp[(ACCESS_ONCE(rnp->completed) + 1) & 0x1]; | ||
2081 | } | ||
2082 | |||
2083 | /* | ||
2084 | * Wake up any no-CBs CPUs' kthreads that were waiting on the just-ended | 2025 | * Wake up any no-CBs CPUs' kthreads that were waiting on the just-ended |
2085 | * grace period. | 2026 | * grace period. |
2086 | */ | 2027 | */ |
@@ -2109,7 +2050,7 @@ static void rcu_init_one_nocb(struct rcu_node *rnp) | |||
2109 | } | 2050 | } |
2110 | 2051 | ||
2111 | #ifndef CONFIG_RCU_NOCB_CPU_ALL | 2052 | #ifndef CONFIG_RCU_NOCB_CPU_ALL |
2112 | /* Is the specified CPU a no-CPUs CPU? */ | 2053 | /* Is the specified CPU a no-CBs CPU? */ |
2113 | bool rcu_is_nocb_cpu(int cpu) | 2054 | bool rcu_is_nocb_cpu(int cpu) |
2114 | { | 2055 | { |
2115 | if (have_rcu_nocb_mask) | 2056 | if (have_rcu_nocb_mask) |
@@ -2243,12 +2184,15 @@ static void rcu_nocb_wait_gp(struct rcu_data *rdp) | |||
2243 | unsigned long c; | 2184 | unsigned long c; |
2244 | bool d; | 2185 | bool d; |
2245 | unsigned long flags; | 2186 | unsigned long flags; |
2187 | bool needwake; | ||
2246 | struct rcu_node *rnp = rdp->mynode; | 2188 | struct rcu_node *rnp = rdp->mynode; |
2247 | 2189 | ||
2248 | raw_spin_lock_irqsave(&rnp->lock, flags); | 2190 | raw_spin_lock_irqsave(&rnp->lock, flags); |
2249 | smp_mb__after_unlock_lock(); | 2191 | smp_mb__after_unlock_lock(); |
2250 | c = rcu_start_future_gp(rnp, rdp); | 2192 | needwake = rcu_start_future_gp(rnp, rdp, &c); |
2251 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | 2193 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
2194 | if (needwake) | ||
2195 | rcu_gp_kthread_wake(rdp->rsp); | ||
2252 | 2196 | ||
2253 | /* | 2197 | /* |
2254 | * Wait for the grace period. Do so interruptibly to avoid messing | 2198 | * Wait for the grace period. Do so interruptibly to avoid messing |
@@ -2402,11 +2346,6 @@ static bool init_nocb_callback_list(struct rcu_data *rdp) | |||
2402 | 2346 | ||
2403 | #else /* #ifdef CONFIG_RCU_NOCB_CPU */ | 2347 | #else /* #ifdef CONFIG_RCU_NOCB_CPU */ |
2404 | 2348 | ||
2405 | static int rcu_nocb_needs_gp(struct rcu_state *rsp) | ||
2406 | { | ||
2407 | return 0; | ||
2408 | } | ||
2409 | |||
2410 | static void rcu_nocb_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp) | 2349 | static void rcu_nocb_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp) |
2411 | { | 2350 | { |
2412 | } | 2351 | } |
@@ -2657,20 +2596,6 @@ static bool is_sysidle_rcu_state(struct rcu_state *rsp) | |||
2657 | } | 2596 | } |
2658 | 2597 | ||
2659 | /* | 2598 | /* |
2660 | * Bind the grace-period kthread for the sysidle flavor of RCU to the | ||
2661 | * timekeeping CPU. | ||
2662 | */ | ||
2663 | static void rcu_bind_gp_kthread(void) | ||
2664 | { | ||
2665 | int cpu = ACCESS_ONCE(tick_do_timer_cpu); | ||
2666 | |||
2667 | if (cpu < 0 || cpu >= nr_cpu_ids) | ||
2668 | return; | ||
2669 | if (raw_smp_processor_id() != cpu) | ||
2670 | set_cpus_allowed_ptr(current, cpumask_of(cpu)); | ||
2671 | } | ||
2672 | |||
2673 | /* | ||
2674 | * Return a delay in jiffies based on the number of CPUs, rcu_node | 2599 | * Return a delay in jiffies based on the number of CPUs, rcu_node |
2675 | * leaf fanout, and jiffies tick rate. The idea is to allow larger | 2600 | * leaf fanout, and jiffies tick rate. The idea is to allow larger |
2676 | * systems more time to transition to full-idle state in order to | 2601 | * systems more time to transition to full-idle state in order to |
@@ -2734,7 +2659,8 @@ static void rcu_sysidle(unsigned long j) | |||
2734 | static void rcu_sysidle_cancel(void) | 2659 | static void rcu_sysidle_cancel(void) |
2735 | { | 2660 | { |
2736 | smp_mb(); | 2661 | smp_mb(); |
2737 | ACCESS_ONCE(full_sysidle_state) = RCU_SYSIDLE_NOT; | 2662 | if (full_sysidle_state > RCU_SYSIDLE_SHORT) |
2663 | ACCESS_ONCE(full_sysidle_state) = RCU_SYSIDLE_NOT; | ||
2738 | } | 2664 | } |
2739 | 2665 | ||
2740 | /* | 2666 | /* |
@@ -2880,10 +2806,6 @@ static bool is_sysidle_rcu_state(struct rcu_state *rsp) | |||
2880 | return false; | 2806 | return false; |
2881 | } | 2807 | } |
2882 | 2808 | ||
2883 | static void rcu_bind_gp_kthread(void) | ||
2884 | { | ||
2885 | } | ||
2886 | |||
2887 | static void rcu_sysidle_report_gp(struct rcu_state *rsp, int isidle, | 2809 | static void rcu_sysidle_report_gp(struct rcu_state *rsp, int isidle, |
2888 | unsigned long maxj) | 2810 | unsigned long maxj) |
2889 | { | 2811 | { |
@@ -2914,3 +2836,19 @@ static bool rcu_nohz_full_cpu(struct rcu_state *rsp) | |||
2914 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ | 2836 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ |
2915 | return 0; | 2837 | return 0; |
2916 | } | 2838 | } |
2839 | |||
2840 | /* | ||
2841 | * Bind the grace-period kthread for the sysidle flavor of RCU to the | ||
2842 | * timekeeping CPU. | ||
2843 | */ | ||
2844 | static void rcu_bind_gp_kthread(void) | ||
2845 | { | ||
2846 | #ifdef CONFIG_NO_HZ_FULL | ||
2847 | int cpu = ACCESS_ONCE(tick_do_timer_cpu); | ||
2848 | |||
2849 | if (cpu < 0 || cpu >= nr_cpu_ids) | ||
2850 | return; | ||
2851 | if (raw_smp_processor_id() != cpu) | ||
2852 | set_cpus_allowed_ptr(current, cpumask_of(cpu)); | ||
2853 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ | ||
2854 | } | ||
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index 4c0a9b0af469..a2aeb4df0f60 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c | |||
@@ -320,6 +320,18 @@ int rcu_jiffies_till_stall_check(void) | |||
320 | return till_stall_check * HZ + RCU_STALL_DELAY_DELTA; | 320 | return till_stall_check * HZ + RCU_STALL_DELAY_DELTA; |
321 | } | 321 | } |
322 | 322 | ||
323 | void rcu_sysrq_start(void) | ||
324 | { | ||
325 | if (!rcu_cpu_stall_suppress) | ||
326 | rcu_cpu_stall_suppress = 2; | ||
327 | } | ||
328 | |||
329 | void rcu_sysrq_end(void) | ||
330 | { | ||
331 | if (rcu_cpu_stall_suppress == 2) | ||
332 | rcu_cpu_stall_suppress = 0; | ||
333 | } | ||
334 | |||
323 | static int rcu_panic(struct notifier_block *this, unsigned long ev, void *ptr) | 335 | static int rcu_panic(struct notifier_block *this, unsigned long ev, void *ptr) |
324 | { | 336 | { |
325 | rcu_cpu_stall_suppress = 1; | 337 | rcu_cpu_stall_suppress = 1; |
@@ -338,3 +350,21 @@ static int __init check_cpu_stall_init(void) | |||
338 | early_initcall(check_cpu_stall_init); | 350 | early_initcall(check_cpu_stall_init); |
339 | 351 | ||
340 | #endif /* #ifdef CONFIG_RCU_STALL_COMMON */ | 352 | #endif /* #ifdef CONFIG_RCU_STALL_COMMON */ |
353 | |||
354 | /* | ||
355 | * Hooks for cond_resched() and friends to avoid RCU CPU stall warnings. | ||
356 | */ | ||
357 | |||
358 | DEFINE_PER_CPU(int, rcu_cond_resched_count); | ||
359 | |||
360 | /* | ||
361 | * Report a set of RCU quiescent states, for use by cond_resched() | ||
362 | * and friends. Out of line due to being called infrequently. | ||
363 | */ | ||
364 | void rcu_resched(void) | ||
365 | { | ||
366 | preempt_disable(); | ||
367 | __this_cpu_write(rcu_cond_resched_count, 0); | ||
368 | rcu_note_context_switch(smp_processor_id()); | ||
369 | preempt_enable(); | ||
370 | } | ||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 0a7251678982..71d9a9c93954 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -4084,6 +4084,7 @@ static void __cond_resched(void) | |||
4084 | 4084 | ||
4085 | int __sched _cond_resched(void) | 4085 | int __sched _cond_resched(void) |
4086 | { | 4086 | { |
4087 | rcu_cond_resched(); | ||
4087 | if (should_resched()) { | 4088 | if (should_resched()) { |
4088 | __cond_resched(); | 4089 | __cond_resched(); |
4089 | return 1; | 4090 | return 1; |
@@ -4102,15 +4103,18 @@ EXPORT_SYMBOL(_cond_resched); | |||
4102 | */ | 4103 | */ |
4103 | int __cond_resched_lock(spinlock_t *lock) | 4104 | int __cond_resched_lock(spinlock_t *lock) |
4104 | { | 4105 | { |
4106 | bool need_rcu_resched = rcu_should_resched(); | ||
4105 | int resched = should_resched(); | 4107 | int resched = should_resched(); |
4106 | int ret = 0; | 4108 | int ret = 0; |
4107 | 4109 | ||
4108 | lockdep_assert_held(lock); | 4110 | lockdep_assert_held(lock); |
4109 | 4111 | ||
4110 | if (spin_needbreak(lock) || resched) { | 4112 | if (spin_needbreak(lock) || resched || need_rcu_resched) { |
4111 | spin_unlock(lock); | 4113 | spin_unlock(lock); |
4112 | if (resched) | 4114 | if (resched) |
4113 | __cond_resched(); | 4115 | __cond_resched(); |
4116 | else if (unlikely(need_rcu_resched)) | ||
4117 | rcu_resched(); | ||
4114 | else | 4118 | else |
4115 | cpu_relax(); | 4119 | cpu_relax(); |
4116 | ret = 1; | 4120 | ret = 1; |
@@ -4124,6 +4128,7 @@ int __sched __cond_resched_softirq(void) | |||
4124 | { | 4128 | { |
4125 | BUG_ON(!in_softirq()); | 4129 | BUG_ON(!in_softirq()); |
4126 | 4130 | ||
4131 | rcu_cond_resched(); /* BH disabled OK, just recording QSes. */ | ||
4127 | if (should_resched()) { | 4132 | if (should_resched()) { |
4128 | local_bh_enable(); | 4133 | local_bh_enable(); |
4129 | __cond_resched(); | 4134 | __cond_resched(); |
diff --git a/kernel/softirq.c b/kernel/softirq.c index 92f24f5e8d52..5918d227730f 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -232,7 +232,6 @@ asmlinkage __visible void __do_softirq(void) | |||
232 | bool in_hardirq; | 232 | bool in_hardirq; |
233 | __u32 pending; | 233 | __u32 pending; |
234 | int softirq_bit; | 234 | int softirq_bit; |
235 | int cpu; | ||
236 | 235 | ||
237 | /* | 236 | /* |
238 | * Mask out PF_MEMALLOC s current task context is borrowed for the | 237 | * Mask out PF_MEMALLOC s current task context is borrowed for the |
@@ -247,7 +246,6 @@ asmlinkage __visible void __do_softirq(void) | |||
247 | __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); | 246 | __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); |
248 | in_hardirq = lockdep_softirq_start(); | 247 | in_hardirq = lockdep_softirq_start(); |
249 | 248 | ||
250 | cpu = smp_processor_id(); | ||
251 | restart: | 249 | restart: |
252 | /* Reset the pending bitmask before enabling irqs */ | 250 | /* Reset the pending bitmask before enabling irqs */ |
253 | set_softirq_pending(0); | 251 | set_softirq_pending(0); |
@@ -276,11 +274,11 @@ restart: | |||
276 | prev_count, preempt_count()); | 274 | prev_count, preempt_count()); |
277 | preempt_count_set(prev_count); | 275 | preempt_count_set(prev_count); |
278 | } | 276 | } |
279 | rcu_bh_qs(cpu); | ||
280 | h++; | 277 | h++; |
281 | pending >>= softirq_bit; | 278 | pending >>= softirq_bit; |
282 | } | 279 | } |
283 | 280 | ||
281 | rcu_bh_qs(smp_processor_id()); | ||
284 | local_irq_disable(); | 282 | local_irq_disable(); |
285 | 283 | ||
286 | pending = local_softirq_pending(); | 284 | pending = local_softirq_pending(); |
diff --git a/kernel/torture.c b/kernel/torture.c index acc9afc2f26e..40bb511cca48 100644 --- a/kernel/torture.c +++ b/kernel/torture.c | |||
@@ -335,13 +335,8 @@ static void torture_shuffle_tasks(void) | |||
335 | shuffle_idle_cpu = cpumask_next(shuffle_idle_cpu, shuffle_tmp_mask); | 335 | shuffle_idle_cpu = cpumask_next(shuffle_idle_cpu, shuffle_tmp_mask); |
336 | if (shuffle_idle_cpu >= nr_cpu_ids) | 336 | if (shuffle_idle_cpu >= nr_cpu_ids) |
337 | shuffle_idle_cpu = -1; | 337 | shuffle_idle_cpu = -1; |
338 | if (shuffle_idle_cpu != -1) { | 338 | else |
339 | cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask); | 339 | cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask); |
340 | if (cpumask_empty(shuffle_tmp_mask)) { | ||
341 | put_online_cpus(); | ||
342 | return; | ||
343 | } | ||
344 | } | ||
345 | 340 | ||
346 | mutex_lock(&shuffle_task_mutex); | 341 | mutex_lock(&shuffle_task_mutex); |
347 | list_for_each_entry(stp, &shuffle_task_list, st_l) | 342 | list_for_each_entry(stp, &shuffle_task_list, st_l) |
@@ -533,7 +528,11 @@ void stutter_wait(const char *title) | |||
533 | while (ACCESS_ONCE(stutter_pause_test) || | 528 | while (ACCESS_ONCE(stutter_pause_test) || |
534 | (torture_runnable && !ACCESS_ONCE(*torture_runnable))) { | 529 | (torture_runnable && !ACCESS_ONCE(*torture_runnable))) { |
535 | if (stutter_pause_test) | 530 | if (stutter_pause_test) |
536 | schedule_timeout_interruptible(1); | 531 | if (ACCESS_ONCE(stutter_pause_test) == 1) |
532 | schedule_timeout_interruptible(1); | ||
533 | else | ||
534 | while (ACCESS_ONCE(stutter_pause_test)) | ||
535 | cond_resched(); | ||
537 | else | 536 | else |
538 | schedule_timeout_interruptible(round_jiffies_relative(HZ)); | 537 | schedule_timeout_interruptible(round_jiffies_relative(HZ)); |
539 | torture_shutdown_absorb(title); | 538 | torture_shutdown_absorb(title); |
@@ -550,7 +549,11 @@ static int torture_stutter(void *arg) | |||
550 | VERBOSE_TOROUT_STRING("torture_stutter task started"); | 549 | VERBOSE_TOROUT_STRING("torture_stutter task started"); |
551 | do { | 550 | do { |
552 | if (!torture_must_stop()) { | 551 | if (!torture_must_stop()) { |
553 | schedule_timeout_interruptible(stutter); | 552 | if (stutter > 1) { |
553 | schedule_timeout_interruptible(stutter - 1); | ||
554 | ACCESS_ONCE(stutter_pause_test) = 2; | ||
555 | } | ||
556 | schedule_timeout_interruptible(1); | ||
554 | ACCESS_ONCE(stutter_pause_test) = 1; | 557 | ACCESS_ONCE(stutter_pause_test) = 1; |
555 | } | 558 | } |
556 | if (!torture_must_stop()) | 559 | if (!torture_must_stop()) |
@@ -596,21 +599,27 @@ static void torture_stutter_cleanup(void) | |||
596 | * The runnable parameter points to a flag that controls whether or not | 599 | * The runnable parameter points to a flag that controls whether or not |
597 | * the test is currently runnable. If there is no such flag, pass in NULL. | 600 | * the test is currently runnable. If there is no such flag, pass in NULL. |
598 | */ | 601 | */ |
599 | void __init torture_init_begin(char *ttype, bool v, int *runnable) | 602 | bool torture_init_begin(char *ttype, bool v, int *runnable) |
600 | { | 603 | { |
601 | mutex_lock(&fullstop_mutex); | 604 | mutex_lock(&fullstop_mutex); |
605 | if (torture_type != NULL) { | ||
606 | pr_alert("torture_init_begin: refusing %s init: %s running", | ||
607 | ttype, torture_type); | ||
608 | mutex_unlock(&fullstop_mutex); | ||
609 | return false; | ||
610 | } | ||
602 | torture_type = ttype; | 611 | torture_type = ttype; |
603 | verbose = v; | 612 | verbose = v; |
604 | torture_runnable = runnable; | 613 | torture_runnable = runnable; |
605 | fullstop = FULLSTOP_DONTSTOP; | 614 | fullstop = FULLSTOP_DONTSTOP; |
606 | 615 | return true; | |
607 | } | 616 | } |
608 | EXPORT_SYMBOL_GPL(torture_init_begin); | 617 | EXPORT_SYMBOL_GPL(torture_init_begin); |
609 | 618 | ||
610 | /* | 619 | /* |
611 | * Tell the torture module that initialization is complete. | 620 | * Tell the torture module that initialization is complete. |
612 | */ | 621 | */ |
613 | void __init torture_init_end(void) | 622 | void torture_init_end(void) |
614 | { | 623 | { |
615 | mutex_unlock(&fullstop_mutex); | 624 | mutex_unlock(&fullstop_mutex); |
616 | register_reboot_notifier(&torture_shutdown_nb); | 625 | register_reboot_notifier(&torture_shutdown_nb); |
@@ -642,6 +651,9 @@ bool torture_cleanup(void) | |||
642 | torture_shuffle_cleanup(); | 651 | torture_shuffle_cleanup(); |
643 | torture_stutter_cleanup(); | 652 | torture_stutter_cleanup(); |
644 | torture_onoff_cleanup(); | 653 | torture_onoff_cleanup(); |
654 | mutex_lock(&fullstop_mutex); | ||
655 | torture_type = NULL; | ||
656 | mutex_unlock(&fullstop_mutex); | ||
645 | return false; | 657 | return false; |
646 | } | 658 | } |
647 | EXPORT_SYMBOL_GPL(torture_cleanup); | 659 | EXPORT_SYMBOL_GPL(torture_cleanup); |
@@ -674,8 +686,10 @@ EXPORT_SYMBOL_GPL(torture_must_stop_irq); | |||
674 | */ | 686 | */ |
675 | void torture_kthread_stopping(char *title) | 687 | void torture_kthread_stopping(char *title) |
676 | { | 688 | { |
677 | if (verbose) | 689 | char buf[128]; |
678 | VERBOSE_TOROUT_STRING(title); | 690 | |
691 | snprintf(buf, sizeof(buf), "Stopping %s", title); | ||
692 | VERBOSE_TOROUT_STRING(buf); | ||
679 | while (!kthread_should_stop()) { | 693 | while (!kthread_should_stop()) { |
680 | torture_shutdown_absorb(title); | 694 | torture_shutdown_absorb(title); |
681 | schedule_timeout_uninterruptible(1); | 695 | schedule_timeout_uninterruptible(1); |