lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <1356799386-4212-28-git-send-email-fweisbec@gmail.com> Date: Sat, 29 Dec 2012 17:43:06 +0100 From: Frederic Weisbecker <fweisbec@...il.com> To: LKML <linux-kernel@...r.kernel.org> Cc: Frederic Weisbecker <fweisbec@...il.com>, Alessio Igor Bogani <abogani@...nel.org>, Andrew Morton <akpm@...ux-foundation.org>, Chris Metcalf <cmetcalf@...era.com>, Christoph Lameter <cl@...ux.com>, Geoff Levand <geoff@...radead.org>, Gilad Ben Yossef <gilad@...yossef.com>, Hakan Akkan <hakanakkan@...il.com>, Ingo Molnar <mingo@...nel.org>, "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>, Paul Gortmaker <paul.gortmaker@...driver.com>, Peter Zijlstra <peterz@...radead.org>, Steven Rostedt <rostedt@...dmis.org>, Thomas Gleixner <tglx@...utronix.de> Subject: [PATCH 27/27] timer: Don't run non-pinned timer to full dynticks CPUs While trying to find a target for a non-pinned timer, use the following logic: - Use the closest (from a sched domain POV) busy CPU that is not full dynticks - If none, use the closest idle CPU that is not full dynticks. So this is biased toward isolation over powersaving. This is a quick hack until we provide a way for the user to tune that policy. A CPU mask affinity for non pinned timers could be such a solution. Original-patch-by: Thomas Gleixner <tglx@...utronix.de> Signed-off-by: Frederic Weisbecker <fweisbec@...il.com> Cc: Alessio Igor Bogani <abogani@...nel.org> Cc: Andrew Morton <akpm@...ux-foundation.org> Cc: Chris Metcalf <cmetcalf@...era.com> Cc: Christoph Lameter <cl@...ux.com> Cc: Geoff Levand <geoff@...radead.org> Cc: Gilad Ben Yossef <gilad@...yossef.com> Cc: Hakan Akkan <hakanakkan@...il.com> Cc: Ingo Molnar <mingo@...nel.org> Cc: Paul E. McKenney <paulmck@...ux.vnet.ibm.com> Cc: Paul Gortmaker <paul.gortmaker@...driver.com> Cc: Peter Zijlstra <peterz@...radead.org> Cc: Steven Rostedt <rostedt@...dmis.org> Cc: Thomas Gleixner <tglx@...utronix.de> --- kernel/hrtimer.c | 3 ++- kernel/sched/core.c | 26 +++++++++++++++++++++++--- kernel/timer.c | 3 ++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 6db7a5e..f5da6fb 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -159,7 +159,8 @@ struct hrtimer_clock_base *lock_hrtimer_base(const struct hrtimer *timer, static int hrtimer_get_target(int this_cpu, int pinned) { #ifdef CONFIG_NO_HZ - if (!pinned && get_sysctl_timer_migration() && idle_cpu(this_cpu)) + if (!pinned && get_sysctl_timer_migration() && + (idle_cpu(this_cpu) || tick_nohz_full_cpu(this_cpu))) return get_nohz_timer_target(); #endif return this_cpu; diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 7b6156a..e2884c5 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -560,22 +560,42 @@ void resched_cpu(int cpu) */ int get_nohz_timer_target(void) { - int cpu = smp_processor_id(); int i; struct sched_domain *sd; + int cpu = smp_processor_id(); + int target = -1; rcu_read_lock(); for_each_domain(cpu, sd) { for_each_cpu(i, sched_domain_span(sd)) { + /* + * This is biased toward CPU isolation usecase: + * try to migrate the timer to a busy non-full-nohz + * CPU. If there is none, then prefer an idle CPU + * than a full nohz one. + * We shouldn't do policy here (isolation VS powersaving) + * so this is a temporary hack. Being able to affine + * non-pinned timers would be a better thing. + */ + if (tick_nohz_full_cpu(i)) + continue; + if (!idle_cpu(i)) { - cpu = i; + target = i; goto unlock; } + + if (target == -1) + target = i; } } + /* Fallback in case of NULL domain */ + if (target == -1) + target = cpu; unlock: rcu_read_unlock(); - return cpu; + + return target; } /* * When add_timer_on() enqueues a timer into the timer wheel of an diff --git a/kernel/timer.c b/kernel/timer.c index 970b57d..51dd02b 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -738,7 +738,8 @@ __mod_timer(struct timer_list *timer, unsigned long expires, cpu = smp_processor_id(); #if defined(CONFIG_NO_HZ) && defined(CONFIG_SMP) - if (!pinned && get_sysctl_timer_migration() && idle_cpu(cpu)) + if (!pinned && get_sysctl_timer_migration() && + (idle_cpu(cpu) || tick_nohz_full_cpu(cpu))) cpu = get_nohz_timer_target(); #endif new_base = per_cpu(tvec_bases, cpu); -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists