diff options
Diffstat (limited to 'include/linux/taskstats_kern.h')
| -rw-r--r-- | include/linux/taskstats_kern.h | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/include/linux/taskstats_kern.h b/include/linux/taskstats_kern.h index 16894b7edcc8..6562a2050a25 100644 --- a/include/linux/taskstats_kern.h +++ b/include/linux/taskstats_kern.h | |||
| @@ -23,25 +23,26 @@ static inline void taskstats_exit_free(struct taskstats *tidstats) | |||
| 23 | 23 | ||
| 24 | static inline void taskstats_tgid_init(struct signal_struct *sig) | 24 | static inline void taskstats_tgid_init(struct signal_struct *sig) |
| 25 | { | 25 | { |
| 26 | spin_lock_init(&sig->stats_lock); | ||
| 27 | sig->stats = NULL; | 26 | sig->stats = NULL; |
| 28 | } | 27 | } |
| 29 | 28 | ||
| 30 | static inline void taskstats_tgid_alloc(struct signal_struct *sig) | 29 | static inline void taskstats_tgid_alloc(struct task_struct *tsk) |
| 31 | { | 30 | { |
| 31 | struct signal_struct *sig = tsk->signal; | ||
| 32 | struct taskstats *stats; | 32 | struct taskstats *stats; |
| 33 | unsigned long flags; | ||
| 34 | 33 | ||
| 35 | stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL); | 34 | if (sig->stats != NULL) |
| 36 | if (!stats) | ||
| 37 | return; | 35 | return; |
| 38 | 36 | ||
| 39 | spin_lock_irqsave(&sig->stats_lock, flags); | 37 | /* No problem if kmem_cache_zalloc() fails */ |
| 38 | stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL); | ||
| 39 | |||
| 40 | spin_lock_irq(&tsk->sighand->siglock); | ||
| 40 | if (!sig->stats) { | 41 | if (!sig->stats) { |
| 41 | sig->stats = stats; | 42 | sig->stats = stats; |
| 42 | stats = NULL; | 43 | stats = NULL; |
| 43 | } | 44 | } |
| 44 | spin_unlock_irqrestore(&sig->stats_lock, flags); | 45 | spin_unlock_irq(&tsk->sighand->siglock); |
| 45 | 46 | ||
| 46 | if (stats) | 47 | if (stats) |
| 47 | kmem_cache_free(taskstats_cache, stats); | 48 | kmem_cache_free(taskstats_cache, stats); |
| @@ -49,23 +50,13 @@ static inline void taskstats_tgid_alloc(struct signal_struct *sig) | |||
| 49 | 50 | ||
| 50 | static inline void taskstats_tgid_free(struct signal_struct *sig) | 51 | static inline void taskstats_tgid_free(struct signal_struct *sig) |
| 51 | { | 52 | { |
| 52 | struct taskstats *stats = NULL; | 53 | if (sig->stats) |
| 53 | unsigned long flags; | 54 | kmem_cache_free(taskstats_cache, sig->stats); |
| 54 | |||
| 55 | spin_lock_irqsave(&sig->stats_lock, flags); | ||
| 56 | if (sig->stats) { | ||
| 57 | stats = sig->stats; | ||
| 58 | sig->stats = NULL; | ||
| 59 | } | ||
| 60 | spin_unlock_irqrestore(&sig->stats_lock, flags); | ||
| 61 | if (stats) | ||
| 62 | kmem_cache_free(taskstats_cache, stats); | ||
| 63 | } | 55 | } |
| 64 | 56 | ||
| 65 | extern void taskstats_exit_alloc(struct taskstats **, unsigned int *); | 57 | extern void taskstats_exit_alloc(struct taskstats **, unsigned int *); |
| 66 | extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int); | 58 | extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int); |
| 67 | extern void taskstats_init_early(void); | 59 | extern void taskstats_init_early(void); |
| 68 | extern void taskstats_tgid_alloc(struct signal_struct *); | ||
| 69 | #else | 60 | #else |
| 70 | static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu) | 61 | static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu) |
| 71 | {} | 62 | {} |
| @@ -77,7 +68,7 @@ static inline void taskstats_exit_send(struct task_struct *tsk, | |||
| 77 | {} | 68 | {} |
| 78 | static inline void taskstats_tgid_init(struct signal_struct *sig) | 69 | static inline void taskstats_tgid_init(struct signal_struct *sig) |
| 79 | {} | 70 | {} |
| 80 | static inline void taskstats_tgid_alloc(struct signal_struct *sig) | 71 | static inline void taskstats_tgid_alloc(struct task_struct *tsk) |
| 81 | {} | 72 | {} |
| 82 | static inline void taskstats_tgid_free(struct signal_struct *sig) | 73 | static inline void taskstats_tgid_free(struct signal_struct *sig) |
| 83 | {} | 74 | {} |
