xref: /linux/include/linux/taskstats_kern.h (revision ad4ecbcba72855a2b5319b96e2a3a65ed1ca3bfd)
1c757249aSShailabh Nagar /* taskstats_kern.h - kernel header for per-task statistics interface
2c757249aSShailabh Nagar  *
3c757249aSShailabh Nagar  * Copyright (C) Shailabh Nagar, IBM Corp. 2006
4c757249aSShailabh Nagar  *           (C) Balbir Singh,   IBM Corp. 2006
5c757249aSShailabh Nagar  */
6c757249aSShailabh Nagar 
7c757249aSShailabh Nagar #ifndef _LINUX_TASKSTATS_KERN_H
8c757249aSShailabh Nagar #define _LINUX_TASKSTATS_KERN_H
9c757249aSShailabh Nagar 
10c757249aSShailabh Nagar #include <linux/taskstats.h>
11c757249aSShailabh Nagar #include <linux/sched.h>
12c757249aSShailabh Nagar 
13c757249aSShailabh Nagar enum {
14c757249aSShailabh Nagar 	TASKSTATS_MSG_UNICAST,		/* send data only to requester */
15c757249aSShailabh Nagar 	TASKSTATS_MSG_MULTICAST,	/* send data to a group */
16c757249aSShailabh Nagar };
17c757249aSShailabh Nagar 
18c757249aSShailabh Nagar #ifdef CONFIG_TASKSTATS
19c757249aSShailabh Nagar extern kmem_cache_t *taskstats_cache;
206f44993fSShailabh Nagar extern struct mutex taskstats_exit_mutex;
21c757249aSShailabh Nagar 
22*ad4ecbcbSShailabh Nagar static inline void taskstats_exit_alloc(struct taskstats **ptidstats)
23c757249aSShailabh Nagar {
24c757249aSShailabh Nagar 	*ptidstats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
25c757249aSShailabh Nagar }
26c757249aSShailabh Nagar 
27*ad4ecbcbSShailabh Nagar static inline void taskstats_exit_free(struct taskstats *tidstats)
28c757249aSShailabh Nagar {
29c757249aSShailabh Nagar 	if (tidstats)
30c757249aSShailabh Nagar 		kmem_cache_free(taskstats_cache, tidstats);
31c757249aSShailabh Nagar }
32c757249aSShailabh Nagar 
33*ad4ecbcbSShailabh Nagar static inline void taskstats_tgid_init(struct signal_struct *sig)
34*ad4ecbcbSShailabh Nagar {
35*ad4ecbcbSShailabh Nagar 	spin_lock_init(&sig->stats_lock);
36*ad4ecbcbSShailabh Nagar 	sig->stats = NULL;
37*ad4ecbcbSShailabh Nagar }
38c757249aSShailabh Nagar 
39*ad4ecbcbSShailabh Nagar static inline void taskstats_tgid_alloc(struct signal_struct *sig)
40*ad4ecbcbSShailabh Nagar {
41*ad4ecbcbSShailabh Nagar 	struct taskstats *stats;
42*ad4ecbcbSShailabh Nagar 	unsigned long flags;
43*ad4ecbcbSShailabh Nagar 
44*ad4ecbcbSShailabh Nagar 	stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL);
45*ad4ecbcbSShailabh Nagar 	if (!stats)
46*ad4ecbcbSShailabh Nagar 		return;
47*ad4ecbcbSShailabh Nagar 
48*ad4ecbcbSShailabh Nagar 	spin_lock_irqsave(&sig->stats_lock, flags);
49*ad4ecbcbSShailabh Nagar 	if (!sig->stats) {
50*ad4ecbcbSShailabh Nagar 		sig->stats = stats;
51*ad4ecbcbSShailabh Nagar 		stats = NULL;
52*ad4ecbcbSShailabh Nagar 	}
53*ad4ecbcbSShailabh Nagar 	spin_unlock_irqrestore(&sig->stats_lock, flags);
54*ad4ecbcbSShailabh Nagar 
55*ad4ecbcbSShailabh Nagar 	if (stats)
56*ad4ecbcbSShailabh Nagar 		kmem_cache_free(taskstats_cache, stats);
57*ad4ecbcbSShailabh Nagar }
58*ad4ecbcbSShailabh Nagar 
59*ad4ecbcbSShailabh Nagar static inline void taskstats_tgid_free(struct signal_struct *sig)
60*ad4ecbcbSShailabh Nagar {
61*ad4ecbcbSShailabh Nagar 	struct taskstats *stats = NULL;
62*ad4ecbcbSShailabh Nagar 	unsigned long flags;
63*ad4ecbcbSShailabh Nagar 
64*ad4ecbcbSShailabh Nagar 	spin_lock_irqsave(&sig->stats_lock, flags);
65*ad4ecbcbSShailabh Nagar 	if (sig->stats) {
66*ad4ecbcbSShailabh Nagar 		stats = sig->stats;
67*ad4ecbcbSShailabh Nagar 		sig->stats = NULL;
68*ad4ecbcbSShailabh Nagar 	}
69*ad4ecbcbSShailabh Nagar 	spin_unlock_irqrestore(&sig->stats_lock, flags);
70*ad4ecbcbSShailabh Nagar 	if (stats)
71*ad4ecbcbSShailabh Nagar 		kmem_cache_free(taskstats_cache, stats);
72*ad4ecbcbSShailabh Nagar }
73*ad4ecbcbSShailabh Nagar 
74*ad4ecbcbSShailabh Nagar extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int);
75*ad4ecbcbSShailabh Nagar extern void taskstats_init_early(void);
76*ad4ecbcbSShailabh Nagar extern void taskstats_tgid_alloc(struct signal_struct *);
77c757249aSShailabh Nagar #else
78*ad4ecbcbSShailabh Nagar static inline void taskstats_exit_alloc(struct taskstats **ptidstats)
79c757249aSShailabh Nagar {}
80*ad4ecbcbSShailabh Nagar static inline void taskstats_exit_free(struct taskstats *ptidstats)
81c757249aSShailabh Nagar {}
82c757249aSShailabh Nagar static inline void taskstats_exit_send(struct task_struct *tsk,
83c757249aSShailabh Nagar 				       struct taskstats *tidstats,
84*ad4ecbcbSShailabh Nagar 				       int group_dead)
85*ad4ecbcbSShailabh Nagar {}
86*ad4ecbcbSShailabh Nagar static inline void taskstats_tgid_init(struct signal_struct *sig)
87*ad4ecbcbSShailabh Nagar {}
88*ad4ecbcbSShailabh Nagar static inline void taskstats_tgid_alloc(struct signal_struct *sig)
89*ad4ecbcbSShailabh Nagar {}
90*ad4ecbcbSShailabh Nagar static inline void taskstats_tgid_free(struct signal_struct *sig)
91c757249aSShailabh Nagar {}
92c757249aSShailabh Nagar static inline void taskstats_init_early(void)
93c757249aSShailabh Nagar {}
94c757249aSShailabh Nagar #endif /* CONFIG_TASKSTATS */
95c757249aSShailabh Nagar 
96c757249aSShailabh Nagar #endif
97c757249aSShailabh Nagar 
98