delayacct.h 3.21 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/* delayacct.h - per-task delay accounting
 *
 * Copyright (C) Shailabh Nagar, IBM Corp. 2006
 *
 * This program is free software;  you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY;  without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 * the GNU General Public License for more details.
 *
 */

#ifndef _LINUX_DELAYACCT_H
#define _LINUX_DELAYACCT_H

#include <linux/sched.h>
21
#include <linux/taskstats_kern.h>
22

23 24 25 26 27 28 29
/*
 * Per-task flags relevant to delay accounting
 * maintained privately to avoid exhausting similar flags in sched.h:PF_*
 * Used to set current->delays->flags
 */
#define DELAYACCT_PF_SWAPIN	0x00000001	/* I am doing a swapin */

30 31 32 33 34 35 36
#ifdef CONFIG_TASK_DELAY_ACCT

extern int delayacct_on;	/* Delay accounting turned on/off */
extern kmem_cache_t *delayacct_cache;
extern void delayacct_init(void);
extern void __delayacct_tsk_init(struct task_struct *);
extern void __delayacct_tsk_exit(struct task_struct *);
37 38
extern void __delayacct_blkio_start(void);
extern void __delayacct_blkio_end(void);
39
extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
40
extern __u64 __delayacct_blkio_ticks(struct task_struct *);
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

static inline void delayacct_set_flag(int flag)
{
	if (current->delays)
		current->delays->flags |= flag;
}

static inline void delayacct_clear_flag(int flag)
{
	if (current->delays)
		current->delays->flags &= ~flag;
}

static inline void delayacct_tsk_init(struct task_struct *tsk)
{
	/* reinitialize in case parent's non-null pointer was dup'ed*/
	tsk->delays = NULL;
58
	if (delayacct_on)
59 60 61
		__delayacct_tsk_init(tsk);
}

62 63 64 65
/* Free tsk->delays. Called from bad fork and __put_task_struct
 * where there's no risk of tsk->delays being accessed elsewhere
 */
static inline void delayacct_tsk_free(struct task_struct *tsk)
66 67
{
	if (tsk->delays)
68 69
		kmem_cache_free(delayacct_cache, tsk->delays);
	tsk->delays = NULL;
70 71
}

72 73 74 75 76 77 78 79 80 81 82 83
static inline void delayacct_blkio_start(void)
{
	if (current->delays)
		__delayacct_blkio_start();
}

static inline void delayacct_blkio_end(void)
{
	if (current->delays)
		__delayacct_blkio_end();
}

84 85 86
static inline int delayacct_add_tsk(struct taskstats *d,
					struct task_struct *tsk)
{
87
	if (!delayacct_on || !tsk->delays)
88 89 90 91
		return 0;
	return __delayacct_add_tsk(d, tsk);
}

92 93 94 95 96 97 98
static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
{
	if (tsk->delays)
		return __delayacct_blkio_ticks(tsk);
	return 0;
}

99 100 101 102 103 104 105 106 107
#else
static inline void delayacct_set_flag(int flag)
{}
static inline void delayacct_clear_flag(int flag)
{}
static inline void delayacct_init(void)
{}
static inline void delayacct_tsk_init(struct task_struct *tsk)
{}
108
static inline void delayacct_tsk_free(struct task_struct *tsk)
109
{}
110 111 112 113
static inline void delayacct_blkio_start(void)
{}
static inline void delayacct_blkio_end(void)
{}
114 115 116
static inline int delayacct_add_tsk(struct taskstats *d,
					struct task_struct *tsk)
{ return 0; }
117 118
static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
{ return 0; }
119 120 121
#endif /* CONFIG_TASK_DELAY_ACCT */

#endif