delayacct.h 4.0 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/slab.h>
22

23 24 25 26 27 28
/*
 * 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 */
B
Balbir Singh 已提交
29
#define DELAYACCT_PF_BLKIO	0x00000002	/* I am waiting on IO */
30

31 32 33
#ifdef CONFIG_TASK_DELAY_ACCT

extern int delayacct_on;	/* Delay accounting turned on/off */
34
extern struct kmem_cache *delayacct_cache;
35 36 37
extern void delayacct_init(void);
extern void __delayacct_tsk_init(struct task_struct *);
extern void __delayacct_tsk_exit(struct task_struct *);
38 39
extern void __delayacct_blkio_start(void);
extern void __delayacct_blkio_end(void);
40
extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
41
extern __u64 __delayacct_blkio_ticks(struct task_struct *);
42 43
extern void __delayacct_freepages_start(void);
extern void __delayacct_freepages_end(void);
44

B
Balbir Singh 已提交
45 46 47 48 49 50 51 52
static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
{
	if (p->delays)
		return (p->delays->flags & DELAYACCT_PF_BLKIO);
	else
		return 0;
}

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
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;
69
	if (delayacct_on)
70 71 72
		__delayacct_tsk_init(tsk);
}

73 74 75 76
/* 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)
77 78
{
	if (tsk->delays)
79 80
		kmem_cache_free(delayacct_cache, tsk->delays);
	tsk->delays = NULL;
81 82
}

83 84
static inline void delayacct_blkio_start(void)
{
B
Balbir Singh 已提交
85
	delayacct_set_flag(DELAYACCT_PF_BLKIO);
86 87 88 89 90 91 92 93
	if (current->delays)
		__delayacct_blkio_start();
}

static inline void delayacct_blkio_end(void)
{
	if (current->delays)
		__delayacct_blkio_end();
B
Balbir Singh 已提交
94
	delayacct_clear_flag(DELAYACCT_PF_BLKIO);
95 96
}

97 98 99
static inline int delayacct_add_tsk(struct taskstats *d,
					struct task_struct *tsk)
{
100
	if (!delayacct_on || !tsk->delays)
101 102 103 104
		return 0;
	return __delayacct_add_tsk(d, tsk);
}

105 106 107 108 109 110 111
static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
{
	if (tsk->delays)
		return __delayacct_blkio_ticks(tsk);
	return 0;
}

112 113 114 115 116 117 118 119 120 121 122 123
static inline void delayacct_freepages_start(void)
{
	if (current->delays)
		__delayacct_freepages_start();
}

static inline void delayacct_freepages_end(void)
{
	if (current->delays)
		__delayacct_freepages_end();
}

124 125 126 127 128 129 130 131 132
#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)
{}
133
static inline void delayacct_tsk_free(struct task_struct *tsk)
134
{}
135 136 137 138
static inline void delayacct_blkio_start(void)
{}
static inline void delayacct_blkio_end(void)
{}
139 140 141
static inline int delayacct_add_tsk(struct taskstats *d,
					struct task_struct *tsk)
{ return 0; }
142 143
static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
{ return 0; }
B
Balbir Singh 已提交
144 145
static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
{ return 0; }
146 147 148 149 150
static inline void delayacct_freepages_start(void)
{}
static inline void delayacct_freepages_end(void)
{}

151 152 153
#endif /* CONFIG_TASK_DELAY_ACCT */

#endif