Skip to content

Commit

Permalink
delayacct: Default disabled
Browse files Browse the repository at this point in the history
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: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20210505111525.308018373@infradead.org
  • Loading branch information
Peter Zijlstra committed May 12, 2021
1 parent eee4d9f commit e4042ad
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 25 deletions.
8 changes: 4 additions & 4 deletions Documentation/accounting/delay-accounting.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Documentation/admin-guide/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
16 changes: 4 additions & 12 deletions include/linux/delayacct.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,15 @@ 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);
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);
Expand Down Expand Up @@ -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);
Expand All @@ -126,22 +126,14 @@ 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)
__delayacct_blkio_end(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)
Expand Down
19 changes: 11 additions & 8 deletions kernel/delayacct.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit e4042ad

Please sign in to comment.