Commit e4042ad4 authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

delayacct: Default disabled



Assuming this stuff isn't actually used much; disable it by default
and avoid allocating and tracking the task_delay_info structure.

taskstats is changed to still report the regular sched and sched_info
and only skip the missing task_delay_info fields instead of not
reporting anything.

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20210505111525.308018373@infradead.org
parent eee4d9fe
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -69,13 +69,13 @@ Compile the kernel with::
	CONFIG_TASK_DELAY_ACCT=y
	CONFIG_TASKSTATS=y

Delay accounting is enabled by default at boot up.
To disable, add::
Delay accounting is disabled by default at boot up.
To enable, add::

   nodelayacct
   delayacct

to the kernel boot options. The rest of the instructions
below assume this has not been done.
below assume this has been done.

After the system has booted up, use a utility
similar to  getdelays.c to access the delays
+1 −1
Original line number Diff line number Diff line
@@ -3244,7 +3244,7 @@

	noclflush	[BUGS=X86] Don't use the CLFLUSH instruction

	nodelayacct	[KNL] Disable per-task delay accounting
	delayacct	[KNL] Enable per-task delay accounting

	nodsp		[SH] Disable hardware DSP at boot time.

+4 −12
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ struct task_delay_info {
#include <linux/jump_label.h>

#ifdef CONFIG_TASK_DELAY_ACCT
DECLARE_STATIC_KEY_TRUE(delayacct_key);
DECLARE_STATIC_KEY_FALSE(delayacct_key);
extern int delayacct_on;	/* Delay accounting turned on/off */
extern struct kmem_cache *delayacct_cache;
extern void delayacct_init(void);
@@ -69,7 +69,7 @@ extern void __delayacct_tsk_init(struct task_struct *);
extern void __delayacct_tsk_exit(struct task_struct *);
extern void __delayacct_blkio_start(void);
extern void __delayacct_blkio_end(struct task_struct *);
extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
extern int delayacct_add_tsk(struct taskstats *, struct task_struct *);
extern __u64 __delayacct_blkio_ticks(struct task_struct *);
extern void __delayacct_freepages_start(void);
extern void __delayacct_freepages_end(void);
@@ -116,7 +116,7 @@ static inline void delayacct_tsk_free(struct task_struct *tsk)

static inline void delayacct_blkio_start(void)
{
	if (!static_branch_likely(&delayacct_key))
	if (!static_branch_unlikely(&delayacct_key))
		return;

	delayacct_set_flag(current, DELAYACCT_PF_BLKIO);
@@ -126,7 +126,7 @@ static inline void delayacct_blkio_start(void)

static inline void delayacct_blkio_end(struct task_struct *p)
{
	if (!static_branch_likely(&delayacct_key))
	if (!static_branch_unlikely(&delayacct_key))
		return;

	if (p->delays)
@@ -134,14 +134,6 @@ static inline void delayacct_blkio_end(struct task_struct *p)
	delayacct_clear_flag(p, DELAYACCT_PF_BLKIO);
}

static inline int delayacct_add_tsk(struct taskstats *d,
					struct task_struct *tsk)
{
	if (!delayacct_on || !tsk->delays)
		return 0;
	return __delayacct_add_tsk(d, tsk);
}

static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
{
	if (tsk->delays)
+11 −8
Original line number Diff line number Diff line
@@ -14,23 +14,23 @@
#include <linux/delayacct.h>
#include <linux/module.h>

DEFINE_STATIC_KEY_TRUE(delayacct_key);
int delayacct_on __read_mostly = 1;	/* Delay accounting turned on/off */
DEFINE_STATIC_KEY_FALSE(delayacct_key);
int delayacct_on __read_mostly;	/* Delay accounting turned on/off */
struct kmem_cache *delayacct_cache;

static int __init delayacct_setup_disable(char *str)
static int __init delayacct_setup_enable(char *str)
{
	delayacct_on = 0;
	delayacct_on = 1;
	return 1;
}
__setup("nodelayacct", delayacct_setup_disable);
__setup("delayacct", delayacct_setup_enable);

void delayacct_init(void)
{
	delayacct_cache = KMEM_CACHE(task_delay_info, SLAB_PANIC|SLAB_ACCOUNT);
	delayacct_tsk_init(&init_task);
	if (!delayacct_on)
		static_branch_disable(&delayacct_key);
	if (delayacct_on)
		static_branch_enable(&delayacct_key);
}

void __delayacct_tsk_init(struct task_struct *tsk)
@@ -83,7 +83,7 @@ void __delayacct_blkio_end(struct task_struct *p)
	delayacct_end(&delays->lock, &delays->blkio_start, total, count);
}

int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
int delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
{
	u64 utime, stime, stimescaled, utimescaled;
	unsigned long long t2, t3;
@@ -118,6 +118,9 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
	d->cpu_run_virtual_total =
		(tmp < (s64)d->cpu_run_virtual_total) ?	0 : tmp;

	if (!tsk->delays)
		return 0;

	/* zero XXX_total, non-zero XXX_count implies XXX stat overflowed */

	raw_spin_lock_irqsave(&tsk->delays->lock, flags);