aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2017-04-18 20:17:35 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2017-04-26 14:23:28 -0400
commit7f6733c3c648ddd6cf459c1b80ad388a95452955 (patch)
tree2d463d3a2c5b47f3bfb7098e1000ad043ed0842f
parentc7e88067c1ae89e7bcbed070fb2c4e30bc39b51f (diff)
srcu: Make rcutorture writer stalls print SRCU GP state
In the past, SRCU was simple enough that there was little point in making the rcutorture writer stall messages print the SRCU grace-period number state. With the advent of Tree SRCU, this has changed. This commit therefore makes Classic, Tiny, and Tree SRCU report this state to rcutorture as needed. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Tested-by: Mike Galbraith <efault@gmx.de>
-rw-r--r--include/linux/srcuclassic.h14
-rw-r--r--include/linux/srcutiny.h12
-rw-r--r--include/linux/srcutree.h4
-rw-r--r--kernel/rcu/rcutorture.c8
-rw-r--r--kernel/rcu/srcutree.c13
-rw-r--r--kernel/rcu/tree.c12
6 files changed, 52 insertions, 11 deletions
diff --git a/include/linux/srcuclassic.h b/include/linux/srcuclassic.h
index 41cf99930f34..5753f7322262 100644
--- a/include/linux/srcuclassic.h
+++ b/include/linux/srcuclassic.h
@@ -98,4 +98,18 @@ void synchronize_srcu_expedited(struct srcu_struct *sp);
98void srcu_barrier(struct srcu_struct *sp); 98void srcu_barrier(struct srcu_struct *sp);
99unsigned long srcu_batches_completed(struct srcu_struct *sp); 99unsigned long srcu_batches_completed(struct srcu_struct *sp);
100 100
101static inline void srcutorture_get_gp_data(enum rcutorture_type test_type,
102 struct srcu_struct *sp, int *flags,
103 unsigned long *gpnum,
104 unsigned long *completed)
105{
106 if (test_type != SRCU_FLAVOR)
107 return;
108 *flags = 0;
109 *completed = sp->completed;
110 *gpnum = *completed;
111 if (sp->batch_queue.head || sp->batch_check0.head || sp->batch_check0.head)
112 (*gpnum)++;
113}
114
101#endif 115#endif
diff --git a/include/linux/srcutiny.h b/include/linux/srcutiny.h
index 4f284e4f4d8c..42311ee0334f 100644
--- a/include/linux/srcutiny.h
+++ b/include/linux/srcutiny.h
@@ -78,4 +78,16 @@ static inline unsigned long srcu_batches_completed(struct srcu_struct *sp)
78 return 0; 78 return 0;
79} 79}
80 80
81static inline void srcutorture_get_gp_data(enum rcutorture_type test_type,
82 struct srcu_struct *sp, int *flags,
83 unsigned long *gpnum,
84 unsigned long *completed)
85{
86 if (test_type != SRCU_FLAVOR)
87 return;
88 *flags = 0;
89 *completed = sp->srcu_gp_seq;
90 *gpnum = *completed;
91}
92
81#endif 93#endif
diff --git a/include/linux/srcutree.h b/include/linux/srcutree.h
index 94515ff226fb..3865717df124 100644
--- a/include/linux/srcutree.h
+++ b/include/linux/srcutree.h
@@ -140,4 +140,8 @@ void synchronize_srcu_expedited(struct srcu_struct *sp);
140void srcu_barrier(struct srcu_struct *sp); 140void srcu_barrier(struct srcu_struct *sp);
141unsigned long srcu_batches_completed(struct srcu_struct *sp); 141unsigned long srcu_batches_completed(struct srcu_struct *sp);
142 142
143void srcutorture_get_gp_data(enum rcutorture_type test_type,
144 struct srcu_struct *sp, int *flags,
145 unsigned long *gpnum, unsigned long *completed);
146
143#endif 147#endif
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index e9d4527cdd43..ae6e574d4cf5 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1360,12 +1360,14 @@ rcu_torture_stats_print(void)
1360 cur_ops->stats(); 1360 cur_ops->stats();
1361 if (rtcv_snap == rcu_torture_current_version && 1361 if (rtcv_snap == rcu_torture_current_version &&
1362 rcu_torture_current != NULL) { 1362 rcu_torture_current != NULL) {
1363 int __maybe_unused flags; 1363 int __maybe_unused flags = 0;
1364 unsigned long __maybe_unused gpnum; 1364 unsigned long __maybe_unused gpnum = 0;
1365 unsigned long __maybe_unused completed; 1365 unsigned long __maybe_unused completed = 0;
1366 1366
1367 rcutorture_get_gp_data(cur_ops->ttype, 1367 rcutorture_get_gp_data(cur_ops->ttype,
1368 &flags, &gpnum, &completed); 1368 &flags, &gpnum, &completed);
1369 srcutorture_get_gp_data(cur_ops->ttype, srcu_ctlp,
1370 &flags, &gpnum, &completed);
1369 wtp = READ_ONCE(writer_task); 1371 wtp = READ_ONCE(writer_task);
1370 pr_alert("??? Writer stall state %s(%d) g%lu c%lu f%#x ->state %#lx\n", 1372 pr_alert("??? Writer stall state %s(%d) g%lu c%lu f%#x ->state %#lx\n",
1371 rcu_torture_writer_state_getname(), 1373 rcu_torture_writer_state_getname(),
diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
index 1c2c1004b3b1..72b6cce5f591 100644
--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -1011,3 +1011,16 @@ void process_srcu(struct work_struct *work)
1011 srcu_reschedule(sp, atomic_read(&sp->srcu_exp_cnt) ? 0 : SRCU_INTERVAL); 1011 srcu_reschedule(sp, atomic_read(&sp->srcu_exp_cnt) ? 0 : SRCU_INTERVAL);
1012} 1012}
1013EXPORT_SYMBOL_GPL(process_srcu); 1013EXPORT_SYMBOL_GPL(process_srcu);
1014
1015void srcutorture_get_gp_data(enum rcutorture_type test_type,
1016 struct srcu_struct *sp, int *flags,
1017 unsigned long *gpnum,
1018 unsigned long *completed)
1019{
1020 if (test_type != SRCU_FLAVOR)
1021 return;
1022 *flags = 0;
1023 *completed = rcu_seq_ctr(sp->srcu_gp_seq);
1024 *gpnum = rcu_seq_ctr(sp->srcu_gp_seq_needed);
1025}
1026EXPORT_SYMBOL_GPL(srcutorture_get_gp_data);
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 23aa02587d0f..91fff49d5869 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -704,15 +704,11 @@ void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags,
704 default: 704 default:
705 break; 705 break;
706 } 706 }
707 if (rsp != NULL) { 707 if (rsp == NULL)
708 *flags = READ_ONCE(rsp->gp_flags);
709 *gpnum = READ_ONCE(rsp->gpnum);
710 *completed = READ_ONCE(rsp->completed);
711 return; 708 return;
712 } 709 *flags = READ_ONCE(rsp->gp_flags);
713 *flags = 0; 710 *gpnum = READ_ONCE(rsp->gpnum);
714 *gpnum = 0; 711 *completed = READ_ONCE(rsp->completed);
715 *completed = 0;
716} 712}
717EXPORT_SYMBOL_GPL(rcutorture_get_gp_data); 713EXPORT_SYMBOL_GPL(rcutorture_get_gp_data);
718 714