home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / delayacct.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.0 KB  |  154 lines

  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>
  21. #include <linux/taskstats_kern.h>
  22.  
  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 */
  29. #define DELAYACCT_PF_BLKIO    0x00000002    /* I am waiting on IO */
  30.  
  31. #ifdef CONFIG_TASK_DELAY_ACCT
  32.  
  33. extern int delayacct_on;    /* Delay accounting turned on/off */
  34. extern struct kmem_cache *delayacct_cache;
  35. extern void delayacct_init(void);
  36. extern void __delayacct_tsk_init(struct task_struct *);
  37. extern void __delayacct_tsk_exit(struct task_struct *);
  38. extern void __delayacct_blkio_start(void);
  39. 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. extern void __delayacct_freepages_start(void);
  43. extern void __delayacct_freepages_end(void);
  44.  
  45. static 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.  
  53. static inline void delayacct_set_flag(int flag)
  54. {
  55.     if (current->delays)
  56.         current->delays->flags |= flag;
  57. }
  58.  
  59. static inline void delayacct_clear_flag(int flag)
  60. {
  61.     if (current->delays)
  62.         current->delays->flags &= ~flag;
  63. }
  64.  
  65. static 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;
  69.     if (delayacct_on)
  70.         __delayacct_tsk_init(tsk);
  71. }
  72.  
  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.  */
  76. static inline void delayacct_tsk_free(struct task_struct *tsk)
  77. {
  78.     if (tsk->delays)
  79.         kmem_cache_free(delayacct_cache, tsk->delays);
  80.     tsk->delays = NULL;
  81. }
  82.  
  83. static inline void delayacct_blkio_start(void)
  84. {
  85.     delayacct_set_flag(DELAYACCT_PF_BLKIO);
  86.     if (current->delays)
  87.         __delayacct_blkio_start();
  88. }
  89.  
  90. static inline void delayacct_blkio_end(void)
  91. {
  92.     if (current->delays)
  93.         __delayacct_blkio_end();
  94.     delayacct_clear_flag(DELAYACCT_PF_BLKIO);
  95. }
  96.  
  97. static inline int delayacct_add_tsk(struct taskstats *d,
  98.                     struct task_struct *tsk)
  99. {
  100.     if (!delayacct_on || !tsk->delays)
  101.         return 0;
  102.     return __delayacct_add_tsk(d, tsk);
  103. }
  104.  
  105. static 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.  
  112. static inline void delayacct_freepages_start(void)
  113. {
  114.     if (current->delays)
  115.         __delayacct_freepages_start();
  116. }
  117.  
  118. static inline void delayacct_freepages_end(void)
  119. {
  120.     if (current->delays)
  121.         __delayacct_freepages_end();
  122. }
  123.  
  124. #else
  125. static inline void delayacct_set_flag(int flag)
  126. {}
  127. static inline void delayacct_clear_flag(int flag)
  128. {}
  129. static inline void delayacct_init(void)
  130. {}
  131. static inline void delayacct_tsk_init(struct task_struct *tsk)
  132. {}
  133. static inline void delayacct_tsk_free(struct task_struct *tsk)
  134. {}
  135. static inline void delayacct_blkio_start(void)
  136. {}
  137. static inline void delayacct_blkio_end(void)
  138. {}
  139. static inline int delayacct_add_tsk(struct taskstats *d,
  140.                     struct task_struct *tsk)
  141. { return 0; }
  142. static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk)
  143. { return 0; }
  144. static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
  145. { return 0; }
  146. static inline void delayacct_freepages_start(void)
  147. {}
  148. static inline void delayacct_freepages_end(void)
  149. {}
  150.  
  151. #endif /* CONFIG_TASK_DELAY_ACCT */
  152.  
  153. #endif
  154.