summaryrefslogtreecommitdiffstats
path: root/kernel/sched_stats.h
diff options
context:
space:
mode:
authorFrank Mayhar <fmayhar@google.com>2008-09-12 09:54:39 -0700
committerIngo Molnar <mingo@elte.hu>2008-09-27 20:04:45 +0200
commit7086efe1c1536f6bc160e7d60a9bfd645b91f279 (patch)
treea5facb5a01052452547ab9a9a47a0260537127fb /kernel/sched_stats.h
parent31d9284569e38fb97117497af3e8047a6a3c86f0 (diff)
downloadlinux-7086efe1c1536f6bc160e7d60a9bfd645b91f279.tar.gz
linux-7086efe1c1536f6bc160e7d60a9bfd645b91f279.tar.bz2
linux-7086efe1c1536f6bc160e7d60a9bfd645b91f279.zip
timers: fix itimer/many thread hang, v3
- fix UP lockup - another set of UP/SMP cleanups and simplifications Signed-off-by: Frank Mayhar <fmayhar@google.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched_stats.h')
-rw-r--r--kernel/sched_stats.h126
1 files changed, 38 insertions, 88 deletions
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h
index d6903bd0c7a8..b8c156979cf2 100644
--- a/kernel/sched_stats.h
+++ b/kernel/sched_stats.h
@@ -276,133 +276,83 @@ sched_info_switch(struct task_struct *prev, struct task_struct *next)
* on CONFIG_SCHEDSTATS.
*/
-#ifdef CONFIG_SMP
-
/**
- * thread_group_cputime_account_user - Maintain utime for a thread group.
+ * account_group_user_time - Maintain utime for a thread group.
*
- * @tgtimes: Pointer to thread_group_cputime structure.
- * @cputime: Time value by which to increment the utime field of that
- * structure.
+ * @tsk: Pointer to task structure.
+ * @cputime: Time value by which to increment the utime field of the
+ * thread_group_cputime structure.
*
* If thread group time is being maintained, get the structure for the
* running CPU and update the utime field there.
*/
-static inline void thread_group_cputime_account_user(
- struct thread_group_cputime *tgtimes,
- cputime_t cputime)
+static inline void account_group_user_time(struct task_struct *tsk,
+ cputime_t cputime)
{
- if (tgtimes->totals) {
+ struct signal_struct *sig;
+
+ sig = tsk->signal;
+ if (unlikely(!sig))
+ return;
+ if (sig->cputime.totals) {
struct task_cputime *times;
- times = per_cpu_ptr(tgtimes->totals, get_cpu());
+ times = per_cpu_ptr(sig->cputime.totals, get_cpu());
times->utime = cputime_add(times->utime, cputime);
put_cpu_no_resched();
}
}
/**
- * thread_group_cputime_account_system - Maintain stime for a thread group.
+ * account_group_system_time - Maintain stime for a thread group.
*
- * @tgtimes: Pointer to thread_group_cputime structure.
- * @cputime: Time value by which to increment the stime field of that
- * structure.
+ * @tsk: Pointer to task structure.
+ * @cputime: Time value by which to increment the stime field of the
+ * thread_group_cputime structure.
*
* If thread group time is being maintained, get the structure for the
* running CPU and update the stime field there.
*/
-static inline void thread_group_cputime_account_system(
- struct thread_group_cputime *tgtimes,
- cputime_t cputime)
+static inline void account_group_system_time(struct task_struct *tsk,
+ cputime_t cputime)
{
- if (tgtimes->totals) {
+ struct signal_struct *sig;
+
+ sig = tsk->signal;
+ if (unlikely(!sig))
+ return;
+ if (sig->cputime.totals) {
struct task_cputime *times;
- times = per_cpu_ptr(tgtimes->totals, get_cpu());
+ times = per_cpu_ptr(sig->cputime.totals, get_cpu());
times->stime = cputime_add(times->stime, cputime);
put_cpu_no_resched();
}
}
/**
- * thread_group_cputime_account_exec_runtime - Maintain exec runtime for a
- * thread group.
+ * account_group_exec_runtime - Maintain exec runtime for a thread group.
*
- * @tgtimes: Pointer to thread_group_cputime structure.
+ * @tsk: Pointer to task structure.
* @ns: Time value by which to increment the sum_exec_runtime field
- * of that structure.
+ * of the thread_group_cputime structure.
*
* If thread group time is being maintained, get the structure for the
* running CPU and update the sum_exec_runtime field there.
*/
-static inline void thread_group_cputime_account_exec_runtime(
- struct thread_group_cputime *tgtimes,
- unsigned long long ns)
+static inline void account_group_exec_runtime(struct task_struct *tsk,
+ unsigned long long ns)
{
- if (tgtimes->totals) {
+ struct signal_struct *sig;
+
+ sig = tsk->signal;
+ if (unlikely(!sig))
+ return;
+ if (sig->cputime.totals) {
struct task_cputime *times;
- times = per_cpu_ptr(tgtimes->totals, get_cpu());
+ times = per_cpu_ptr(sig->cputime.totals, get_cpu());
times->sum_exec_runtime += ns;
put_cpu_no_resched();
}
}
-
-#else /* CONFIG_SMP */
-
-static inline void thread_group_cputime_account_user(
- struct thread_group_cputime *tgtimes,
- cputime_t cputime)
-{
- tgtimes->totals->utime = cputime_add(tgtimes->totals->utime, cputime);
-}
-
-static inline void thread_group_cputime_account_system(
- struct thread_group_cputime *tgtimes,
- cputime_t cputime)
-{
- tgtimes->totals->stime = cputime_add(tgtimes->totals->stime, cputime);
-}
-
-static inline void thread_group_cputime_account_exec_runtime(
- struct thread_group_cputime *tgtimes,
- unsigned long long ns)
-{
- tgtimes->totals->sum_exec_runtime += ns;
-}
-
-#endif /* CONFIG_SMP */
-
-/*
- * These are the generic time-accounting routines that use the above
- * functions. They are the functions actually called by the scheduler.
- */
-static inline void account_group_user_time(struct task_struct *tsk,
- cputime_t cputime)
-{
- struct signal_struct *sig;
-
- sig = tsk->signal;
- if (likely(sig))
- thread_group_cputime_account_user(&sig->cputime, cputime);
-}
-
-static inline void account_group_system_time(struct task_struct *tsk,
- cputime_t cputime)
-{
- struct signal_struct *sig;
-
- sig = tsk->signal;
- if (likely(sig))
- thread_group_cputime_account_system(&sig->cputime, cputime);
-}
-
-static inline void account_group_exec_runtime(struct task_struct *tsk,
- unsigned long long ns)
-{
- struct signal_struct *sig;
-
- sig = tsk->signal;
- if (likely(sig))
- thread_group_cputime_account_exec_runtime(&sig->cputime, ns);
-}