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 7 #ifndef _LINUX_TASKSTATS_KERN_H 8 #define _LINUX_TASKSTATS_KERN_H 9 10 #include <linux/taskstats.h> 11 #include <linux/sched.h> 12 #include <net/genetlink.h> 13 14 #ifdef CONFIG_TASKSTATS 15 extern struct kmem_cache *taskstats_cache; 16 extern struct mutex taskstats_exit_mutex; 17 18 static inline void taskstats_tgid_init(struct signal_struct *sig) 19 { 20 sig->stats = NULL; 21 } 22 23 static inline void taskstats_tgid_alloc(struct task_struct *tsk) 24 { 25 struct signal_struct *sig = tsk->signal; 26 struct taskstats *stats; 27 28 if (sig->stats != NULL) 29 return; 30 31 /* No problem if kmem_cache_zalloc() fails */ 32 stats = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL); 33 34 spin_lock_irq(&tsk->sighand->siglock); 35 if (!sig->stats) { 36 sig->stats = stats; 37 stats = NULL; 38 } 39 spin_unlock_irq(&tsk->sighand->siglock); 40 41 if (stats) 42 kmem_cache_free(taskstats_cache, stats); 43 } 44 45 static inline void taskstats_tgid_free(struct signal_struct *sig) 46 { 47 if (sig->stats) 48 kmem_cache_free(taskstats_cache, sig->stats); 49 } 50 51 extern void taskstats_exit(struct task_struct *, int group_dead); 52 extern void taskstats_init_early(void); 53 #else 54 static inline void taskstats_exit(struct task_struct *tsk, int group_dead) 55 {} 56 static inline void taskstats_tgid_init(struct signal_struct *sig) 57 {} 58 static inline void taskstats_tgid_alloc(struct task_struct *tsk) 59 {} 60 static inline void taskstats_tgid_free(struct signal_struct *sig) 61 {} 62 static inline void taskstats_init_early(void) 63 {} 64 #endif /* CONFIG_TASKSTATS */ 65 66 #endif 67 68