RCU changes for v3.17
Subsystems (11)
Ingo Molnar
maintainerLinus,
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: 01c9db827146ce321562a992a5dbc1a49b1a99ce Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
The main changes:
* Torture-test updates
* Callback-offloading changes
* Maintainership changes
* Update RCU documentation
* Miscellaneous fixes
Thanks,
Ingo
------------------>
Fabian Frederick (1):
rcu: Make rcu node arrays static const char * const
Joe Perches (2):
rcu: Update rcu torture maintainership filename patterns
scripts: Teach get_maintainer.pl about the new "R:" tag
Kees Cook (1):
torture: Avoid format string leak to thead name
Paul E. McKenney (25):
rcu: Export debug_init_rcu_head() and and debug_init_rcu_head()
rcu: Reduce overhead of cond_resched() checks for RCU
torture: Enable versions without CFcommon to function correctly
torture: Clean up diagnostics from --buildonly runs
MAINTAINERS: Add "R:" designated-reviewers tag
rcu: Add designated reviewers for RCU
rcu: Parallelize and economize NOCB kthread wakeups
rcu: Don't offload callbacks unless specifically requested
documentation: Clarify wake-up/memory-barrier relationship
documentation: Add acquire/release barriers to pairing rules
documentation: Add pointer to percpu-ref for RCU and refcount
rcu: Update RCU maintainership
rcu: Document deadlock-avoidance information for rcu_read_unlock()
rcu: Handle obsolete references to TINY_PREEMPT_RCU
signal: Explain local_irq_save() call
rcu: Remove redundant ACCESS_ONCE() from tick_do_timer_cpu
rcu: Eliminate read-modify-write ACCESS_ONCE() calls
rcu: Loosen __call_rcu()'s rcu_head alignment constraint
rcu: Allow post-unlock reference for rt_mutex
rcu: Simplify priority boosting by putting rt_mutex in rcu_node
rcu: Bind grace-period kthreads to non-NO_HZ_FULL CPUs
rcu: Don't use NMIs to dump other CPUs' stacks
rcu: Remove CONFIG_PROVE_RCU_DELAY
rcu: Fix __rcu_reclaim() to use true/false for bool
rcu: Allow for NULL tick_nohz_full_mask when nohz_full= missing
Pranith Kumar (4):
documentation: Update reference, kerneltrap.org no longer works
rcu: Check both root and current rcu_node when setting up future grace period
rcu: Fix a sparse warning in rcu_initiate_boost()
rcu: Fix a sparse warning in rcu_report_unblock_qs_rnp()
Shan Wei (1):
rcu: Use __this_cpu_read() instead of per_cpu_ptr()
Documentation/RCU/RTFP.txt | 4 +- Documentation/RCU/rcuref.txt | 9 + Documentation/kernel-parameters.txt | 13 + Documentation/memory-barriers.txt | 27 +- MAINTAINERS | 18 +- include/linux/init_task.h | 9 +- include/linux/rcupdate.h | 91 +++--- include/linux/sched.h | 6 - include/linux/tick.h | 20 ++ init/Kconfig | 6 +- kernel/rcu/rcu.h | 8 +- kernel/rcu/srcu.c | 4 +- kernel/rcu/tree.c | 199 ++++++++++---- kernel/rcu/tree.h | 42 ++- kernel/rcu/tree_plugin.h | 304 +++++++++++++++++---- kernel/rcu/update.c | 25 +- kernel/sched/core.c | 7 +- kernel/signal.c | 4 + kernel/time/tick-sched.c | 10 + kernel/torture.c | 2 +- lib/Kconfig.debug | 14 - scripts/get_maintainer.pl | 22 +- .../selftests/rcutorture/bin/kvm-recheck.sh | 8 +- .../selftests/rcutorture/bin/kvm-test-1-run.sh | 9 +- tools/testing/selftests/rcutorture/bin/kvm.sh | 21 +- .../selftests/rcutorture/configs/rcu/TREE01 | 1 - .../selftests/rcutorture/configs/rcu/TREE02 | 1 - .../selftests/rcutorture/configs/rcu/TREE02-T | 1 - .../selftests/rcutorture/configs/rcu/TREE03 | 1 - .../selftests/rcutorture/configs/rcu/TREE04 | 1 - .../selftests/rcutorture/configs/rcu/TREE05 | 1 - .../selftests/rcutorture/configs/rcu/TREE06 | 1 - .../selftests/rcutorture/configs/rcu/TREE07 | 1 - .../selftests/rcutorture/configs/rcu/TREE08 | 1 - .../selftests/rcutorture/configs/rcu/TREE08-T | 1 - .../selftests/rcutorture/configs/rcu/TREE09 | 1 - .../configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp | 1 - .../configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp | 1 - .../configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp | 1 - .../configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp | 1 - .../selftests/rcutorture/doc/TREE_RCU-kconfig.txt | 1 - 41 files changed, 629 insertions(+), 269 deletions(-)
Documentation/RCU/RTFP.txt +2 -2
@@ -2451,8 +2451,8 @@ lot of {Linux} into your technology!!!" ,month="February" ,year="2010" ,note="Available: -\url{http://kerneltrap.com/mailarchive/linux-netdev/2010/2/26/6270589} -[Viewed March 20, 2011]" +\url{http://thread.gmane.org/gmane.linux.network/153338} +[Viewed June 9, 2014]" ,annotation={ Use a pair of list_head structures to support RCU-protected resizable hash tables.
Documentation/RCU/rcuref.txt +9 -0
@@ -1,5 +1,14 @@ Reference-count design for elements of lists/arrays protected by RCU. + +Please note that the percpu-ref feature is likely your first +stop if you need to combine reference counts and RCU. Please see +include/linux/percpu-refcount.h for more information. However, in +those unusual cases where percpu-ref would consume too much memory, +please read on. + +------------------------------------------------------------------------ + Reference counting on elements of lists which are protected by traditional reader/writer spinlocks or semaphores are straightforward:
Documentation/kernel-parameters.txt +13 -0
@@ -2790,6 +2790,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. leaf rcu_node structure. Useful for very large systems. + rcutree.jiffies_till_sched_qs= [KNL] + Set required age in jiffies for a + given grace period before RCU starts + soliciting quiescent-state help from + rcu_note_context_switch(). + rcutree.jiffies_till_first_fqs= [KNL] Set delay from grace-period initialization to first attempt to force quiescent states.
@@ -2801,6 +2807,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted. quiescent states. Units are jiffies, minimum value is one, and maximum value is HZ. + rcutree.rcu_nocb_leader_stride= [KNL] + Set the number of NOCB kthread groups, which + defaults to the square root of the number of + CPUs. Larger numbers reduces the wakeup overhead + on the per-CPU grace-period kthreads, but increases + that same overhead on each group's leader. + rcutree.qhimark= [KNL] Set threshold of queued RCU callbacks beyond which batch limiting is disabled.
Documentation/memory-barriers.txt +23 -4
@@ -757,10 +757,14 @@ SMP BARRIER PAIRING When dealing with CPU-CPU interactions, certain types of memory barrier should always be paired. A lack of appropriate pairing is almost certainly an error. -A write barrier should always be paired with a data dependency barrier or read -barrier, though a general barrier would also be viable. Similarly a read -barrier or a data dependency barrier should always be paired with at least an -write barrier, though, again, a general barrier is viable: +General barriers pair with each other, though they also pair with +most other types of barriers, albeit without transitivity. An acquire +barrier pairs with a release barrier, but both may also pair with other +barriers, including of course general barriers. A write barrier pairs +with a data dependency barrier, an acquire barrier, a release barrier, +a read barrier, or a general barrier. Similarly a read barrier or a +data dependency barrier pairs with a write barrier, an acquire barrier, +a release barrier, or a general barrier: CPU 1 CPU 2 =============== ===============
@@ -1893,6 +1897,21 @@ between the STORE to indicate the event and the STORE to set TASK_RUNNING: <general barrier> STORE current->state LOAD event_indicated +To repeat, this write memory barrier is present if and only if something +is actually awakened. To see this, consider the following sequence of +events, where X and Y are both initially zero: + + CPU 1 CPU 2 + =============================== =============================== + X = 1; STORE event_indicated + smp_mb(); wake_up(); + Y = 1; wait_event(wq, Y == 1); + wake_up(); load from Y sees 1, no memory barrier + load from X might see 0 + +In contrast, if a wakeup does occur, CPU 2's load from X would be guaranteed +to see 1. + The available waker functions include: complete();
MAINTAINERS +15 -3
@@ -70,6 +70,8 @@ Descriptions of section entries: P: Person (obsolete) M: Mail patches to: FullName <address@domain> + R: Designated reviewer: FullName <address@domain> + These reviewers should be CCed on patches. L: Mailing list that is relevant to this area W: Web-page with status/info Q: Patchwork web based patch tracking system site
@@ -7426,10 +7428,14 @@ L: [email protected] S: Supported T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git F: Documentation/RCU/torture.txt -F: kernel/rcu/torture.c +F: kernel/rcu/rcutorture.c RCUTORTURE TEST FRAMEWORK M: "Paul E. McKenney" <[email protected]> +M: Josh Triplett <[email protected]> +R: Steven Rostedt <[email protected]> +R: Mathieu Desnoyers <[email protected]> +R: Lai Jiangshan <[email protected]> L: [email protected] S: Supported T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
@@ -7452,8 +7458,11 @@ S: Supported F: net/rds/ READ-COPY UPDATE (RCU) -M: Dipankar Sarma <[email protected]> M: "Paul E. McKenney" <[email protected]> +M: Josh Triplett <[email protected]> +R: Steven Rostedt <[email protected]> +R: Mathieu Desnoyers <[email protected]> +R: Lai Jiangshan <[email protected]> L: [email protected] W: http://www.rdrop.com/users/paulmck/RCU/ S: Supported
@@ -7463,7 +7472,7 @@ X: Documentation/RCU/torture.txt F: include/linux/rcu* X: include/linux/srcu.h F: kernel/rcu/ -X: kernel/rcu/torture.c +X: kernel/torture.c REAL TIME CLOCK (RTC) SUBSYSTEM M: Alessandro Zummo <[email protected]>
@@ -8236,6 +8245,9 @@ F: mm/sl?b* SLEEPABLE READ-COPY UPDATE (SRCU) M: Lai Jiangshan <[email protected]> M: "Paul E. McKenney" <[email protected]> +M: Josh Triplett <[email protected]> +R: Steven Rostedt <[email protected]> +R: Mathieu Desnoyers <[email protected]> L: [email protected] W: http://www.rdrop.com/users/paulmck/RCU/ S: Supported
include/linux/init_task.h +1 -8
@@ -102,12 +102,6 @@ extern struct group_info init_groups;#define INIT_IDS #endif -#ifdef CONFIG_RCU_BOOST -#define INIT_TASK_RCU_BOOST () \ - .rcu_boost_mutex = NULL, -#else -#define INIT_TASK_RCU_BOOST () -#endif #ifdef CONFIG_TREE_PREEMPT_RCU #define INIT_TASK_RCU_TREE_PREEMPT () \ .rcu_blocked_node = NULL,
@@ -119,8 +113,7 @@ extern struct group_info init_groups; .rcu_read_lock_nesting = 0, \ .rcu_read_unlock_special = 0, \ .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \ - INIT_TASK_RCU_TREE_PREEMPT() \ - INIT_TASK_RCU_BOOST() + INIT_TASK_RCU_TREE_PREEMPT()#else #define INIT_TASK_RCU_PREEMPT (tsk)#endif
include/linux/rcupdate.h +46 -45
124 lines not on this page · raw message
include/linux/sched.h +0 -6
@@ -1270,9 +1270,6 @@ struct task_struct {#ifdef CONFIG_TREE_PREEMPT_RCU struct rcu_node *rcu_blocked_node;#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ -#ifdef CONFIG_RCU_BOOST -struct rt_mutex *rcu_boost_mutex; -#endif /* #ifdef CONFIG_RCU_BOOST */ #if defined(CONFIG_SCHEDSTATS ) || defined(CONFIG_TASK_DELAY_ACCT )struct sched_info sched_info;
@@ -2009,9 +2006,6 @@ static inline void rcu_copy_process(struct task_struct *p)#ifdef CONFIG_TREE_PREEMPT_RCU p->rcu_blocked_node =NULL ;#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ -#ifdef CONFIG_RCU_BOOST - p->rcu_boost_mutex =NULL ; -#endif /* #ifdef CONFIG_RCU_BOOST */ INIT_LIST_HEAD (&p->rcu_node_entry); }
include/linux/tick.h +20 -0
@@ -12,6 +12,7 @@#include <linux/hrtimer.h> #include <linux/context_tracking_state.h> #include <linux/cpumask.h> +#include <linux/sched.h> #ifdef CONFIG_GENERIC_CLOCKEVENTS
@@ -162,6 +163,7 @@ static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }#ifdef CONFIG_NO_HZ_FULL extern bool tick_nohz_full_running;extern cpumask_var_t tick_nohz_full_mask; +extern cpumask_var_t housekeeping_mask;static inline bool tick_nohz_full_enabled (void ) {
@@ -194,6 +196,24 @@ static inline void tick_nohz_full_kick_all(void) { }static inline void __tick_nohz_task_switch (struct task_struct *tsk) { }#endif +static inline bool is_housekeeping_cpu (int cpu) +{ +#ifdef CONFIG_NO_HZ_FULL +if (tick_nohz_full_enabled ()) +return cpumask_test_cpu (cpu, housekeeping_mask); +#endif +return true; +} + +static inline void housekeeping_affine (struct task_struct *t) +{ +#ifdef CONFIG_NO_HZ_FULL +if (tick_nohz_full_enabled ()) +set_cpus_allowed_ptr (t, housekeeping_mask); + +#endif +} +static inline void tick_nohz_full_check (void ) {if (tick_nohz_full_enabled ())
init/Kconfig +3 -3
@@ -505,7 +505,7 @@ config PREEMPT_RCU def_bool TREE_PREEMPT_RCU help This option enables preemptible-RCU code that is common between - the TREE_PREEMPT_RCU and TINY_PREEMPT_RCU implementations. + TREE_PREEMPT_RCU and, in the old days, TINY_PREEMPT_RCU. config RCU_STALL_COMMON def_bool ( TREE_RCU || TREE_PREEMPT_RCU || RCU_TRACE )
@@ -737,7 +737,7 @@ choice config RCU_NOCB_CPU_NONE bool "No build_forced no-CBs CPUs" - depends on RCU_NOCB_CPU && !NO_HZ_FULL + depends on RCU_NOCB_CPU && !NO_HZ_FULL_ALL help This option does not force any of the CPUs to be no-CBs CPUs. Only CPUs designated by the rcu_nocbs= boot parameter will be
@@ -751,7 +751,7 @@ config RCU_NOCB_CPU_NONE config RCU_NOCB_CPU_ZERO bool "CPU 0 is a build_forced no-CBs CPU" - depends on RCU_NOCB_CPU && !NO_HZ_FULL + depends on RCU_NOCB_CPU && !NO_HZ_FULL_ALL help This option forces CPU 0 to be a no-CBs CPU, so that its RCU callbacks are invoked by a per-CPU kthread whose name begins
kernel/rcu/rcu.h +6 -2
@@ -99,6 +99,10 @@ static inline void debug_rcu_head_unqueue(struct rcu_head *head)void kfree (const void *); +/* +* Reclaim the specified callback, either by invoking it (non-lazy case) +* or freeing it directly (lazy case). Return true if lazy, false otherwise. +*/ static inline bool __rcu_reclaim (const char *rn,struct rcu_head *head) {unsigned long offset = (unsigned long )head->func;
@@ -108,12 +112,12 @@ static inline bool __rcu_reclaim(const char *rn, struct rcu_head *head)RCU_TRACE (trace_rcu_invoke_kfree_callback (rn, head, offset));kfree ((void *)head - offset);rcu_lock_release (&rcu_callback_map); -return 1 ; +return true; }else {RCU_TRACE (trace_rcu_invoke_callback (rn, head)); head->func (head);rcu_lock_release (&rcu_callback_map); -return 0 ; +return false; } }
kernel/rcu/srcu.c +2 -2
@@ -298,9 +298,9 @@ int __srcu_read_lock(struct srcu_struct *sp) idx =ACCESS_ONCE (sp->completed) &0x1 ;preempt_disable (); -ACCESS_ONCE (this_cpu_ptr (sp->per_cpu_ref)->c[idx]) +=1 ; +__this_cpu_inc (sp->per_cpu_ref->c[idx]);smp_mb ();/* B */ /* Avoid leaking the critical section. */ -ACCESS_ONCE (this_cpu_ptr (sp->per_cpu_ref)->seq[idx]) +=1 ; +__this_cpu_inc (sp->per_cpu_ref->seq[idx]);preempt_enable ();return idx; }
kernel/rcu/tree.c +141 -58
327 lines not on this page · raw message
kernel/rcu/tree.h +39 -3
83 lines not on this page · raw message
kernel/rcu/tree_plugin.h +244 -60
431 lines not on this page · raw message
kernel/rcu/update.c +2 -23
@@ -90,9 +90,6 @@ void __rcu_read_unlock(void) }else {barrier ();/* critical section before exit code. */ t->rcu_read_lock_nesting =INT_MIN ; -#ifdef CONFIG_PROVE_RCU_DELAY -udelay (10 );/* Make preemption more probable. */ -#endif /* #ifdef CONFIG_PROVE_RCU_DELAY */ barrier ();/* assign before ->rcu_read_unlock_special load */ if (unlikely (ACCESS_ONCE (t->rcu_read_unlock_special)))rcu_read_unlock_special (t);
@@ -200,12 +197,12 @@ void wait_rcu_gp(call_rcu_func_t crf)EXPORT_SYMBOL_GPL (wait_rcu_gp);#ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD -static inline void debug_init_rcu_head (struct rcu_head *head) +void init_rcu_head (struct rcu_head *head) {debug_object_init (head, &rcuhead_debug_descr); } -static inline void debug_rcu_head_free (struct rcu_head *head) +void destroy_rcu_head (struct rcu_head *head) {debug_object_free (head, &rcuhead_debug_descr); }
@@ -350,21 +347,3 @@ 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 +1 -6
@@ -4147,7 +4147,6 @@ static void __cond_resched(void) int __sched _cond_resched(void) { -rcu_cond_resched ();if (should_resched ()) {__cond_resched ();return 1 ;
@@ -4166,18 +4165,15 @@ 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 || need_rcu_resched) { +if (spin_needbreak (lock) || resched) {spin_unlock (lock);if (resched)__cond_resched (); -else if (unlikely (need_rcu_resched)) -rcu_resched ();else cpu_relax (); ret =1 ;
@@ -4191,7 +4187,6 @@ 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/signal.c +4 -0
@@ -1263,6 +1263,10 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,struct sighand_struct *sighand;for (;;) { +/* +* Disable interrupts early to avoid deadlocks. +* See rcu_read_unlock() comment header for details. +*/ local_irq_save (*flags);rcu_read_lock (); sighand =rcu_dereference (tsk->sighand);
kernel/time/tick-sched.c +10 -0
@@ -154,6 +154,7 @@ static void tick_sched_handle(struct tick_sched *ts, struct pt_regs *regs)#ifdef CONFIG_NO_HZ_FULL cpumask_var_t tick_nohz_full_mask; +cpumask_var_t housekeeping_mask;bool tick_nohz_full_running;static bool can_stop_full_tick (void )
@@ -281,6 +282,7 @@ static int __init tick_nohz_full_setup(char *str)int cpu;alloc_bootmem_cpumask_var (&tick_nohz_full_mask); +alloc_bootmem_cpumask_var (&housekeeping_mask);if (cpulist_parse (str, tick_nohz_full_mask) <0 ) {pr_warning ("NOHZ: Incorrect nohz_full cpumask\n" );return 1 ;
@@ -291,6 +293,8 @@ static int __init tick_nohz_full_setup(char *str)pr_warning ("NO_HZ: Clearing %d from nohz_full range for timekeeping\n" , cpu);cpumask_clear_cpu (cpu, tick_nohz_full_mask); } +cpumask_andnot (housekeeping_mask, + cpu_possible_mask, tick_nohz_full_mask); tick_nohz_full_running = true;return 1 ;
@@ -332,9 +336,15 @@ static int tick_nohz_init_all(void)pr_err ("NO_HZ: Can't allocate full dynticks cpumask\n" );return err; } +if (!alloc_cpumask_var (&housekeeping_mask,GFP_KERNEL )) { +pr_err ("NO_HZ: Can't allocate not-full dynticks cpumask\n" ); +return err; + } err =0 ;cpumask_setall (tick_nohz_full_mask);cpumask_clear_cpu (smp_processor_id (), tick_nohz_full_mask); +cpumask_clear (housekeeping_mask); +cpumask_set_cpu (smp_processor_id (), housekeeping_mask); tick_nohz_full_running = true;#endif return err;
kernel/torture.c +1 -1
@@ -708,7 +708,7 @@ int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,int ret =0 ;VERBOSE_TOROUT_STRING (m); - *tp =kthread_run (fn, arg, s); + *tp =kthread_run (fn, arg,"%s" , s);if (IS_ERR (*tp)) { ret =PTR_ERR (*tp);VERBOSE_TOROUT_ERRSTRING (f);
lib/Kconfig.debug +0 -14
@@ -1131,20 +1131,6 @@ config PROVE_RCU_REPEATEDLY Say N if you are unsure. -config PROVE_RCU_DELAY - bool "RCU debugging: preemptible RCU race provocation" - depends on DEBUG_KERNEL && PREEMPT_RCU - default n - help - There is a class of races that involve an unlikely preemption - of __rcu_read_unlock() just after ->rcu_read_lock_nesting has - been set to INT_MIN. This feature inserts a delay at that - point to increase the probability of these races. - - Say Y to increase probability of preemption of __rcu_read_unlock(). - - Say N if you are unsure. - config SPARSE_RCU_POINTER bool "RCU debugging: sparse-based checks for pointer usage" default n
scripts/get_maintainer.pl +21 -1
@@ -21,6 +21,7 @@ my $lk_path = "./"; my $email = 1; my $email_usename = 1; my $email_maintainer = 1; +my $email_reviewer = 1; my $email_list = 1; my $email_subscriber_list = 0; my $email_git_penguin_chiefs = 0;
@@ -202,6 +203,7 @@ if (!GetOptions( 'remove-duplicates!' => \$email_remove_duplicates, 'mailmap!' => \$email_use_mailmap, 'm!' => \$email_maintainer, + 'r!' => \$email_reviewer, 'n!' => \$email_usename, 'l!' => \$email_list, 's!' => \$email_subscriber_list,
@@ -260,7 +262,8 @@ if ($sections) { } if ($email && - ($email_maintainer + $email_list + $email_subscriber_list + + ($email_maintainer + $email_reviewer + + $email_list + $email_subscriber_list + $email_git + $email_git_penguin_chiefs + $email_git_blame) == 0) { die "$P: Please select at least 1 email option\n"; }
@@ -750,6 +753,7 @@ MAINTAINER field selection options: --hg-since => hg history to use (default: $email_hg_since) --interactive => display a menu (mostly useful if used with the --git option) --m => include maintainer(s) if any + --r => include reviewer(s) if any --n => include name 'Full Name <addr\@domain.tld>' --l => include list(s) if any --s => include subscriber only list(s) if any
@@ -1064,6 +1068,22 @@ sub add_categories { my $role = get_maintainer_role($i); push_email_addresses($pvalue, $role); } + } elsif ($ptype eq "R") { + my ($name, $address) = parse_email($pvalue); + if ($name eq "") { + if ($i > 0) { + my $tv = $typevalue[$i - 1]; + if ($tv =~ m/^(\C):\s*(.*)/) { + if ($1 eq "P") { + $name = $2; + $pvalue = format_email($name, $address, $email_usename); + } + } + } + } + if ($email_reviewer) { + push_email_addresses($pvalue, 'reviewer'); + } } elsif ($ptype eq "T") { push(@scm, $pvalue); } elsif ($ptype eq "W") {
tools/testing/selftests/rcutorture/bin/kvm-recheck.sh +7 -1
@@ -54,10 +54,16 @@ do if test -f "$i/qemu-cmd" then print_bug qemu failed + echo " $i" + elif test -f "$i/buildonly" + then + echo Build-only run, no boot/test + configcheck.sh $i/.config $i/ConfigFragment + parse-build.sh $i/Make.out $configfile else print_bug Build failed + echo " $i" fi - echo " $i" fi done done
tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh +7 -2
@@ -42,6 +42,7 @@ grace=120 T=/tmp/kvm-test-1-run.sh.$$ trap 'rm -rf $T' 0 +touch $T . $KVM/bin/functions.sh . $KVPATH/ver_functions.sh
@@ -131,7 +132,10 @@ boot_args=$6 cd $KVM kstarttime=`awk 'BEGIN { print systime() }' < /dev/null` -echo ' ---' `date`: Starting kernel +if test -z "$TORTURE_BUILDONLY" +then + echo ' ---' `date`: Starting kernel +fi # Generate -smp qemu argument. qemu_args="-nographic $qemu_args"
@@ -157,12 +161,13 @@ boot_args="`configfrag_boot_params "$boot_args" "$config_template"`" # Generate kernel-version-specific boot parameters boot_args="`per_version_boot_params "$boot_args" $builddir/.config $seconds`" -echo $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd if test -n "$TORTURE_BUILDONLY" then echo Build-only run specified, boot/test omitted. + touch $resdir/buildonly exit 0 fi +echo $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd ( $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append "$qemu_append $boot_args"; echo $? > $resdir/qemu-retval ) & qemu_pid=$! commandcompleted=0
tools/testing/selftests/rcutorture/bin/kvm.sh +12 -9
@@ -340,12 +340,18 @@ function dump(first, pastlast) for (j = 1; j < jn; j++) { builddir=KVM "/b" j print "rm -f " builddir ".ready" - print "echo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date`"; - print "echo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date` >> " rd "/log"; + print "if test -z \"$TORTURE_BUILDONLY\"" + print "then" + print "\techo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date`"; + print "\techo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date` >> " rd "/log"; + print "fi" } print "wait" - print "echo ---- All kernel runs complete. `date`"; - print "echo ---- All kernel runs complete. `date` >> " rd "/log"; + print "if test -z \"$TORTURE_BUILDONLY\"" + print "then" + print "\techo ---- All kernel runs complete. `date`"; + print "\techo ---- All kernel runs complete. `date` >> " rd "/log"; + print "fi" for (j = 1; j < jn; j++) { builddir=KVM "/b" j print "echo ----", cfr[j], cpusr[j] ovf ": Build/run results:";
@@ -385,10 +391,7 @@ echo echo echo " --- `date` Test summary:" echo Results directory: $resdir/$ds -if test -z "$TORTURE_BUILDONLY" -then - kvm-recheck.sh $resdir/$ds -fi +kvm-recheck.sh $resdir/$ds ___EOF___ if test "$dryrun" = script
@@ -403,7 +406,7 @@ then sed -e 's/:.*$//' -e 's/^echo //' exit 0 else - # Not a dryru, so run the script. + # Not a dryrun, so run the script. sh $T/script fi
tools/testing/selftests/rcutorture/configs/rcu/TREE01 +0 -1
@@ -15,7 +15,6 @@ CONFIG_RCU_FANOUT_EXACT=n CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ZERO=y CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_RCU_BOOST=n
tools/testing/selftests/rcutorture/configs/rcu/TREE02 +0 -1
@@ -18,7 +18,6 @@ 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
tools/testing/selftests/rcutorture/configs/rcu/TREE02-T +0 -1
@@ -18,7 +18,6 @@ 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
tools/testing/selftests/rcutorture/configs/rcu/TREE03 +0 -1
@@ -14,7 +14,6 @@ CONFIG_RCU_FANOUT_LEAF=4 CONFIG_RCU_FANOUT_EXACT=n CONFIG_RCU_NOCB_CPU=n CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_RCU_BOOST=y
tools/testing/selftests/rcutorture/configs/rcu/TREE04 +0 -1
@@ -18,7 +18,6 @@ CONFIG_RCU_FANOUT_LEAF=2 CONFIG_RCU_FANOUT_EXACT=n CONFIG_RCU_NOCB_CPU=n CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=y CONFIG_RCU_CPU_STALL_VERBOSE=y CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
tools/testing/selftests/rcutorture/configs/rcu/TREE05 +0 -1
@@ -18,7 +18,6 @@ CONFIG_RCU_NOCB_CPU_NONE=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y CONFIG_PROVE_RCU=y -CONFIG_PROVE_RCU_DELAY=y CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
tools/testing/selftests/rcutorture/configs/rcu/TREE06 +0 -1
@@ -19,7 +19,6 @@ CONFIG_RCU_NOCB_CPU=n CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y CONFIG_PROVE_RCU=y -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
tools/testing/selftests/rcutorture/configs/rcu/TREE07 +0 -1
@@ -17,7 +17,6 @@ CONFIG_RCU_FANOUT_LEAF=2 CONFIG_RCU_FANOUT_EXACT=n CONFIG_RCU_NOCB_CPU=n CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=y CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
tools/testing/selftests/rcutorture/configs/rcu/TREE08 +0 -1
@@ -18,7 +18,6 @@ CONFIG_RCU_FANOUT_LEAF=2 CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_RCU_BOOST=n
tools/testing/selftests/rcutorture/configs/rcu/TREE08-T +0 -1
@@ -18,7 +18,6 @@ CONFIG_RCU_FANOUT_LEAF=2 CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_RCU_BOOST=n
tools/testing/selftests/rcutorture/configs/rcu/TREE09 +0 -1
@@ -13,7 +13,6 @@ CONFIG_SUSPEND=n CONFIG_HIBERNATION=n CONFIG_RCU_NOCB_CPU=n CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_RCU_BOOST=n
tools/testing/selftests/rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp +0 -1
@@ -13,7 +13,6 @@ CONFIG_PREEMPT_VOLUNTARY=n CONFIG_PREEMPT=y #CHECK#CONFIG_TREE_PREEMPT_RCU=y CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y CONFIG_DEBUG_OBJECTS=y CONFIG_DEBUG_OBJECTS_RCU_HEAD=y CONFIG_RT_MUTEXES=y
tools/testing/selftests/rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp +0 -1
@@ -13,7 +13,6 @@ CONFIG_PREEMPT_VOLUNTARY=n CONFIG_PREEMPT=y #CHECK#CONFIG_TREE_PREEMPT_RCU=y CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y CONFIG_DEBUG_OBJECTS=y CONFIG_DEBUG_OBJECTS_RCU_HEAD=y CONFIG_RT_MUTEXES=y
tools/testing/selftests/rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp +0 -1
@@ -13,7 +13,6 @@ CONFIG_PREEMPT_VOLUNTARY=n CONFIG_PREEMPT=y #CHECK#CONFIG_TREE_PREEMPT_RCU=y CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y CONFIG_DEBUG_OBJECTS=y CONFIG_DEBUG_OBJECTS_RCU_HEAD=y CONFIG_RT_MUTEXES=y
tools/testing/selftests/rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp +0 -1
@@ -13,7 +13,6 @@ CONFIG_PREEMPT_VOLUNTARY=n CONFIG_PREEMPT=y #CHECK#CONFIG_TREE_PREEMPT_RCU=y CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y CONFIG_DEBUG_OBJECTS=y CONFIG_DEBUG_OBJECTS_RCU_HEAD=y CONFIG_RT_MUTEXES=y
tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt +0 -1
@@ -14,7 +14,6 @@ CONFIG_NO_HZ_FULL_SYSIDLE -- Do one. CONFIG_PREEMPT -- Do half. (First three and #8.) CONFIG_PROVE_LOCKING -- Do all but two, covering CONFIG_PROVE_RCU and not. CONFIG_PROVE_RCU -- Do all but one under CONFIG_PROVE_LOCKING. -CONFIG_PROVE_RCU_DELAY -- Do one. CONFIG_RCU_BOOST -- one of TREE_PREEMPT_RCU. CONFIG_RCU_BOOST_PRIO -- set to 2 for _BOOST testing. CONFIG_RCU_CPU_STALL_INFO -- do one with and without _VERBOSE.