]> bbs.cooldavid.org Git - net-next-2.6.git/blame - include/linux/delayacct.h
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[net-next-2.6.git] / include / linux / delayacct.h
CommitLineData
ca74e92b
SN
1/* delayacct.h - per-task delay accounting
2 *
3 * Copyright (C) Shailabh Nagar, IBM Corp. 2006
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 */
16
17#ifndef _LINUX_DELAYACCT_H
18#define _LINUX_DELAYACCT_H
19
20#include <linux/sched.h>
5a0e3ad6 21#include <linux/slab.h>
ca74e92b 22
0ff92245
SN
23/*
24 * Per-task flags relevant to delay accounting
25 * maintained privately to avoid exhausting similar flags in sched.h:PF_*
26 * Used to set current->delays->flags
27 */
28#define DELAYACCT_PF_SWAPIN 0x00000001 /* I am doing a swapin */
846c7bb0 29#define DELAYACCT_PF_BLKIO 0x00000002 /* I am waiting on IO */
0ff92245 30
ca74e92b
SN
31#ifdef CONFIG_TASK_DELAY_ACCT
32
33extern int delayacct_on; /* Delay accounting turned on/off */
e18b890b 34extern struct kmem_cache *delayacct_cache;
ca74e92b
SN
35extern void delayacct_init(void);
36extern void __delayacct_tsk_init(struct task_struct *);
37extern void __delayacct_tsk_exit(struct task_struct *);
0ff92245
SN
38extern void __delayacct_blkio_start(void);
39extern void __delayacct_blkio_end(void);
6f44993f 40extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
25890454 41extern __u64 __delayacct_blkio_ticks(struct task_struct *);
873b4771
KK
42extern void __delayacct_freepages_start(void);
43extern void __delayacct_freepages_end(void);
ca74e92b 44
846c7bb0
BS
45static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
46{
47 if (p->delays)
48 return (p->delays->flags & DELAYACCT_PF_BLKIO);
49 else
50 return 0;
51}
52
ca74e92b
SN
53static inline void delayacct_set_flag(int flag)
54{
55 if (current->delays)
56 current->delays->flags |= flag;
57}
58
59static inline void delayacct_clear_flag(int flag)
60{
61 if (current->delays)
62 current->delays->flags &= ~flag;
63}
64
65static inline void delayacct_tsk_init(struct task_struct *tsk)
66{
67 /* reinitialize in case parent's non-null pointer was dup'ed*/
68 tsk->delays = NULL;
163ecdff 69 if (delayacct_on)
ca74e92b
SN
70 __delayacct_tsk_init(tsk);
71}
72
35df17c5
SN
73/* Free tsk->delays. Called from bad fork and __put_task_struct
74 * where there's no risk of tsk->delays being accessed elsewhere
75 */
76static inline void delayacct_tsk_free(struct task_struct *tsk)
ca74e92b
SN
77{
78 if (tsk->delays)
35df17c5
SN
79 kmem_cache_free(delayacct_cache, tsk->delays);
80 tsk->delays = NULL;
ca74e92b
SN
81}
82
0ff92245
SN
83static inline void delayacct_blkio_start(void)
84{
846c7bb0 85 delayacct_set_flag(DELAYACCT_PF_BLKIO);
0ff92245
SN
86 if (current->delays)
87 __delayacct_blkio_start();
88}
89
90static inline void delayacct_blkio_end(void)
91{
92 if (current->delays)
93 __delayacct_blkio_end();
846c7bb0 94 delayacct_clear_flag(DELAYACCT_PF_BLKIO);
0ff92245
SN
95}
96
6f44993f
SN
97static inline int delayacct_add_tsk(struct taskstats *d,
98 struct task_struct *tsk)
99{
163ecdff 100 if (!delayacct_on || !tsk->delays)
6f44993f
SN
101 return 0;
102 return __delayacct_add_tsk(d, tsk);
103}
104
25890454
SN
105static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
106{
107 if (tsk->delays)
108 return __delayacct_blkio_ticks(tsk);
109 return 0;
110}
111
873b4771
KK
112static inline void delayacct_freepages_start(void)
113{
114 if (current->delays)
115 __delayacct_freepages_start();
116}
117
118static inline void delayacct_freepages_end(void)
119{
120 if (current->delays)
121 __delayacct_freepages_end();
122}
123
ca74e92b
SN
124#else
125static inline void delayacct_set_flag(int flag)
126{}
127static inline void delayacct_clear_flag(int flag)
128{}
129static inline void delayacct_init(void)
130{}
131static inline void delayacct_tsk_init(struct task_struct *tsk)
132{}
35df17c5 133static inline void delayacct_tsk_free(struct task_struct *tsk)
ca74e92b 134{}
0ff92245
SN
135static inline void delayacct_blkio_start(void)
136{}
137static inline void delayacct_blkio_end(void)
138{}
6f44993f
SN
139static inline int delayacct_add_tsk(struct taskstats *d,
140 struct task_struct *tsk)
141{ return 0; }
25890454
SN
142static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
143{ return 0; }
846c7bb0
BS
144static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
145{ return 0; }
873b4771
KK
146static inline void delayacct_freepages_start(void)
147{}
148static inline void delayacct_freepages_end(void)
149{}
150
ca74e92b
SN
151#endif /* CONFIG_TASK_DELAY_ACCT */
152
153#endif