aboutsummaryrefslogtreecommitdiff
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
parent31d9284569e38fb97117497af3e8047a6a3c86f0 (diff)
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>
-rw-r--r--include/linux/sched.h1
-rw-r--r--kernel/sched.c1
-rw-r--r--kernel/sched_stats.h126
3 files changed, 38 insertions, 90 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index b982fb48c8f..23d9d546454 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2134,7 +2134,6 @@ static inline int thread_group_cputime_clone_thread(struct task_struct *curr)
return thread_group_cputime_alloc(curr);
}
-
static inline void thread_group_cputime_free(struct signal_struct *sig)
{
free_percpu(sig->cputime.totals);
diff --git a/kernel/sched.c b/kernel/sched.c
index 260c22cc530..29a3152c45d 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4046,7 +4046,6 @@ unsigned long long task_delta_exec(struct task_struct *p)
unsigned long flags;
u64 ns = 0;
- rq = task_rq_lock(p, &flags);
if (task_current(rq, p)) {
u64 delta_exec;
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h
index d6903bd0c7a..b8c156979cf 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);
-}