]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/sched_stats.h
timers: fix itimer/many thread hang, v3
[linux-2.6-omap-h63xx.git] / kernel / sched_stats.h
index d6903bd0c7a8f258ef411e3aae79a44f46a148e8..b8c156979cf2ad600b0f9b59f9a935cec86aab85 100644 (file)
@@ -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);
-}