blob: f352f06fa063b2bd73543403a4e24aca39f4a9d1 [file] [log] [blame]
Shailabh Nagarca74e922006-07-14 00:24:36 -07001/* 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>
Shailabh Nagar6f449932006-07-14 00:24:41 -070021#include <linux/taskstats_kern.h>
Shailabh Nagarca74e922006-07-14 00:24:36 -070022
Shailabh Nagar0ff92242006-07-14 00:24:37 -070023/*
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 */
Balbir Singh846c7bb2007-10-18 23:39:44 -070029#define DELAYACCT_PF_BLKIO 0x00000002 /* I am waiting on IO */
Shailabh Nagar0ff92242006-07-14 00:24:37 -070030
Shailabh Nagarca74e922006-07-14 00:24:36 -070031#ifdef CONFIG_TASK_DELAY_ACCT
32
33extern int delayacct_on; /* Delay accounting turned on/off */
Christoph Lametere18b8902006-12-06 20:33:20 -080034extern struct kmem_cache *delayacct_cache;
Shailabh Nagarca74e922006-07-14 00:24:36 -070035extern void delayacct_init(void);
36extern void __delayacct_tsk_init(struct task_struct *);
37extern void __delayacct_tsk_exit(struct task_struct *);
Shailabh Nagar0ff92242006-07-14 00:24:37 -070038extern void __delayacct_blkio_start(void);
39extern void __delayacct_blkio_end(void);
Shailabh Nagar6f449932006-07-14 00:24:41 -070040extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
Shailabh Nagar25890452006-07-14 00:24:43 -070041extern __u64 __delayacct_blkio_ticks(struct task_struct *);
Keika Kobayashi873b4772008-07-25 01:48:52 -070042extern void __delayacct_freepages_start(void);
43extern void __delayacct_freepages_end(void);
Shailabh Nagarca74e922006-07-14 00:24:36 -070044
Balbir Singh846c7bb2007-10-18 23:39:44 -070045static 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
Shailabh Nagarca74e922006-07-14 00:24:36 -070053static 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;
Shailabh Nagar163ecdf2006-07-30 03:03:11 -070069 if (delayacct_on)
Shailabh Nagarca74e922006-07-14 00:24:36 -070070 __delayacct_tsk_init(tsk);
71}
72
Shailabh Nagar35df17c2006-08-31 21:27:38 -070073/* 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)
Shailabh Nagarca74e922006-07-14 00:24:36 -070077{
78 if (tsk->delays)
Shailabh Nagar35df17c2006-08-31 21:27:38 -070079 kmem_cache_free(delayacct_cache, tsk->delays);
80 tsk->delays = NULL;
Shailabh Nagarca74e922006-07-14 00:24:36 -070081}
82
Shailabh Nagar0ff92242006-07-14 00:24:37 -070083static inline void delayacct_blkio_start(void)
84{
Balbir Singh846c7bb2007-10-18 23:39:44 -070085 delayacct_set_flag(DELAYACCT_PF_BLKIO);
Shailabh Nagar0ff92242006-07-14 00:24:37 -070086 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();
Balbir Singh846c7bb2007-10-18 23:39:44 -070094 delayacct_clear_flag(DELAYACCT_PF_BLKIO);
Shailabh Nagar0ff92242006-07-14 00:24:37 -070095}
96
Shailabh Nagar6f449932006-07-14 00:24:41 -070097static inline int delayacct_add_tsk(struct taskstats *d,
98 struct task_struct *tsk)
99{
Shailabh Nagar163ecdf2006-07-30 03:03:11 -0700100 if (!delayacct_on || !tsk->delays)
Shailabh Nagar6f449932006-07-14 00:24:41 -0700101 return 0;
102 return __delayacct_add_tsk(d, tsk);
103}
104
Shailabh Nagar25890452006-07-14 00:24:43 -0700105static 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
Keika Kobayashi873b4772008-07-25 01:48:52 -0700112static 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
Shailabh Nagarca74e922006-07-14 00:24:36 -0700124#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{}
Shailabh Nagar35df17c2006-08-31 21:27:38 -0700133static inline void delayacct_tsk_free(struct task_struct *tsk)
Shailabh Nagarca74e922006-07-14 00:24:36 -0700134{}
Shailabh Nagar0ff92242006-07-14 00:24:37 -0700135static inline void delayacct_blkio_start(void)
136{}
137static inline void delayacct_blkio_end(void)
138{}
Shailabh Nagar6f449932006-07-14 00:24:41 -0700139static inline int delayacct_add_tsk(struct taskstats *d,
140 struct task_struct *tsk)
141{ return 0; }
Shailabh Nagar25890452006-07-14 00:24:43 -0700142static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
143{ return 0; }
Balbir Singh846c7bb2007-10-18 23:39:44 -0700144static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
145{ return 0; }
Keika Kobayashi873b4772008-07-25 01:48:52 -0700146static inline void delayacct_freepages_start(void)
147{}
148static inline void delayacct_freepages_end(void)
149{}
150
Shailabh Nagarca74e922006-07-14 00:24:36 -0700151#endif /* CONFIG_TASK_DELAY_ACCT */
152
153#endif