Commit dd1277d2 authored by Paul E. McKenney's avatar Paul E. McKenney

Merge branches 'fixes.2021.10.07a', 'scftorture.2021.09.16a',...

Merge branches 'fixes.2021.10.07a', 'scftorture.2021.09.16a', 'tasks.2021.09.15a', 'torture.2021.09.13b' and 'torturescript.2021.09.16a' into HEAD

fixes.2021.10.07a: Miscellaneous fixes.
scftorture.2021.09.16a: smp_call_function torture-test updates.
tasks.2021.09.15a: Tasks-trace RCU updates.
torture.2021.09.13b: Other torture-test updates.
torturescript.2021.09.16a: Torture-test scripting updates.
...@@ -31,7 +31,7 @@ static inline int rcu_read_lock_trace_held(void) ...@@ -31,7 +31,7 @@ static inline int rcu_read_lock_trace_held(void)
#ifdef CONFIG_TASKS_TRACE_RCU #ifdef CONFIG_TASKS_TRACE_RCU
void rcu_read_unlock_trace_special(struct task_struct *t, int nesting); void rcu_read_unlock_trace_special(struct task_struct *t);
/** /**
* rcu_read_lock_trace - mark beginning of RCU-trace read-side critical section * rcu_read_lock_trace - mark beginning of RCU-trace read-side critical section
...@@ -80,7 +80,8 @@ static inline void rcu_read_unlock_trace(void) ...@@ -80,7 +80,8 @@ static inline void rcu_read_unlock_trace(void)
WRITE_ONCE(t->trc_reader_nesting, nesting); WRITE_ONCE(t->trc_reader_nesting, nesting);
return; // We assume shallow reader nesting. return; // We assume shallow reader nesting.
} }
rcu_read_unlock_trace_special(t, nesting); WARN_ON_ONCE(nesting != 0);
rcu_read_unlock_trace_special(t);
} }
void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func); void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func);
......
...@@ -47,6 +47,14 @@ do { \ ...@@ -47,6 +47,14 @@ do { \
} while (0) } while (0)
void verbose_torout_sleep(void); void verbose_torout_sleep(void);
#define torture_init_error(firsterr) \
({ \
int ___firsterr = (firsterr); \
\
WARN_ONCE(!IS_MODULE(CONFIG_RCU_TORTURE_TEST) && ___firsterr < 0, "Torture-test initialization failed with error code %d\n", ___firsterr); \
___firsterr < 0; \
})
/* Definitions for online/offline exerciser. */ /* Definitions for online/offline exerciser. */
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
int torture_num_online_cpus(void); int torture_num_online_cpus(void);
......
...@@ -1022,23 +1022,23 @@ static int __init lock_torture_init(void) ...@@ -1022,23 +1022,23 @@ static int __init lock_torture_init(void)
if (onoff_interval > 0) { if (onoff_interval > 0) {
firsterr = torture_onoff_init(onoff_holdoff * HZ, firsterr = torture_onoff_init(onoff_holdoff * HZ,
onoff_interval * HZ, NULL); onoff_interval * HZ, NULL);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (shuffle_interval > 0) { if (shuffle_interval > 0) {
firsterr = torture_shuffle_init(shuffle_interval); firsterr = torture_shuffle_init(shuffle_interval);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (shutdown_secs > 0) { if (shutdown_secs > 0) {
firsterr = torture_shutdown_init(shutdown_secs, firsterr = torture_shutdown_init(shutdown_secs,
lock_torture_cleanup); lock_torture_cleanup);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (stutter > 0) { if (stutter > 0) {
firsterr = torture_stutter_init(stutter, stutter); firsterr = torture_stutter_init(stutter, stutter);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
...@@ -1082,7 +1082,7 @@ static int __init lock_torture_init(void) ...@@ -1082,7 +1082,7 @@ static int __init lock_torture_init(void)
/* Create writer. */ /* Create writer. */
firsterr = torture_create_kthread(lock_torture_writer, &cxt.lwsa[i], firsterr = torture_create_kthread(lock_torture_writer, &cxt.lwsa[i],
writer_tasks[i]); writer_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
create_reader: create_reader:
...@@ -1091,13 +1091,13 @@ static int __init lock_torture_init(void) ...@@ -1091,13 +1091,13 @@ static int __init lock_torture_init(void)
/* Create reader. */ /* Create reader. */
firsterr = torture_create_kthread(lock_torture_reader, &cxt.lrsa[j], firsterr = torture_create_kthread(lock_torture_reader, &cxt.lrsa[j],
reader_tasks[j]); reader_tasks[j]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (stat_interval > 0) { if (stat_interval > 0) {
firsterr = torture_create_kthread(lock_torture_stats, NULL, firsterr = torture_create_kthread(lock_torture_stats, NULL,
stats_task); stats_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
torture_init_end(); torture_init_end();
......
...@@ -758,7 +758,7 @@ kfree_scale_init(void) ...@@ -758,7 +758,7 @@ kfree_scale_init(void)
init_waitqueue_head(&shutdown_wq); init_waitqueue_head(&shutdown_wq);
firsterr = torture_create_kthread(kfree_scale_shutdown, NULL, firsterr = torture_create_kthread(kfree_scale_shutdown, NULL,
shutdown_task); shutdown_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} }
...@@ -775,7 +775,7 @@ kfree_scale_init(void) ...@@ -775,7 +775,7 @@ kfree_scale_init(void)
for (i = 0; i < kfree_nrealthreads; i++) { for (i = 0; i < kfree_nrealthreads; i++) {
firsterr = torture_create_kthread(kfree_scale_thread, (void *)i, firsterr = torture_create_kthread(kfree_scale_thread, (void *)i,
kfree_reader_tasks[i]); kfree_reader_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
...@@ -838,7 +838,7 @@ rcu_scale_init(void) ...@@ -838,7 +838,7 @@ rcu_scale_init(void)
init_waitqueue_head(&shutdown_wq); init_waitqueue_head(&shutdown_wq);
firsterr = torture_create_kthread(rcu_scale_shutdown, NULL, firsterr = torture_create_kthread(rcu_scale_shutdown, NULL,
shutdown_task); shutdown_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} }
...@@ -852,7 +852,7 @@ rcu_scale_init(void) ...@@ -852,7 +852,7 @@ rcu_scale_init(void)
for (i = 0; i < nrealreaders; i++) { for (i = 0; i < nrealreaders; i++) {
firsterr = torture_create_kthread(rcu_scale_reader, (void *)i, firsterr = torture_create_kthread(rcu_scale_reader, (void *)i,
reader_tasks[i]); reader_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
while (atomic_read(&n_rcu_scale_reader_started) < nrealreaders) while (atomic_read(&n_rcu_scale_reader_started) < nrealreaders)
...@@ -879,7 +879,7 @@ rcu_scale_init(void) ...@@ -879,7 +879,7 @@ rcu_scale_init(void)
} }
firsterr = torture_create_kthread(rcu_scale_writer, (void *)i, firsterr = torture_create_kthread(rcu_scale_writer, (void *)i,
writer_tasks[i]); writer_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
torture_init_end(); torture_init_end();
......
...@@ -1432,28 +1432,34 @@ static void rcutorture_one_extend(int *readstate, int newstate, ...@@ -1432,28 +1432,34 @@ static void rcutorture_one_extend(int *readstate, int newstate,
/* First, put new protection in place to avoid critical-section gap. */ /* First, put new protection in place to avoid critical-section gap. */
if (statesnew & RCUTORTURE_RDR_BH) if (statesnew & RCUTORTURE_RDR_BH)
local_bh_disable(); local_bh_disable();
if (statesnew & RCUTORTURE_RDR_RBH)
rcu_read_lock_bh();
if (statesnew & RCUTORTURE_RDR_IRQ) if (statesnew & RCUTORTURE_RDR_IRQ)
local_irq_disable(); local_irq_disable();
if (statesnew & RCUTORTURE_RDR_PREEMPT) if (statesnew & RCUTORTURE_RDR_PREEMPT)
preempt_disable(); preempt_disable();
if (statesnew & RCUTORTURE_RDR_RBH)
rcu_read_lock_bh();
if (statesnew & RCUTORTURE_RDR_SCHED) if (statesnew & RCUTORTURE_RDR_SCHED)
rcu_read_lock_sched(); rcu_read_lock_sched();
if (statesnew & RCUTORTURE_RDR_RCU) if (statesnew & RCUTORTURE_RDR_RCU)
idxnew = cur_ops->readlock() << RCUTORTURE_RDR_SHIFT; idxnew = cur_ops->readlock() << RCUTORTURE_RDR_SHIFT;
/* Next, remove old protection, irq first due to bh conflict. */ /*
* Next, remove old protection, in decreasing order of strength
* to avoid unlock paths that aren't safe in the stronger
* context. Namely: BH can not be enabled with disabled interrupts.
* Additionally PREEMPT_RT requires that BH is enabled in preemptible
* context.
*/
if (statesold & RCUTORTURE_RDR_IRQ) if (statesold & RCUTORTURE_RDR_IRQ)
local_irq_enable(); local_irq_enable();
if (statesold & RCUTORTURE_RDR_BH)
local_bh_enable();
if (statesold & RCUTORTURE_RDR_PREEMPT) if (statesold & RCUTORTURE_RDR_PREEMPT)
preempt_enable(); preempt_enable();
if (statesold & RCUTORTURE_RDR_RBH)
rcu_read_unlock_bh();
if (statesold & RCUTORTURE_RDR_SCHED) if (statesold & RCUTORTURE_RDR_SCHED)
rcu_read_unlock_sched(); rcu_read_unlock_sched();
if (statesold & RCUTORTURE_RDR_BH)
local_bh_enable();
if (statesold & RCUTORTURE_RDR_RBH)
rcu_read_unlock_bh();
if (statesold & RCUTORTURE_RDR_RCU) { if (statesold & RCUTORTURE_RDR_RCU) {
bool lockit = !statesnew && !(torture_random(trsp) & 0xffff); bool lockit = !statesnew && !(torture_random(trsp) & 0xffff);
...@@ -1496,6 +1502,9 @@ rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp) ...@@ -1496,6 +1502,9 @@ rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp)
int mask = rcutorture_extend_mask_max(); int mask = rcutorture_extend_mask_max();
unsigned long randmask1 = torture_random(trsp) >> 8; unsigned long randmask1 = torture_random(trsp) >> 8;
unsigned long randmask2 = randmask1 >> 3; unsigned long randmask2 = randmask1 >> 3;
unsigned long preempts = RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED;
unsigned long preempts_irq = preempts | RCUTORTURE_RDR_IRQ;
unsigned long bhs = RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH;
WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT); WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT);
/* Mostly only one bit (need preemption!), sometimes lots of bits. */ /* Mostly only one bit (need preemption!), sometimes lots of bits. */
...@@ -1503,11 +1512,26 @@ rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp) ...@@ -1503,11 +1512,26 @@ rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp)
mask = mask & randmask2; mask = mask & randmask2;
else else
mask = mask & (1 << (randmask2 % RCUTORTURE_RDR_NBITS)); mask = mask & (1 << (randmask2 % RCUTORTURE_RDR_NBITS));
/* Can't enable bh w/irq disabled. */
if ((mask & RCUTORTURE_RDR_IRQ) && /*
((!(mask & RCUTORTURE_RDR_BH) && (oldmask & RCUTORTURE_RDR_BH)) || * Can't enable bh w/irq disabled.
(!(mask & RCUTORTURE_RDR_RBH) && (oldmask & RCUTORTURE_RDR_RBH)))) */
mask |= RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH; if (mask & RCUTORTURE_RDR_IRQ)
mask |= oldmask & bhs;
/*
* Ideally these sequences would be detected in debug builds
* (regardless of RT), but until then don't stop testing
* them on non-RT.
*/
if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
/* Can't modify BH in atomic context */
if (oldmask & preempts_irq)
mask &= ~bhs;
if ((oldmask | mask) & preempts_irq)
mask |= oldmask & bhs;
}
return mask ?: RCUTORTURE_RDR_RCU; return mask ?: RCUTORTURE_RDR_RCU;
} }
...@@ -2741,7 +2765,7 @@ static int rcu_torture_read_exit(void *unused) ...@@ -2741,7 +2765,7 @@ static int rcu_torture_read_exit(void *unused)
static int rcu_torture_read_exit_init(void) static int rcu_torture_read_exit_init(void)
{ {
if (read_exit_burst <= 0) if (read_exit_burst <= 0)
return -EINVAL; return 0;
init_waitqueue_head(&read_exit_wq); init_waitqueue_head(&read_exit_wq);
read_exit_child_stop = false; read_exit_child_stop = false;
read_exit_child_stopped = false; read_exit_child_stopped = false;
...@@ -2819,7 +2843,7 @@ rcu_torture_cleanup(void) ...@@ -2819,7 +2843,7 @@ rcu_torture_cleanup(void)
rcutorture_seq_diff(gp_seq, start_gp_seq)); rcutorture_seq_diff(gp_seq, start_gp_seq));
torture_stop_kthread(rcu_torture_stats, stats_task); torture_stop_kthread(rcu_torture_stats, stats_task);
torture_stop_kthread(rcu_torture_fqs, fqs_task); torture_stop_kthread(rcu_torture_fqs, fqs_task);
if (rcu_torture_can_boost()) if (rcu_torture_can_boost() && rcutor_hp >= 0)
cpuhp_remove_state(rcutor_hp); cpuhp_remove_state(rcutor_hp);
/* /*
...@@ -3037,7 +3061,7 @@ rcu_torture_init(void) ...@@ -3037,7 +3061,7 @@ rcu_torture_init(void)
rcu_torture_write_types(); rcu_torture_write_types();
firsterr = torture_create_kthread(rcu_torture_writer, NULL, firsterr = torture_create_kthread(rcu_torture_writer, NULL,
writer_task); writer_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
if (nfakewriters > 0) { if (nfakewriters > 0) {
fakewriter_tasks = kcalloc(nfakewriters, fakewriter_tasks = kcalloc(nfakewriters,
...@@ -3052,7 +3076,7 @@ rcu_torture_init(void) ...@@ -3052,7 +3076,7 @@ rcu_torture_init(void)
for (i = 0; i < nfakewriters; i++) { for (i = 0; i < nfakewriters; i++) {
firsterr = torture_create_kthread(rcu_torture_fakewriter, firsterr = torture_create_kthread(rcu_torture_fakewriter,
NULL, fakewriter_tasks[i]); NULL, fakewriter_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
reader_tasks = kcalloc(nrealreaders, sizeof(reader_tasks[0]), reader_tasks = kcalloc(nrealreaders, sizeof(reader_tasks[0]),
...@@ -3068,7 +3092,7 @@ rcu_torture_init(void) ...@@ -3068,7 +3092,7 @@ rcu_torture_init(void)
rcu_torture_reader_mbchk[i].rtc_chkrdr = -1; rcu_torture_reader_mbchk[i].rtc_chkrdr = -1;
firsterr = torture_create_kthread(rcu_torture_reader, (void *)i, firsterr = torture_create_kthread(rcu_torture_reader, (void *)i,
reader_tasks[i]); reader_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
nrealnocbers = nocbs_nthreads; nrealnocbers = nocbs_nthreads;
...@@ -3088,18 +3112,18 @@ rcu_torture_init(void) ...@@ -3088,18 +3112,18 @@ rcu_torture_init(void)
} }
for (i = 0; i < nrealnocbers; i++) { for (i = 0; i < nrealnocbers; i++) {
firsterr = torture_create_kthread(rcu_nocb_toggle, NULL, nocb_tasks[i]); firsterr = torture_create_kthread(rcu_nocb_toggle, NULL, nocb_tasks[i]);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (stat_interval > 0) { if (stat_interval > 0) {
firsterr = torture_create_kthread(rcu_torture_stats, NULL, firsterr = torture_create_kthread(rcu_torture_stats, NULL,
stats_task); stats_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (test_no_idle_hz && shuffle_interval > 0) { if (test_no_idle_hz && shuffle_interval > 0) {
firsterr = torture_shuffle_init(shuffle_interval * HZ); firsterr = torture_shuffle_init(shuffle_interval * HZ);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (stutter < 0) if (stutter < 0)
...@@ -3109,7 +3133,7 @@ rcu_torture_init(void) ...@@ -3109,7 +3133,7 @@ rcu_torture_init(void)
t = cur_ops->stall_dur ? cur_ops->stall_dur() : stutter * HZ; t = cur_ops->stall_dur ? cur_ops->stall_dur() : stutter * HZ;
firsterr = torture_stutter_init(stutter * HZ, t); firsterr = torture_stutter_init(stutter * HZ, t);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (fqs_duration < 0) if (fqs_duration < 0)
...@@ -3118,7 +3142,7 @@ rcu_torture_init(void) ...@@ -3118,7 +3142,7 @@ rcu_torture_init(void)
/* Create the fqs thread */ /* Create the fqs thread */
firsterr = torture_create_kthread(rcu_torture_fqs, NULL, firsterr = torture_create_kthread(rcu_torture_fqs, NULL,
fqs_task); fqs_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (test_boost_interval < 1) if (test_boost_interval < 1)
...@@ -3132,9 +3156,9 @@ rcu_torture_init(void) ...@@ -3132,9 +3156,9 @@ rcu_torture_init(void)
firsterr = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "RCU_TORTURE", firsterr = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "RCU_TORTURE",
rcutorture_booster_init, rcutorture_booster_init,
rcutorture_booster_cleanup); rcutorture_booster_cleanup);
if (firsterr < 0)
goto unwind;
rcutor_hp = firsterr; rcutor_hp = firsterr;
if (torture_init_error(firsterr))
goto unwind;
// Testing RCU priority boosting requires rcutorture do // Testing RCU priority boosting requires rcutorture do
// some serious abuse. Counter this by running ksoftirqd // some serious abuse. Counter this by running ksoftirqd
...@@ -3153,23 +3177,23 @@ rcu_torture_init(void) ...@@ -3153,23 +3177,23 @@ rcu_torture_init(void)
} }
shutdown_jiffies = jiffies + shutdown_secs * HZ; shutdown_jiffies = jiffies + shutdown_secs * HZ;
firsterr = torture_shutdown_init(shutdown_secs, rcu_torture_cleanup); firsterr = torture_shutdown_init(shutdown_secs, rcu_torture_cleanup);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
firsterr = torture_onoff_init(onoff_holdoff * HZ, onoff_interval, firsterr = torture_onoff_init(onoff_holdoff * HZ, onoff_interval,
rcutorture_sync); rcutorture_sync);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
firsterr = rcu_torture_stall_init(); firsterr = rcu_torture_stall_init();
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
firsterr = rcu_torture_fwd_prog_init(); firsterr = rcu_torture_fwd_prog_init();
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
firsterr = rcu_torture_barrier_init(); firsterr = rcu_torture_barrier_init();
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
firsterr = rcu_torture_read_exit_init(); firsterr = rcu_torture_read_exit_init();
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
if (object_debug) if (object_debug)
rcu_test_debug_objects(); rcu_test_debug_objects();
......
...@@ -824,7 +824,7 @@ ref_scale_init(void) ...@@ -824,7 +824,7 @@ ref_scale_init(void)
init_waitqueue_head(&shutdown_wq); init_waitqueue_head(&shutdown_wq);
firsterr = torture_create_kthread(ref_scale_shutdown, NULL, firsterr = torture_create_kthread(ref_scale_shutdown, NULL,
shutdown_task); shutdown_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} }
...@@ -851,7 +851,7 @@ ref_scale_init(void) ...@@ -851,7 +851,7 @@ ref_scale_init(void)
for (i = 0; i < nreaders; i++) { for (i = 0; i < nreaders; i++) {
firsterr = torture_create_kthread(ref_scale_reader, (void *)i, firsterr = torture_create_kthread(ref_scale_reader, (void *)i,
reader_tasks[i].task); reader_tasks[i].task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
init_waitqueue_head(&(reader_tasks[i].wq)); init_waitqueue_head(&(reader_tasks[i].wq));
...@@ -860,7 +860,7 @@ ref_scale_init(void) ...@@ -860,7 +860,7 @@ ref_scale_init(void)
// Main Task // Main Task
init_waitqueue_head(&main_wq); init_waitqueue_head(&main_wq);
firsterr = torture_create_kthread(main_func, NULL, main_task); firsterr = torture_create_kthread(main_func, NULL, main_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
torture_init_end(); torture_init_end();
......
This diff is collapsed.
...@@ -341,6 +341,7 @@ static void scftorture_invoke_one(struct scf_statistics *scfp, struct torture_ra ...@@ -341,6 +341,7 @@ static void scftorture_invoke_one(struct scf_statistics *scfp, struct torture_ra
cpu = torture_random(trsp) % nr_cpu_ids; cpu = torture_random(trsp) % nr_cpu_ids;
scfp->n_resched++; scfp->n_resched++;
resched_cpu(cpu); resched_cpu(cpu);
this_cpu_inc(scf_invoked_count);
} }
break; break;
case SCF_PRIM_SINGLE: case SCF_PRIM_SINGLE:
...@@ -553,18 +554,18 @@ static int __init scf_torture_init(void) ...@@ -553,18 +554,18 @@ static int __init scf_torture_init(void)
scftorture_print_module_parms("Start of test"); scftorture_print_module_parms("Start of test");
if (weight_resched == -1 && if (weight_resched <= 0 &&
weight_single == -1 && weight_single_rpc == -1 && weight_single_wait == -1 && weight_single <= 0 && weight_single_rpc <= 0 && weight_single_wait <= 0 &&
weight_many == -1 && weight_many_wait == -1 && weight_many <= 0 && weight_many_wait <= 0 &&
weight_all == -1 && weight_all_wait == -1) { weight_all <= 0 && weight_all_wait <= 0) {
weight_resched1 = 2 * nr_cpu_ids; weight_resched1 = weight_resched == 0 ? 0 : 2 * nr_cpu_ids;
weight_single1 = 2 * nr_cpu_ids; weight_single1 = weight_single == 0 ? 0 : 2 * nr_cpu_ids;
weight_single_rpc1 = 2 * nr_cpu_ids; weight_single_rpc1 = weight_single_rpc == 0 ? 0 : 2 * nr_cpu_ids;
weight_single_wait1 = 2 * nr_cpu_ids; weight_single_wait1 = weight_single_wait == 0 ? 0 : 2 * nr_cpu_ids;
weight_many1 = 2; weight_many1 = weight_many == 0 ? 0 : 2;
weight_many_wait1 = 2; weight_many_wait1 = weight_many_wait == 0 ? 0 : 2;
weight_all1 = 1; weight_all1 = weight_all == 0 ? 0 : 1;
weight_all_wait1 = 1; weight_all_wait1 = weight_all_wait == 0 ? 0 : 1;
} else { } else {
if (weight_resched == -1) if (weight_resched == -1)
weight_resched1 = 0; weight_resched1 = 0;
...@@ -583,8 +584,8 @@ static int __init scf_torture_init(void) ...@@ -583,8 +584,8 @@ static int __init scf_torture_init(void)
if (weight_all_wait == -1) if (weight_all_wait == -1)
weight_all_wait1 = 0; weight_all_wait1 = 0;
} }
if (weight_single1 == 0 && weight_single_rpc1 == 0 && weight_single_wait1 == 0 && if (weight_resched1 == 0 && weight_single1 == 0 && weight_single_rpc1 == 0 &&
weight_many1 == 0 && weight_many_wait1 == 0 && weight_single_wait1 == 0 && weight_many1 == 0 && weight_many_wait1 == 0 &&
weight_all1 == 0 && weight_all_wait1 == 0) { weight_all1 == 0 && weight_all_wait1 == 0) {
VERBOSE_SCFTORTOUT_ERRSTRING("all zero weights makes no sense"); VERBOSE_SCFTORTOUT_ERRSTRING("all zero weights makes no sense");
firsterr = -EINVAL; firsterr = -EINVAL;
...@@ -605,17 +606,17 @@ static int __init scf_torture_init(void) ...@@ -605,17 +606,17 @@ static int __init scf_torture_init(void)
if (onoff_interval > 0) { if (onoff_interval > 0) {
firsterr = torture_onoff_init(onoff_holdoff * HZ, onoff_interval, NULL); firsterr = torture_onoff_init(onoff_holdoff * HZ, onoff_interval, NULL);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (shutdown_secs > 0) { if (shutdown_secs > 0) {
firsterr = torture_shutdown_init(shutdown_secs, scf_torture_cleanup); firsterr = torture_shutdown_init(shutdown_secs, scf_torture_cleanup);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (stutter > 0) { if (stutter > 0) {
firsterr = torture_stutter_init(stutter, stutter); firsterr = torture_stutter_init(stutter, stutter);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
...@@ -636,12 +637,12 @@ static int __init scf_torture_init(void) ...@@ -636,12 +637,12 @@ static int __init scf_torture_init(void)
scf_stats_p[i].cpu = i; scf_stats_p[i].cpu = i;
firsterr = torture_create_kthread(scftorture_invoker, (void *)&scf_stats_p[i], firsterr = torture_create_kthread(scftorture_invoker, (void *)&scf_stats_p[i],
scf_stats_p[i].task); scf_stats_p[i].task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
if (stat_interval > 0) { if (stat_interval > 0) {
firsterr = torture_create_kthread(scf_torture_stats, NULL, scf_torture_stats_task); firsterr = torture_create_kthread(scf_torture_stats, NULL, scf_torture_stats_task);
if (firsterr) if (torture_init_error(firsterr))
goto unwind; goto unwind;
} }
...@@ -651,6 +652,10 @@ static int __init scf_torture_init(void) ...@@ -651,6 +652,10 @@ static int __init scf_torture_init(void)
unwind: unwind:
torture_init_end(); torture_init_end();
scf_torture_cleanup(); scf_torture_cleanup();
if (shutdown_secs) {
WARN_ON(!IS_MODULE(CONFIG_SCF_TORTURE_TEST));
kernel_power_off();
}
return firsterr; return firsterr;
} }
......
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0+
#
# Extract any RCU CPU stall warnings present in specified file.
# Filter out clocksource lines. Note that preceding-lines excludes the
# initial line of the stall warning but trailing-lines includes it.
#
# Usage: extract-stall.sh dmesg-file [ preceding-lines [ trailing-lines ] ]
echo $1
preceding_lines="${2-3}"
trailing_lines="${3-10}"
awk -v preceding_lines="$preceding_lines" -v trailing_lines="$trailing_lines" '
suffix <= 0 {
for (i = preceding_lines; i > 0; i--)
last[i] = last[i - 1];
last[0] = $0;
}
suffix > 0 {
print $0;
suffix--;
if (suffix <= 0)
print "";
}
suffix <= 0 && /detected stall/ {
for (i = preceding_lines; i >= 0; i--)
if (last[i] != "")
print last[i];
suffix = trailing_lines;
}' < "$1" | tr -d '\015' | grep -v clocksource
...@@ -149,6 +149,7 @@ do ...@@ -149,6 +149,7 @@ do
done done
# Download and expand the tarball on all systems. # Download and expand the tarball on all systems.
echo Build-products tarball: `du -h $T/binres.tgz` | tee -a "$oldrun/remote-log"
for i in $systems for i in $systems
do do
echo Downloading tarball to $i `date` | tee -a "$oldrun/remote-log" echo Downloading tarball to $i `date` | tee -a "$oldrun/remote-log"
......
...@@ -184,7 +184,7 @@ do ...@@ -184,7 +184,7 @@ do
TORTURE_KCONFIG_KASAN_ARG="CONFIG_DEBUG_INFO=y CONFIG_KASAN=y"; export TORTURE_KCONFIG_KASAN_ARG TORTURE_KCONFIG_KASAN_ARG="CONFIG_DEBUG_INFO=y CONFIG_KASAN=y"; export TORTURE_KCONFIG_KASAN_ARG
;; ;;
--kcsan) --kcsan)
TORTURE_KCONFIG_KCSAN_ARG="CONFIG_DEBUG_INFO=y CONFIG_KCSAN=y CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=n CONFIG_KCSAN_REPORT_VALUE_CHANGE_ONLY=n CONFIG_KCSAN_REPORT_ONCE_IN_MS=100000 CONFIG_KCSAN_INTERRUPT_WATCHER=y CONFIG_KCSAN_VERBOSE=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y"; export TORTURE_KCONFIG_KCSAN_ARG TORTURE_KCONFIG_KCSAN_ARG="CONFIG_DEBUG_INFO=y CONFIG_KCSAN=y CONFIG_KCSAN_STRICT=y CONFIG_KCSAN_REPORT_ONCE_IN_MS=100000 CONFIG_KCSAN_VERBOSE=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y"; export TORTURE_KCONFIG_KCSAN_ARG
;; ;;
--kmake-arg|--kmake-args) --kmake-arg|--kmake-args)
checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$' checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$'
......
...@@ -351,7 +351,7 @@ fi ...@@ -351,7 +351,7 @@ fi
if test "$do_scftorture" = "yes" if test "$do_scftorture" = "yes"
then then
torture_bootargs="scftorture.nthreads=$HALF_ALLOTED_CPUS torture.disable_onoff_at_boot" torture_bootargs="scftorture.nthreads=$HALF_ALLOTED_CPUS torture.disable_onoff_at_boot"
torture_set "scftorture" tools/testing/selftests/rcutorture/bin/kvm.sh --torture scf --allcpus --duration "$duration_scftorture" --configs "$configs_scftorture" --kconfig "CONFIG_NR_CPUS=$HALF_ALLOTED_CPUS" --trust-make torture_set "scftorture" tools/testing/selftests/rcutorture/bin/kvm.sh --torture scf --allcpus --duration "$duration_scftorture" --configs "$configs_scftorture" --kconfig "CONFIG_NR_CPUS=$HALF_ALLOTED_CPUS" --memory 1G --trust-make
fi fi
if test "$do_refscale" = yes if test "$do_refscale" = yes
...@@ -434,7 +434,12 @@ then ...@@ -434,7 +434,12 @@ then
batchno=1 batchno=1
if test -s $T/xz-todo if test -s $T/xz-todo
then then
echo Size before compressing: `du -sh $tdir | awk '{ print $1 }'` `date` 2>&1 | tee -a "$tdir/log-xz" | tee -a $T/log for i in `cat $T/xz-todo`
do
find $i -name 'vmlinux*' -print
done | wc -l | awk '{ print $1 }' > $T/xz-todo-count
n2compress="`cat $T/xz-todo-count`"
echo Size before compressing $n2compress files: `du -sh $tdir | awk '{ print $1 }'` `date` 2>&1 | tee -a "$tdir/log-xz" | tee -a $T/log
for i in `cat $T/xz-todo` for i in `cat $T/xz-todo`
do do
echo Compressing vmlinux files in ${i}: `date` >> "$tdir/log-xz" 2>&1 echo Compressing vmlinux files in ${i}: `date` >> "$tdir/log-xz" 2>&1
...@@ -456,7 +461,7 @@ then ...@@ -456,7 +461,7 @@ then
echo Waiting for final batch $batchno of $ncompresses compressions `date` | tee -a "$tdir/log-xz" | tee -a $T/log echo Waiting for final batch $batchno of $ncompresses compressions `date` | tee -a "$tdir/log-xz" | tee -a $T/log
fi fi
wait wait
echo Size after compressing: `du -sh $tdir | awk '{ print $1 }'` `date` 2>&1 | tee -a "$tdir/log-xz" | tee -a $T/log echo Size after compressing $n2compress files: `du -sh $tdir | awk '{ print $1 }'` `date` 2>&1 | tee -a "$tdir/log-xz" | tee -a $T/log
echo Total duration `get_starttime_duration $starttime`. | tee -a $T/log echo Total duration `get_starttime_duration $starttime`. | tee -a $T/log
else else
echo No compression needed: `date` >> "$tdir/log-xz" 2>&1 echo No compression needed: `date` >> "$tdir/log-xz" 2>&1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment