RCU changes for v3.16
Subsystems (7)
Linus,
Please pull the latest core-rcu-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-rcu-for-linus
# HEAD: e14505a8d50882ff3bdd4b791b14d90a0881fa4d Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
The main RCU changes in this cycle were:
- RCU Torture-test changes.
- Variable-name renaming cleanup.
- Update RCU documentation.
- Miscellaneous fixes.
- Patch to suppress RCU stall warnings while sysrq requests are being processed.
Thanks,
Ingo
------------------>
Andreea-Cristina Bernat (3):
rcu: Add event tracing to dyntick_save_progress_counter().
rcu: Consolidate kfree_call_rcu() to use rcu_state pointer
rcu: Merge rcu_sched_force_quiescent_state() with rcu_force_quiescent_state()
Christoph Lameter (1):
rcu: Replace __this_cpu_ptr() uses with raw_cpu_ptr()
Eric Dumazet (1):
softirq: A single rcu_bh_qs() call per softirq set is enough
Himangi Saraogi (2):
rcu: Protect uses of ->jiffies_stall with ACCESS_ONCE()
rcu: Replace NR_CPUS with nr_cpu_ids
Iulia Manda (4):
rcu: Remove unused rcu_data structure field
rcu: Protect uses of jiffies_stall field with ACCESS_ONCE()
rcu: Remove "extern" from function declaration in include/linux/rcupdate.h
torture: Notice if an all-zero cpumask is passed inside a critical section
Liu Ping Fan (1):
rcu: Fix incorrect notes for code
Paul E. McKenney (49):
documentation: Update sysfs path for rcu_cpu_stall_suppress
documentation: Record rcu_dereference() value mishandling
documentation: Update API documentation
rcu: Protect ->gp_flags accesses with ACCESS_ONCE()
rcu: Print negatives for stall-warning counter wraparound
rcu: Update cpu_needs_another_gp() for futures from non-NOCB CPUs
rcu: Make callers awaken grace-period kthread
rcu: Document RCU_INIT_POINTER()'s lack of ordering guarantees
rcu: Bind RCU grace-period kthreads if NO_HZ_FULL
rcu: Make large and small sysidle systems use same state machine
rcutorture: Add forward-progress checking for writer
torture: Remove obsolete builddir options
torture: Add batch headers "--dryrun sched"
torture: Make parse-rcutorture.sh less RCU-specific
torture: Rename RCU_INITRD to TORTURE_INITRD
torture: Intensify locking test
torture: Allow variations of "defconfig" to be specified
torture: Rename RCU_KMAKE_ARG to TORTURE_KMAKE_ARG
torture: Rename RCU_BOOTARGS to TORTURE_BOOTARGS
torture: Rename RCU_BUILDONLY to TORTURE_BUILDONLY
torture: Rename RCU_QEMU_INTERACTIVE to TORTURE_QEMU_INTERACTIVE
torture: Rename RCU_QEMU_MAC to TORTURE_QEMU_MAC
torture: Rename RCU_QEMU_ARG to TORTURE_QEMU_ARG
torture: Rename RCU_QEMU_CMD to TORTURE_QEMU_CMD
torture: Make config-fragment filtering RCU-independent
torture: Make "--dryrun script" output self-sufficient
torture: Make "--dryrun script" use same environment as normal run
rcutorture: Print negatives for SRCU counter wraparound
torture: Include "Stopping" string to torture_kthread_stopping()
torture: Report diagnostics from qemu
torture: Increase stutter-end intensity
torture: Permit multi-word qemu and boot arguments
torture: Choose bzImage location based on architecture
torture: Add tracing-enabled variant of TREE02
torture: Dump ftrace buffer when the RCU grace period stalls
rcutorture: Export RCU grace-period kthread wait state to rcutorture
percpu: Fix raw_cpu_inc_return()
sched,rcu: Make cond_resched() report RCU quiescent states
rcutorture: Make rcu_torture_reader() use cond_resched()
torture: Better summary diagnostics for build failures
rcutorture: Check for rcu_torture_fqs creation errors
torture: Use elapsed time to detect hangs
rcutorture: Test RCU-sched primitives in TREE_PREEMPT_RCU kernels
rcutorture: Add tests for get_state_synchronize_rcu()
rcutorture: Explicitly test synchronous grace-period primitives
rcutorture: Note diffs from git commits
rcutorture: Run rcu_torture_writer at normal priority
locktorture: Remove reference to nonexistent Kconfig parameter
torture: Check for multiple concurrent torture tests
Pranith Kumar (3):
rcu: Remove duplicate resched_cpu() declaration
torture: Remove __init from torture_init_begin/end
torture: Remove unused definition
Rashika Kheria (1):
rcutorture: Mark function as static in kernel/rcu/torture.c
Rik van Riel (1):
rcu: Provide API to suppress stall warnings while sysrc runs
Thomas Gleixner (1):
rcutorture: Add missing destroy_timer_on_stack()
Uma Sharma (1):
rcu: Variable name changed in tree_plugin.h and used in tree.c
Documentation/RCU/00-INDEX | 2 +
Documentation/RCU/checklist.txt | 12 +-
Documentation/RCU/rcu_dereference.txt | 371 +++++++++++++++++++++
Documentation/RCU/stallwarn.txt | 2 +-
Documentation/RCU/whatisRCU.txt | 55 ++-
include/linux/percpu.h | 2 +-
include/linux/rcupdate.h | 72 +++-
include/linux/rcutiny.h | 4 +
include/linux/rcutree.h | 1 +
include/linux/torture.h | 8 +-
kernel/locking/locktorture.c | 10 +-
kernel/rcu/rcutorture.c | 217 +++++++++---
kernel/rcu/tiny_plugin.h | 8 +-
kernel/rcu/tree.c | 309 ++++++++++++-----
kernel/rcu/tree.h | 11 +-
kernel/rcu/tree_plugin.h | 136 ++------
kernel/rcu/update.c | 30 ++
kernel/sched/core.c | 7 +-
kernel/softirq.c | 4 +-
kernel/torture.c | 40 ++-
.../testing/selftests/rcutorture/bin/configinit.sh | 2 +-
.../testing/selftests/rcutorture/bin/functions.sh | 48 ++-
.../testing/selftests/rcutorture/bin/kvm-build.sh | 6 +-
.../selftests/rcutorture/bin/kvm-recheck-lock.sh | 2 +-
.../selftests/rcutorture/bin/kvm-recheck-rcu.sh | 2 +-
.../selftests/rcutorture/bin/kvm-recheck.sh | 24 +-
.../selftests/rcutorture/bin/kvm-test-1-run.sh | 47 ++-
tools/testing/selftests/rcutorture/bin/kvm.sh | 142 ++++----
.../bin/{parse-rcutorture.sh => parse-torture.sh} | 22 +-
.../selftests/rcutorture/configs/rcu/TREE02-T | 25 ++
.../selftests/rcutorture/configs/rcu/TREE08.boot | 1 +
31 files changed, 1210 insertions(+), 412 deletions(-)
create mode 100644 Documentation/RCU/rcu_dereference.txt
rename tools/testing/selftests/rcutorture/bin/{parse-rcutorture.sh => parse-torture.sh} (79%)
create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE02-T
create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE08.bootDocumentation/RCU/00-INDEX +2 -0
@@ -12,6 +12,8 @@ lockdep-splat.txt - RCU Lockdep splats explained. NMI-RCU.txt - Using RCU to Protect Dynamic NMI Handlers +rcu_dereference.txt + - Proper care and feeding of return values from rcu_dereference() rcubarrier.txt - RCU and Unloadable Modules rculist_nulls.txt
Documentation/RCU/checklist.txt +8 -4
@@ -114,12 +114,16 @@ over a rather long period of time, but improvements are always welcome! http://www.openvms.compaq.com/wizard/wiz_2637.html The rcu_dereference() primitive is also an excellent - documentation aid, letting the person reading the code - know exactly which pointers are protected by RCU. + documentation aid, letting the person reading the + code know exactly which pointers are protected by RCU. Please note that compilers can also reorder code, and they are becoming increasingly aggressive about doing - just that. The rcu_dereference() primitive therefore - also prevents destructive compiler optimizations. + just that. The rcu_dereference() primitive therefore also + prevents destructive compiler optimizations. However, + with a bit of devious creativity, it is possible to + mishandle the return value from rcu_dereference(). + Please see rcu_dereference.txt in this directory for + more information. The rcu_dereference() primitive is used by the various "_rcu()" list-traversal primitives, such
Documentation/RCU/rcu_dereference.txt new file +371 -0
371 lines not on this page · raw message
Documentation/RCU/stallwarn.txt +1 -1
@@ -24,7 +24,7 @@ CONFIG_RCU_CPU_STALL_TIMEOUT timing of the next warning for the current stall. Stall-warning messages may be enabled and disabled completely via - /sys/module/rcutree/parameters/rcu_cpu_stall_suppress. + /sys/module/rcupdate/parameters/rcu_cpu_stall_suppress. CONFIG_RCU_CPU_STALL_VERBOSE
Documentation/RCU/whatisRCU.txt +44 -11
115 lines not on this page · raw message
include/linux/percpu.h +1 -1
@@ -639,7 +639,7 @@ do { \# define raw_cpu_add_return_8 (pcp, val) raw_cpu_generic_add_return(pcp, val)# endif # define raw_cpu_add_return (pcp, val) \ - __pcpu_size_call_return2(raw_add_return_, pcp, val) + __pcpu_size_call_return2(raw_cpu_add_return_, pcp, val)#endif #define raw_cpu_sub_return (pcp, val) raw_cpu_add_return(pcp, -(typeof(pcp))(val))
include/linux/rcupdate.h +71 -1
115 lines not on this page · raw message
include/linux/rcutiny.h +4 -0
@@ -119,6 +119,10 @@ static inline void rcu_sched_force_quiescent_state(void) { } +static inline void show_rcu_gp_kthreads (void ) +{ +} +static inline void rcu_cpu_stall_reset (void ) { }
include/linux/rcutree.h +1 -0
@@ -84,6 +84,7 @@ extern unsigned long rcutorture_vernum;long rcu_batches_completed (void );long rcu_batches_completed_bh (void );long rcu_batches_completed_sched (void ); +void show_rcu_gp_kthreads (void );void rcu_force_quiescent_state (void );void rcu_bh_force_quiescent_state (void );
include/linux/torture.h +1 -7
@@ -49,12 +49,6 @@#define VERBOSE_TOROUT_ERRSTRING (s) \ do { if (verbose) pr_alert("%s" TORTURE_FLAG "!!! %s\n", torture_type, s); } while (0) -/* Definitions for a non-string torture-test module parameter. */ -#define torture_parm (type, name, init, msg) \ - static type name = init; \ - module_param(name, type, 0444); \ - MODULE_PARM_DESC(name, msg); -/* Definitions for online/offline exerciser. */ int torture_onoff_init (long ooholdoff,long oointerval);char *torture_onoff_stats (char *page);
@@ -81,7 +75,7 @@ void stutter_wait(const char *title);int torture_stutter_init (int s);/* Initialization and cleanup. */ -void torture_init_begin (char *ttype,bool v,int *runnable); +bool torture_init_begin (char *ttype,bool v,int *runnable);void torture_init_end (void );bool torture_cleanup (void );bool torture_must_stop (void );
kernel/locking/locktorture.c +6 -4
@@ -82,14 +82,14 @@ struct lock_writer_stress_stats { };static struct lock_writer_stress_stats *lwsa; -#if defined(MODULE ) || defined(CONFIG_LOCK_TORTURE_TEST_RUNNABLE ) +#if defined(MODULE )#define LOCKTORTURE_RUNNABLE_INIT 1#else #define LOCKTORTURE_RUNNABLE_INIT 0#endif int locktorture_runnable =LOCKTORTURE_RUNNABLE_INIT ;module_param (locktorture_runnable, int,0444 ); -MODULE_PARM_DESC (locktorture_runnable,"Start locktorture at boot" ); +MODULE_PARM_DESC (locktorture_runnable,"Start locktorture at module init" );/* Forward reference. */ static void lock_torture_cleanup (void );
@@ -219,7 +219,8 @@ static int lock_torture_writer(void *arg)set_user_nice (current,19 ); do { - schedule_timeout_uninterruptible(1); + if ((torture_random(&rand) & 0xfffff) == 0) + schedule_timeout_uninterruptible(1); cur_ops->writelock(); if (WARN_ON_ONCE(lock_is_write_held)) lwsp->n_write_lock_fail++;
@@ -354,7 +355,8 @@ static int __init lock_torture_init(void) &lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops, }; -torture_init_begin (torture_type, verbose, &locktorture_runnable); +if (!torture_init_begin (torture_type, verbose, &locktorture_runnable)) +return -EBUSY ;/* Process args and tell the world that the torturer is on the job. */ for (i =0 ; i <ARRAY_SIZE (torture_ops); i++) {
kernel/rcu/rcutorture.c +171 -46
388 lines not on this page · raw message
kernel/rcu/tiny_plugin.h +4 -4
@@ -144,7 +144,7 @@ static void check_cpu_stall(struct rcu_ctrlblk *rcp)return ; rcp->ticks_this_gp++; j = jiffies; - js = rcp->jiffies_stall; + js =ACCESS_ONCE (rcp->jiffies_stall);if (*rcp->curtail &&ULONG_CMP_GE (j, js)) { pr_err("INFO: %s stall on CPU (%lu ticks this GP) idle=%llx (t=%lu jiffies q=%ld)\n", rcp->name, rcp->ticks_this_gp, rcu_dynticks_nesting,
@@ -152,17 +152,17 @@ static void check_cpu_stall(struct rcu_ctrlblk *rcp)dump_stack (); }if (*rcp->curtail &&ULONG_CMP_GE (j, js)) - rcp->jiffies_stall = jiffies + +ACCESS_ONCE (rcp->jiffies_stall) = jiffies +3 *rcu_jiffies_till_stall_check () +3 ;else if (ULONG_CMP_GE (j, js)) - rcp->jiffies_stall = jiffies +rcu_jiffies_till_stall_check (); +ACCESS_ONCE (rcp->jiffies_stall) = jiffies +rcu_jiffies_till_stall_check (); }static void reset_cpu_stall_ticks (struct rcu_ctrlblk *rcp) { rcp->ticks_this_gp =0 ; rcp->gp_start = jiffies; - rcp->jiffies_stall = jiffies +rcu_jiffies_till_stall_check (); +ACCESS_ONCE (rcp->jiffies_stall) = jiffies +rcu_jiffies_till_stall_check (); }static void check_cpu_stalls (void )
kernel/rcu/tree.c +217 -92
750 lines not on this page · raw message
kernel/rcu/tree.h +7 -4
@@ -252,7 +252,6 @@ struct rcu_data {bool passed_quiesce;/* User-mode/idle loop etc. */ bool qs_pending;/* Core waits for quiesc state. */ bool beenonline;/* CPU online at least once. */ -bool preemptible;/* Preemptible RCU? */ struct rcu_node *mynode;/* This CPU's leaf of hierarchy */ unsigned long grpmask;/* Mask to apply to leaf qsmask. */ #ifdef CONFIG_RCU_CPU_STALL_INFO
@@ -406,7 +405,8 @@ struct rcu_state {unsigned long completed;/* # of last completed gp. */ struct task_struct *gp_kthread;/* Task for grace periods. */ wait_queue_head_t gp_wq;/* Where GP task waits. */ -int gp_flags;/* Commands for GP task. */ +short gp_flags;/* Commands for GP task. */ +short gp_state;/* GP kthread sleep state. */ /* End of fields guarded by root rcu_node's lock. */
@@ -462,13 +462,17 @@ struct rcu_state {const char *name;/* Name of structure. */ char abbr;/* Abbreviated name. */ struct list_head flavors;/* List of RCU flavors. */ -struct irq_work wakeup_work;/* Postponed wakeups */ };/* Values for rcu_state structure's gp_flags field. */ #define RCU_GP_FLAG_INIT 0x1/* Need grace-period initialization. */ #define RCU_GP_FLAG_FQS 0x2/* Need grace-period quiescent-state forcing. */ +/* Values for rcu_state structure's gp_flags field. */ +#define RCU_GP_WAIT_INIT 0/* Initial state. */ +#define RCU_GP_WAIT_GPS 1/* Wait for grace-period start. */ +#define RCU_GP_WAIT_FQS 2/* Wait for force-quiescent-state time. */ +extern struct list_head rcu_struct_flavors;/* 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);static void print_cpu_stall_info_end (void );static void zero_cpu_stall_ticks (struct rcu_data *rdp);static void increment_cpu_stall_ticks (void ); -static int rcu_nocb_needs_gp (struct rcu_state *rsp);static void rcu_nocb_gp_set (struct rcu_node *rnp,int nrq);static void rcu_nocb_gp_cleanup (struct rcu_state *rsp,struct rcu_node *rnp);static void rcu_init_one_nocb (struct rcu_node *rnp);
kernel/rcu/tree_plugin.h +37 -99
264 lines not on this page · raw message
kernel/rcu/update.c +30 -0
@@ -320,6 +320,18 @@ int rcu_jiffies_till_stall_check(void)return till_stall_check *HZ +RCU_STALL_DELAY_DELTA ; } +void rcu_sysrq_start (void ) +{ +if (!rcu_cpu_stall_suppress) + rcu_cpu_stall_suppress =2 ; +} + +void rcu_sysrq_end (void ) +{ +if (rcu_cpu_stall_suppress ==2 ) + rcu_cpu_stall_suppress =0 ; +} +static int rcu_panic (struct notifier_block *this,unsigned long ev,void *ptr) { rcu_cpu_stall_suppress =1 ;
@@ -338,3 +350,21 @@ static int __init check_cpu_stall_init(void)early_initcall (check_cpu_stall_init);#endif /* #ifdef CONFIG_RCU_STALL_COMMON */ + +/* +* Hooks for cond_resched() and friends to avoid RCU CPU stall warnings. +*/ + +DEFINE_PER_CPU (int, rcu_cond_resched_count); + +/* +* Report a set of RCU quiescent states, for use by cond_resched() +* and friends. Out of line due to being called infrequently. +*/ +void rcu_resched (void ) +{ +preempt_disable (); +__this_cpu_write (rcu_cond_resched_count,0 ); +rcu_note_context_switch (smp_processor_id ()); +preempt_enable (); +}
kernel/sched/core.c +6 -1
@@ -4051,6 +4051,7 @@ static void __cond_resched(void) int __sched _cond_resched(void) { +rcu_cond_resched ();if (should_resched ()) {__cond_resched ();return 1 ;
@@ -4069,15 +4070,18 @@ EXPORT_SYMBOL(_cond_resched);*/ int __cond_resched_lock (spinlock_t *lock) { +bool need_rcu_resched =rcu_should_resched ();int resched =should_resched ();int ret =0 ;lockdep_assert_held (lock); -if (spin_needbreak (lock) || resched) { +if (spin_needbreak (lock) || resched || need_rcu_resched) {spin_unlock (lock);if (resched)__cond_resched (); +else if (unlikely (need_rcu_resched)) +rcu_resched ();else cpu_relax (); ret =1 ;
@@ -4091,6 +4095,7 @@ int __sched __cond_resched_softirq(void) {BUG_ON (!in_softirq ()); +rcu_cond_resched ();/* BH disabled OK, just recording QSes. */ if (should_resched ()) {local_bh_enable ();__cond_resched ();
kernel/softirq.c +1 -3
@@ -232,7 +232,6 @@ asmlinkage __visible void __do_softirq(void)bool in_hardirq;__u32 pending;int softirq_bit; -int cpu;/* * Mask out PF_MEMALLOC s current task context is borrowed for the
@@ -247,7 +246,6 @@ asmlinkage __visible void __do_softirq(void)__local_bh_disable_ip (_RET_IP_,SOFTIRQ_OFFSET ); in_hardirq =lockdep_softirq_start (); - cpu =smp_processor_id (); restart:/* Reset the pending bitmask before enabling irqs */ set_softirq_pending (0 );
@@ -276,11 +274,11 @@ restart: prev_count, preempt_count());preempt_count_set (prev_count); } -rcu_bh_qs (cpu); h++; pending >>= softirq_bit; } +rcu_bh_qs (smp_processor_id ());local_irq_disable (); pending =local_softirq_pending ();
kernel/torture.c +27 -13
@@ -335,13 +335,8 @@ static void torture_shuffle_tasks(void) shuffle_idle_cpu =cpumask_next (shuffle_idle_cpu, shuffle_tmp_mask);if (shuffle_idle_cpu >= nr_cpu_ids) shuffle_idle_cpu =-1 ; -if (shuffle_idle_cpu !=-1 ) { +else cpumask_clear_cpu (shuffle_idle_cpu, shuffle_tmp_mask); -if (cpumask_empty (shuffle_tmp_mask)) { -put_online_cpus (); -return ; - } - }mutex_lock (&shuffle_task_mutex);list_for_each_entry (stp, &shuffle_task_list, st_l)
@@ -533,7 +528,11 @@ void stutter_wait(const char *title)while (ACCESS_ONCE (stutter_pause_test) || (torture_runnable && !ACCESS_ONCE (*torture_runnable))) {if (stutter_pause_test) -schedule_timeout_interruptible (1 ); +if (ACCESS_ONCE (stutter_pause_test) ==1 ) +schedule_timeout_interruptible (1 ); +else +while (ACCESS_ONCE (stutter_pause_test)) +cond_resched ();else schedule_timeout_interruptible (round_jiffies_relative (HZ ));torture_shutdown_absorb (title);
@@ -550,7 +549,11 @@ static int torture_stutter(void *arg)VERBOSE_TOROUT_STRING ("torture_stutter task started" ); do { if (!torture_must_stop()) { - schedule_timeout_interruptible(stutter); + if (stutter > 1) { + schedule_timeout_interruptible(stutter - 1); + ACCESS_ONCE(stutter_pause_test) = 2; + } + schedule_timeout_interruptible(1); ACCESS_ONCE(stutter_pause_test) = 1; } if (!torture_must_stop())
@@ -596,21 +599,27 @@ static void torture_stutter_cleanup(void)* The runnable parameter points to a flag that controls whether or not * the test is currently runnable. If there is no such flag, pass in NULL. */ -void __init torture_init_begin (char *ttype,bool v,int *runnable) +bool torture_init_begin (char *ttype,bool v,int *runnable) {mutex_lock (&fullstop_mutex); +if (torture_type !=NULL ) { +pr_alert ("torture_init_begin: refusing %s init: %s running" , + ttype, torture_type); +mutex_unlock (&fullstop_mutex); +return false; + } torture_type = ttype; verbose = v; torture_runnable = runnable; fullstop =FULLSTOP_DONTSTOP ; - +return true; }EXPORT_SYMBOL_GPL (torture_init_begin);/* * Tell the torture module that initialization is complete. */ -void __init torture_init_end (void ) +void torture_init_end (void ) {mutex_unlock (&fullstop_mutex);register_reboot_notifier (&torture_shutdown_nb);
@@ -642,6 +651,9 @@ bool torture_cleanup(void)torture_shuffle_cleanup ();torture_stutter_cleanup ();torture_onoff_cleanup (); +mutex_lock (&fullstop_mutex); + torture_type =NULL ; +mutex_unlock (&fullstop_mutex);return false; }EXPORT_SYMBOL_GPL (torture_cleanup);
@@ -674,8 +686,10 @@ EXPORT_SYMBOL_GPL(torture_must_stop_irq);*/ void torture_kthread_stopping (char *title) { -if (verbose) -VERBOSE_TOROUT_STRING (title); +char buf[128 ]; + +snprintf (buf,sizeof (buf),"Stopping %s" , title); +VERBOSE_TOROUT_STRING (buf);while (!kthread_should_stop ()) {torture_shutdown_absorb (title);schedule_timeout_uninterruptible (1 );
tools/testing/selftests/rcutorture/bin/configinit.sh +1 -1
@@ -62,7 +62,7 @@ grep '^grep' < $T/u.sh > $T/upd.sh echo "cat - $c" >> $T/upd.sh make mrproper make $buildloc distclean > $builddir/Make.distclean 2>&1 -make $buildloc defconfig > $builddir/Make.defconfig.out 2>&1 +make $buildloc $TORTURE_DEFCONFIG > $builddir/Make.defconfig.out 2>&1 mv $builddir/.config $builddir/.config.sav sh $T/upd.sh < $builddir/.config.sav > $builddir/.config cp $builddir/.config $builddir/.config.new
tools/testing/selftests/rcutorture/bin/functions.sh +36 -12
97 lines not on this page · raw message
tools/testing/selftests/rcutorture/bin/kvm-build.sh +3 -3
@@ -45,9 +45,9 @@ T=/tmp/test-linux.sh.$$ trap 'rm -rf $T' 0 mkdir $T -cat ${config_template} | grep -v CONFIG_RCU_TORTURE_TEST > $T/config +grep -v 'CONFIG_[A-Z]*_TORTURE_TEST' < ${config_template} > $T/config cat << ___EOF___ >> $T/config -CONFIG_INITRAMFS_SOURCE="$RCU_INITRD" +CONFIG_INITRAMFS_SOURCE="$TORTURE_INITRD" CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_CONSOLE=y ___EOF___
@@ -60,7 +60,7 @@ then exit 2 fi ncpus=`cpus2use.sh` -make O=$builddir -j$ncpus $RCU_KMAKE_ARG > $builddir/Make.out 2>&1 +make O=$builddir -j$ncpus $TORTURE_KMAKE_ARG > $builddir/Make.out 2>&1 retval=$? if test $retval -ne 0 || grep "rcu[^/]*": < $builddir/Make.out | egrep -q "Stop|Error|error:|warning:" || egrep -q "Stop|Error|error:" < $builddir/Make.out then
tools/testing/selftests/rcutorture/bin/kvm-recheck-lock.sh +1 -1
@@ -35,7 +35,7 @@ configfile=`echo $i | sed -e 's/^.*\///'` ncs=`grep "Writes: Total:" $i/console.log 2> /dev/null | tail -1 | sed -e 's/^.* Total: //' -e 's/ .*$//'` if test -z "$ncs" then - echo $configfile + echo "$configfile -------" else title="$configfile ------- $ncs acquisitions/releases" dur=`sed -e 's/^.* locktorture.shutdown_secs=//' -e 's/ .*$//' < $i/qemu-cmd 2> /dev/null`
tools/testing/selftests/rcutorture/bin/kvm-recheck-rcu.sh +1 -1
@@ -35,7 +35,7 @@ configfile=`echo $i | sed -e 's/^.*\///'` ngps=`grep ver: $i/console.log 2> /dev/null | tail -1 | sed -e 's/^.* ver: //' -e 's/ .*$//'` if test -z "$ngps" then - echo $configfile + echo "$configfile -------" else title="$configfile ------- $ngps grace periods" dur=`sed -e 's/^.* rcutorture.shutdown_secs=//' -e 's/ .*$//' < $i/qemu-cmd 2> /dev/null`
tools/testing/selftests/rcutorture/bin/kvm-recheck.sh +18 -6
@@ -25,6 +25,7 @@ # Authors: Paul E. McKenney <[email protected]> PATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH +. tools/testing/selftests/rcutorture/bin/functions.sh for rd in "$@" do firsttime=1
@@ -39,13 +40,24 @@ do fi TORTURE_SUITE="`cat $i/../TORTURE_SUITE`" kvm-recheck-${TORTURE_SUITE}.sh $i - configcheck.sh $i/.config $i/ConfigFragment - parse-build.sh $i/Make.out $configfile - parse-rcutorture.sh $i/console.log $configfile - parse-console.sh $i/console.log $configfile - if test -r $i/Warnings + if test -f "$i/console.log" then - cat $i/Warnings + configcheck.sh $i/.config $i/ConfigFragment + parse-build.sh $i/Make.out $configfile + parse-torture.sh $i/console.log $configfile + parse-console.sh $i/console.log $configfile + if test -r $i/Warnings + then + cat $i/Warnings + fi + else + if test -f "$i/qemu-cmd" + then + print_bug qemu failed + else + print_bug Build failed + fi + echo " $i" fi done done
tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh +33 -14
107 lines not on this page · raw message
tools/testing/selftests/rcutorture/bin/kvm.sh +70 -72
247 lines not on this page · raw message
tools/testing/selftests/rcutorture/bin/parse-torture.sh renamed from tools/testing/selftests/rcutorture/bin/parse-rcutorture.sh +11 -11
@@ -1,14 +1,14 @@ #!/bin/sh # -# Check the console output from an rcutorture run for goodness. +# Check the console output from a torture run for goodness. # The "file" is a pathname on the local system, and "title" is # a text string for error-message purposes. # -# The file must contain rcutorture output, but can be interspersed -# with other dmesg text. +# The file must contain torture output, but can be interspersed +# with other dmesg text, as in console-log output. # # Usage: -# sh parse-rcutorture.sh file title +# sh parse-torture.sh file title # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ # # Authors: Paul E. McKenney <[email protected]> -T=/tmp/parse-rcutorture.sh.$$ +T=/tmp/parse-torture.sh.$$ file="$1" title="$2"
@@ -36,13 +36,13 @@ trap 'rm -f $T.seq' 0 . functions.sh -# check for presence of rcutorture.txt file +# check for presence of torture output file. if test -f "$file" -a -r "$file" then : else - echo $title unreadable rcutorture.txt file: $file + echo $title unreadable torture output file: $file exit 1 fi
@@ -76,9 +76,9 @@ BEGIN { END { if (badseq) { if (badseqno1 == badseqno2 && badseqno2 == ver) - print "RCU GP HANG at " ver " rcutorture stat " badseqnr; + print "GP HANG at " ver " torture stat " badseqnr; else - print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " RCU version " badseqnr; + print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr; } }' > $T.seq
@@ -91,13 +91,13 @@ then exit 2 fi else - if grep -q RCU_HOTPLUG $file + if grep -q "_HOTPLUG:" $file then print_warning HOTPLUG FAILURES $title `cat $T.seq` echo " " $file exit 3 fi - echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful RCU version messages + echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages if test -s $T.seq then print_warning $title `cat $T.seq`
tools/testing/selftests/rcutorture/configs/rcu/TREE02-T new file +25 -0
@@ -0,0 +1,25 @@ +CONFIG_SMP=y +CONFIG_NR_CPUS=8 +CONFIG_PREEMPT_NONE=n +CONFIG_PREEMPT_VOLUNTARY=n +CONFIG_PREEMPT=y +#CHECK#CONFIG_TREE_PREEMPT_RCU=y +CONFIG_HZ_PERIODIC=n +CONFIG_NO_HZ_IDLE=y +CONFIG_NO_HZ_FULL=n +CONFIG_RCU_FAST_NO_HZ=n +CONFIG_RCU_TRACE=y +CONFIG_HOTPLUG_CPU=n +CONFIG_SUSPEND=n +CONFIG_HIBERNATION=n +CONFIG_RCU_FANOUT=3 +CONFIG_RCU_FANOUT_LEAF=3 +CONFIG_RCU_FANOUT_EXACT=n +CONFIG_RCU_NOCB_CPU=n +CONFIG_DEBUG_LOCK_ALLOC=y +CONFIG_PROVE_LOCKING=n +CONFIG_PROVE_RCU_DELAY=n +CONFIG_RCU_CPU_STALL_INFO=n +CONFIG_RCU_CPU_STALL_VERBOSE=y +CONFIG_RCU_BOOST=n +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
tools/testing/selftests/rcutorture/configs/rcu/TREE08.boot new file +1 -0
@@ -0,0 +1 @@ +rcutorture.torture_type=sched