taskstats_kern.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. enum {
  11. TASKSTATS_MSG_UNICAST, /* send data only to requester */
  12. TASKSTATS_MSG_MULTICAST, /* send data to a group */
  13. };
  14. #ifdef CONFIG_TASKSTATS
  15. extern kmem_cache_t *taskstats_cache;
  16. extern struct mutex taskstats_exit_mutex;
  17. static inline void taskstats_exit_alloc(struct taskstats **ptidstats)
  18. {
  19. *ptidstats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
  20. }
  21. static inline void taskstats_exit_free(struct taskstats *tidstats)
  22. {
  23. if (tidstats)
  24. kmem_cache_free(taskstats_cache, tidstats);
  25. }
  26. static inline void taskstats_tgid_init(struct signal_struct *sig)
  27. {
  28. spin_lock_init(&sig->stats_lock);
  29. sig->stats = NULL;
  30. }
  31. static inline void taskstats_tgid_alloc(struct signal_struct *sig)
  32. {
  33. struct taskstats *stats;
  34. unsigned long flags;
  35. stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
  36. if (!stats)
  37. return;
  38. spin_lock_irqsave(&sig->stats_lock, flags);
  39. if (!sig->stats) {
  40. sig->stats = stats;
  41. stats = NULL;
  42. }
  43. spin_unlock_irqrestore(&sig->stats_lock, flags);
  44. if (stats)
  45. kmem_cache_free(taskstats_cache, stats);
  46. }
  47. static inline void taskstats_tgid_free(struct signal_struct *sig)
  48. {
  49. struct taskstats *stats = NULL;
  50. unsigned long flags;
  51. spin_lock_irqsave(&sig->stats_lock, flags);
  52. if (sig->stats) {
  53. stats = sig->stats;
  54. sig->stats = NULL;
  55. }
  56. spin_unlock_irqrestore(&sig->stats_lock, flags);
  57. if (stats)
  58. kmem_cache_free(taskstats_cache, stats);
  59. }
  60. extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int);
  61. extern void taskstats_init_early(void);
  62. extern void taskstats_tgid_alloc(struct signal_struct *);
  63. #else
  64. static inline void taskstats_exit_alloc(struct taskstats **ptidstats)
  65. {}
  66. static inline void taskstats_exit_free(struct taskstats *ptidstats)
  67. {}
  68. static inline void taskstats_exit_send(struct task_struct *tsk,
  69. struct taskstats *tidstats,
  70. int group_dead)
  71. {}
  72. static inline void taskstats_tgid_init(struct signal_struct *sig)
  73. {}
  74. static inline void taskstats_tgid_alloc(struct signal_struct *sig)
  75. {}
  76. static inline void taskstats_tgid_free(struct signal_struct *sig)
  77. {}
  78. static inline void taskstats_init_early(void)
  79. {}
  80. #endif /* CONFIG_TASKSTATS */
  81. #endif