The patch titled rcu: simplify/improve batch tuning has been added to the -mm tree. Its filename is rcu-simplify-improve-batch-tuning.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: rcu: simplify/improve batch tuning From: Oleg Nesterov <oleg@xxxxxxxxxx> Kill a hard-to-calculate 'rsinterval' boot parameter and per-cpu rcu_data.last_rs_qlen. Instead, it adds adds a flag rcu_ctrlblk.signaled, which records the fact that one of CPUs has sent a resched IPI since the last rcu_start_batch(). Roughly speaking, we need two rcu_start_batch()s in order to move callbacks from ->nxtlist to ->donelist. This means that when ->qlen exceeds qhimark and continues to grow, we should send a resched IPI, and then do it again after we gone through a quiescent state. On the other hand, if it was already sent, we don't need to do it again when another CPU detects overflow of the queue. Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx> Acked-by: Paul E. McKenney <paulmck@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- Documentation/kernel-parameters.txt | 4 ---- include/linux/rcupdate.h | 5 ++--- kernel/rcupdate.c | 11 +++-------- 3 files changed, 5 insertions(+), 15 deletions(-) diff -puN Documentation/kernel-parameters.txt~rcu-simplify-improve-batch-tuning Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt~rcu-simplify-improve-batch-tuning +++ a/Documentation/kernel-parameters.txt @@ -1351,10 +1351,6 @@ and is between 256 and 4096 characters. rcu.qlowmark= [KNL,BOOT] Set threshold of queued RCU callbacks below which batch limiting is re-enabled. - rcu.rsinterval= [KNL,BOOT,SMP] Set the number of additional - RCU callbacks to queued before forcing reschedule - on all cpus. - rdinit= [KNL] Format: <full_path> Run specified binary instead of /init from the ramdisk, diff -puN include/linux/rcupdate.h~rcu-simplify-improve-batch-tuning include/linux/rcupdate.h --- a/include/linux/rcupdate.h~rcu-simplify-improve-batch-tuning +++ a/include/linux/rcupdate.h @@ -66,6 +66,8 @@ struct rcu_ctrlblk { long completed; /* Number of the last completed batch */ int next_pending; /* Is the next batch already waiting? */ + int signaled; + spinlock_t lock ____cacheline_internodealigned_in_smp; cpumask_t cpumask; /* CPUs that need to switch in order */ /* for current batch to proceed. */ @@ -106,9 +108,6 @@ struct rcu_data { long blimit; /* Upper limit on a processed batch */ int cpu; struct rcu_head barrier; -#ifdef CONFIG_SMP - long last_rs_qlen; /* qlen during the last resched */ -#endif }; DECLARE_PER_CPU(struct rcu_data, rcu_data); diff -puN kernel/rcupdate.c~rcu-simplify-improve-batch-tuning kernel/rcupdate.c --- a/kernel/rcupdate.c~rcu-simplify-improve-batch-tuning +++ a/kernel/rcupdate.c @@ -71,9 +71,6 @@ static DEFINE_PER_CPU(struct tasklet_str static int blimit = 10; static int qhimark = 10000; static int qlowmark = 100; -#ifdef CONFIG_SMP -static int rsinterval = 1000; -#endif static atomic_t rcu_barrier_cpu_count; static DEFINE_MUTEX(rcu_barrier_mutex); @@ -86,8 +83,8 @@ static void force_quiescent_state(struct int cpu; cpumask_t cpumask; set_need_resched(); - if (unlikely(rdp->qlen - rdp->last_rs_qlen > rsinterval)) { - rdp->last_rs_qlen = rdp->qlen; + if (unlikely(!rcp->signaled)) { + rcp->signaled = 1; /* * Don't send IPI to itself. With irqs disabled, * rdp->cpu is the current cpu. @@ -297,6 +294,7 @@ static void rcu_start_batch(struct rcu_c smp_mb(); cpus_andnot(rcp->cpumask, cpu_online_map, nohz_cpu_mask); + rcp->signaled = 0; } } @@ -624,9 +622,6 @@ void synchronize_rcu(void) module_param(blimit, int, 0); module_param(qhimark, int, 0); module_param(qlowmark, int, 0); -#ifdef CONFIG_SMP -module_param(rsinterval, int, 0); -#endif EXPORT_SYMBOL_GPL(rcu_batches_completed); EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); EXPORT_SYMBOL_GPL(call_rcu); _ Patches currently in -mm which might be from oleg@xxxxxxxxxx are git-block.patch pid-implement-transfer_pid-and-use-it-to-simplify-de_thread.patch pid-remove-temporary-debug-code-in-attach_pid.patch rtmutex-clean-up-and-remove-some-extra-spinlocks.patch rtmutex-clean-up-and-remove-some-extra-spinlocks-more.patch elf_core_dump-dont-take-tasklist_lock.patch elf_fdpic_core_dump-dont-take-tasklist_lock.patch has_stopped_jobs-cleanup.patch __dequeue_signal-cleanup.patch do_sched_setscheduler-dont-take-tasklist_lock.patch introduce-is_rt_policy-helper.patch sched_setscheduler-fix-policy-checks.patch reparent_to_init-use-has_rt_policy.patch copy_process-cosmetic-ioprio-tweak.patch futex_find_get_task-dont-take-tasklist_lock.patch sys_get_robust_list-dont-take-tasklist_lock.patch set-exit_dead-state-in-do_exit-not-in-schedule.patch kill-pf_dead-flag.patch introduce-task_dead-state.patch select_bad_process-kill-a-bogus-pf_dead-task_dead-check.patch select_bad_process-cleanup-releasing-check.patch oom_kill_task-cleanup-mm-checks.patch audit-accounting-tty-locking.patch proc-readdir-race-fix-take-3-race-fix.patch simplify-pid-iterators.patch rcu-simplify-improve-batch-tuning.patch pidhash-temporary-debug-checks.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html