Skip to content

Commit

Permalink
nohz: Basic full dynticks interface
Browse files Browse the repository at this point in the history
For extreme usecases such as Real Time or HPC, having
the ability to shutdown the tick when a single task runs
on a CPU is a desired feature:

* Reducing the amount of interrupts improves throughput
for CPU-bound tasks. The CPU is less distracted from its
real job, from an execution time and from the cache point
of views.

* This also improve latency response as we have less critical
sections.

Start with introducing a very simple interface to define
full dynticks CPU: use a boot time option defined cpumask
through the "nohz_extended=" kernel parameter. CPUs that
are part of this range will have their tick shutdown
whenever possible: provided they run a single task and
they don't do kernel activity that require the periodic
tick. These details will be later documented in
Documentation/*

An online CPU must be kept outside this range to handle the
timekeeping.

Suggested-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Geoff Levand <geoff@infradead.org>
Cc: Gilad Ben Yossef <gilad@benyossef.com>
Cc: Hakan Akkan <hakanakkan@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Kevin Hilman <khilman@linaro.org>
Cc: Li Zhong <zhong@linux.vnet.ibm.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Frederic Weisbecker committed Mar 21, 2013
1 parent a8d7ad5 commit a831881
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1913,6 +1913,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
Valid arguments: on, off
Default: on

nohz_extended= [KNL,BOOT]
In kernels built with CONFIG_NO_HZ_EXTENDED=y, set
the specified list of CPUs whose tick will be stopped
whenever possible. You need to keep at least one online
CPU outside the range to maintain the timekeeping.

noiotrap [SH] Disables trapped I/O port accesses.

noirqdebug [X86-32] Disables the code which attempts to detect and
Expand Down
7 changes: 7 additions & 0 deletions include/linux/tick.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,13 @@ static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
# endif /* !NO_HZ */

#ifdef CONFIG_NO_HZ_EXTENDED
extern int tick_nohz_extended_cpu(int cpu);
#else
static inline int tick_nohz_extended_cpu(int cpu) { return 0; }
#endif


# ifdef CONFIG_CPU_IDLE_GOV_MENU
extern void menu_hrtimer_cancel(void);
# else
Expand Down
19 changes: 19 additions & 0 deletions kernel/time/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,25 @@ config NO_HZ
only trigger on an as-needed basis both when the system is
busy and when the system is idle.

config NO_HZ_EXTENDED
bool "Full dynticks system"
depends on NO_HZ && RCU_USER_QS && VIRT_CPU_ACCOUNTING_GEN && RCU_NOCB_CPU && SMP
select CONTEXT_TRACKING_FORCE
help
Adaptively try to shutdown the tick whenever possible, even when
the CPU is running tasks. Typically this requires running a single
task on the CPU. Chances for running tickless are maximized when
the task mostly runs in userspace and has few kernel activity.

You need to fill up the nohz_extended boot parameter with the
desired range of dynticks CPUs.

This is implemented at the expense of some overhead in user <-> kernel
transitions: syscalls, exceptions and interrupts. Even when it's
dynamically off.

Say N.

config HIGH_RES_TIMERS
bool "High Resolution Timer Support"
depends on !ARCH_USES_GETTIMEOFFSET && GENERIC_CLOCKEVENTS
Expand Down
62 changes: 62 additions & 0 deletions kernel/time/tick-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,68 @@ static void tick_sched_handle(struct tick_sched *ts, struct pt_regs *regs)
profile_tick(CPU_PROFILING);
}

#ifdef CONFIG_NO_HZ_EXTENDED
static cpumask_var_t nohz_extended_mask;
bool have_nohz_extended_mask;

int tick_nohz_extended_cpu(int cpu)
{
if (!have_nohz_extended_mask)
return 0;

return cpumask_test_cpu(cpu, nohz_extended_mask);
}

/* Parse the boot-time nohz CPU list from the kernel parameters. */
static int __init tick_nohz_extended_setup(char *str)
{
alloc_bootmem_cpumask_var(&nohz_extended_mask);
if (cpulist_parse(str, nohz_extended_mask) < 0)
pr_warning("NOHZ: Incorrect nohz_extended cpumask\n");
else
have_nohz_extended_mask = true;
return 1;
}
__setup("nohz_extended=", tick_nohz_extended_setup);

static int __init init_tick_nohz_extended(void)
{
cpumask_var_t online_nohz;
int cpu;

if (!have_nohz_extended_mask)
return 0;

if (!zalloc_cpumask_var(&online_nohz, GFP_KERNEL)) {
pr_warning("NO_HZ: Not enough memory to check extended nohz mask\n");
return -ENOMEM;
}

/*
* CPUs can probably not be concurrently offlined on initcall time.
* But we are paranoid, aren't we?
*/
get_online_cpus();

/* Ensure we keep a CPU outside the dynticks range for timekeeping */
cpumask_and(online_nohz, cpu_online_mask, nohz_extended_mask);
if (cpumask_equal(online_nohz, cpu_online_mask)) {
cpu = cpumask_any(cpu_online_mask);
pr_warning("NO_HZ: Must keep at least one online CPU "
"out of nohz_extended range\n");
pr_warning("NO_HZ: Clearing %d from nohz_extended range\n", cpu);
cpumask_clear_cpu(cpu, nohz_extended_mask);
}
put_online_cpus();
free_cpumask_var(online_nohz);

return 0;
}
core_initcall(init_tick_nohz_extended);
#else
#define have_nohz_extended_mask (0)
#endif

/*
* NOHZ - aka dynamic tick functionality
*/
Expand Down

0 comments on commit a831881

Please sign in to comment.