taskstats_kern.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /* taskstats_kern.h - kernel header for per-task statistics interface
  2. *
  3. * Copyright (C) Shailabh Nagar, IBM Corp. 2006
  4. * (C) Balbir Singh, IBM Corp. 2006
  5. */
  6. #ifndef _LINUX_TASKSTATS_KERN_H
  7. #define _LINUX_TASKSTATS_KERN_H
  8. #include <linux/taskstats.h>
  9. #include <linux/sched.h>
  10. #include <net/genetlink.h>
  11. #ifdef CONFIG_TASKSTATS
  12. extern kmem_cache_t *taskstats_cache;
  13. extern struct mutex taskstats_exit_mutex;
  14. static inline void taskstats_exit_free(struct taskstats *tidstats)
  15. {
  16. if (tidstats)
  17. kmem_cache_free(taskstats_cache, tidstats);
  18. }
  19. static inline void taskstats_tgid_init(struct signal_struct *sig)
  20. {
  21. spin_lock_init(&sig->stats_lock);
  22. sig->stats = NULL;
  23. }
  24. static inline void taskstats_tgid_alloc(struct signal_struct *sig)
  25. {
  26. struct taskstats *stats;
  27. unsigned long flags;
  28. stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
  29. if (!stats)
  30. return;
  31. spin_lock_irqsave(&sig->stats_lock, flags);
  32. if (!sig->stats) {
  33. sig->stats = stats;
  34. stats = NULL;
  35. }
  36. spin_unlock_irqrestore(&sig->stats_lock, flags);
  37. if (stats)
  38. kmem_cache_free(taskstats_cache, stats);
  39. }
  40. static inline void taskstats_tgid_free(struct signal_struct *sig)
  41. {
  42. struct taskstats *stats = NULL;
  43. unsigned long flags;
  44. spin_lock_irqsave(&sig->stats_lock, flags);
  45. if (sig->stats) {
  46. stats = sig->stats;
  47. sig->stats = NULL;
  48. }
  49. spin_unlock_irqrestore(&sig->stats_lock, flags);
  50. if (stats)
  51. kmem_cache_free(taskstats_cache, stats);
  52. }
  53. extern void taskstats_exit_alloc(struct taskstats **, unsigned int *);
  54. extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int);
  55. extern void taskstats_init_early(void);
  56. extern void taskstats_tgid_alloc(struct signal_struct *);
  57. #else
  58. static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu)
  59. {}
  60. static inline void taskstats_exit_free(struct taskstats *ptidstats)
  61. {}
  62. static inline void taskstats_exit_send(struct task_struct *tsk,
  63. struct taskstats *tidstats,
  64. int group_dead, unsigned int cpu)
  65. {}
  66. static inline void taskstats_tgid_init(struct signal_struct *sig)
  67. {}
  68. static inline void taskstats_tgid_alloc(struct signal_struct *sig)
  69. {}
  70. static inline void taskstats_tgid_free(struct signal_struct *sig)
  71. {}
  72. static inline void taskstats_init_early(void)
  73. {}
  74. #endif /* CONFIG_TASKSTATS */
  75. #endif