Skip to content

Commit 2db7ab8

Browse files
paulmckrcufbq
authored andcommitted
rcutorture: Expand failure/close-call grace-period output
With only eight bits per grace-period sequence number, wrap can happen in 64 grace periods. This commit therefore increases this to sixteen bits for normal grace-period sequence numbers and the combined short-form polling sequence numbers, thus deferring wrap for at least 16,384 grace periods. Because expedited grace periods go faster, expand these to 24 bits, deferring wrap for at least 4,194,304 expedited grace periods. These longer wrap times makes it easier to correlate these numbers to trace-event output. Note that the low-order two bits are reserved for intra-grace-period state, hence the above wrap numbers being a factor of four smaller than you might expect. Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
1 parent 84ae910 commit 2db7ab8

File tree

4 files changed

+21
-21
lines changed

4 files changed

+21
-21
lines changed

kernel/rcu/rcu.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,8 +590,8 @@ void do_trace_rcu_torture_read(const char *rcutorturename,
590590
#endif
591591
static inline void rcu_gp_set_torture_wait(int duration) { }
592592
#endif
593-
unsigned long rcutorture_gather_gp_seqs(void);
594-
void rcutorture_format_gp_seqs(unsigned long seqs, char *cp);
593+
unsigned long long rcutorture_gather_gp_seqs(void);
594+
void rcutorture_format_gp_seqs(unsigned long long seqs, char *cp);
595595

596596
#ifdef CONFIG_TINY_SRCU
597597

kernel/rcu/rcutorture.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,8 @@ struct rt_read_seg {
273273
bool rt_preempted;
274274
int rt_cpu;
275275
int rt_end_cpu;
276-
unsigned long rt_gp_seq;
277-
unsigned long rt_gp_seq_end;
276+
unsigned long long rt_gp_seq;
277+
unsigned long long rt_gp_seq_end;
278278
};
279279
static int err_segs_recorded;
280280
static struct rt_read_seg err_segs[RCUTORTURE_RDR_MAX_SEGS];
@@ -409,8 +409,8 @@ struct rcu_torture_ops {
409409
void (*gp_slow_register)(atomic_t *rgssp);
410410
void (*gp_slow_unregister)(atomic_t *rgssp);
411411
bool (*reader_blocked)(void);
412-
unsigned long (*gather_gp_seqs)(void);
413-
void (*format_gp_seqs)(unsigned long seqs, char *cp);
412+
unsigned long long (*gather_gp_seqs)(void);
413+
void (*format_gp_seqs)(unsigned long long seqs, char *cp);
414414
long cbflood_max;
415415
int irq_capable;
416416
int can_boost;
@@ -3678,8 +3678,8 @@ rcu_torture_cleanup(void)
36783678
}
36793679
if (IS_ENABLED(CONFIG_RCU_TORTURE_TEST_LOG_GP) &&
36803680
cur_ops->gather_gp_seqs && cur_ops->format_gp_seqs) {
3681-
char buf1[16+1];
3682-
char buf2[16+1];
3681+
char buf1[20+1];
3682+
char buf2[20+1];
36833683
char sepchar = '-';
36843684

36853685
cur_ops->format_gp_seqs(err_segs[i].rt_gp_seq, buf1);

kernel/rcu/tiny.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,15 +258,15 @@ EXPORT_SYMBOL_GPL(kvfree_call_rcu);
258258
#endif
259259

260260
#if IS_ENABLED(CONFIG_RCU_TORTURE_TEST)
261-
unsigned long rcutorture_gather_gp_seqs(void)
261+
unsigned long long rcutorture_gather_gp_seqs(void)
262262
{
263-
return READ_ONCE(rcu_ctrlblk.gp_seq) & 0xff;
263+
return READ_ONCE(rcu_ctrlblk.gp_seq) & 0xffffULL;
264264
}
265265
EXPORT_SYMBOL_GPL(rcutorture_gather_gp_seqs);
266266

267-
void rcutorture_format_gp_seqs(unsigned long seqs, char *cp)
267+
void rcutorture_format_gp_seqs(unsigned long long seqs, char *cp)
268268
{
269-
snprintf(cp, 8, "g%02lx", seqs & 0xff);
269+
snprintf(cp, 8, "g%04llx", seqs & 0xffffULL);
270270
}
271271
EXPORT_SYMBOL_GPL(rcutorture_format_gp_seqs);
272272
#endif

kernel/rcu/tree.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -539,22 +539,22 @@ void rcutorture_get_gp_data(int *flags, unsigned long *gp_seq)
539539
EXPORT_SYMBOL_GPL(rcutorture_get_gp_data);
540540

541541
/* Gather grace-period sequence numbers for rcutorture diagnostics. */
542-
unsigned long rcutorture_gather_gp_seqs(void)
542+
unsigned long long rcutorture_gather_gp_seqs(void)
543543
{
544-
return ((READ_ONCE(rcu_state.gp_seq) & 0xff) << 16) |
545-
((READ_ONCE(rcu_state.expedited_sequence) & 0xff) << 8) |
546-
(READ_ONCE(rcu_state.gp_seq_polled) & 0xff);
544+
return ((READ_ONCE(rcu_state.gp_seq) & 0xffffULL) << 40) |
545+
((READ_ONCE(rcu_state.expedited_sequence) & 0xffffffULL) << 16) |
546+
(READ_ONCE(rcu_state.gp_seq_polled) & 0xffffULL);
547547
}
548548
EXPORT_SYMBOL_GPL(rcutorture_gather_gp_seqs);
549549

550550
/* Format grace-period sequence numbers for rcutorture diagnostics. */
551-
void rcutorture_format_gp_seqs(unsigned long seqs, char *cp)
551+
void rcutorture_format_gp_seqs(unsigned long long seqs, char *cp)
552552
{
553-
unsigned int egp = (seqs >> 8) & 0xff;
554-
unsigned int ggp = (seqs >> 16) & 0xff;
555-
unsigned int pgp = seqs & 0xff;
553+
unsigned int egp = (seqs >> 16) & 0xffffffULL;
554+
unsigned int ggp = (seqs >> 40) & 0xffffULL;
555+
unsigned int pgp = seqs & 0xffffULL;
556556

557-
snprintf(cp, 16, "g%02x:e%02x:p%02x", ggp, egp, pgp);
557+
snprintf(cp, 20, "g%04x:e%06x:p%04x", ggp, egp, pgp);
558558
}
559559
EXPORT_SYMBOL_GPL(rcutorture_format_gp_seqs);
560560

0 commit comments

Comments
 (0)