fs: use rlimit helpers
[safe/jmp/linux-2.6] / fs / proc / array.c
index 07f77a7..aa8637b 100644 (file)
@@ -134,13 +134,16 @@ static inline void task_name(struct seq_file *m, struct task_struct *p)
  * simple bit tests.
  */
 static const char *task_state_array[] = {
-       "R (running)",          /*  0 */
-       "S (sleeping)",         /*  1 */
-       "D (disk sleep)",       /*  2 */
-       "T (stopped)",          /*  4 */
-       "T (tracing stop)",     /*  8 */
-       "Z (zombie)",           /* 16 */
-       "X (dead)"              /* 32 */
+       "R (running)",          /*   0 */
+       "S (sleeping)",         /*   1 */
+       "D (disk sleep)",       /*   2 */
+       "T (stopped)",          /*   4 */
+       "t (tracing stop)",     /*   8 */
+       "Z (zombie)",           /*  16 */
+       "X (dead)",             /*  32 */
+       "x (dead)",             /*  64 */
+       "K (wakekill)",         /* 128 */
+       "W (waking)",           /* 256 */
 };
 
 static inline const char *get_task_state(struct task_struct *tsk)
@@ -148,6 +151,8 @@ static inline const char *get_task_state(struct task_struct *tsk)
        unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state;
        const char **p = &task_state_array[0];
 
+       BUILD_BUG_ON(1 + ilog2(TASK_STATE_MAX) != ARRAY_SIZE(task_state_array));
+
        while (state) {
                p++;
                state >>= 1;
@@ -265,8 +270,10 @@ static inline void task_sig(struct seq_file *m, struct task_struct *p)
                blocked = p->blocked;
                collect_sigign_sigcatch(p, &ignored, &caught);
                num_threads = atomic_read(&p->signal->count);
+               rcu_read_lock();  /* FIXME: is this correct? */
                qsize = atomic_read(&__task_cred(p)->user->sigpending);
-               qlim = p->signal->rlim[RLIMIT_SIGPENDING].rlim_cur;
+               rcu_read_unlock();
+               qlim = task_rlimit(p, RLIMIT_SIGPENDING);
                unlock_task_sighand(p, &flags);
        }
 
@@ -322,93 +329,15 @@ static inline void task_context_switch_counts(struct seq_file *m,
                        p->nivcsw);
 }
 
-#ifdef CONFIG_MMU
-
-struct stack_stats {
-       struct vm_area_struct *vma;
-       unsigned long   startpage;
-       unsigned long   usage;
-};
-
-static int stack_usage_pte_range(pmd_t *pmd, unsigned long addr,
-                               unsigned long end, struct mm_walk *walk)
-{
-       struct stack_stats *ss = walk->private;
-       struct vm_area_struct *vma = ss->vma;
-       pte_t *pte, ptent;
-       spinlock_t *ptl;
-       int ret = 0;
-
-       pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
-       for (; addr != end; pte++, addr += PAGE_SIZE) {
-               ptent = *pte;
-
-#ifdef CONFIG_STACK_GROWSUP
-               if (pte_present(ptent) || is_swap_pte(ptent))
-                       ss->usage = addr - ss->startpage + PAGE_SIZE;
-#else
-               if (pte_present(ptent) || is_swap_pte(ptent)) {
-                       ss->usage = ss->startpage - addr + PAGE_SIZE;
-                       pte++;
-                       ret = 1;
-                       break;
-               }
-#endif
-       }
-       pte_unmap_unlock(pte - 1, ptl);
-       cond_resched();
-       return ret;
-}
-
-static inline unsigned long get_stack_usage_in_bytes(struct vm_area_struct *vma,
-                               struct task_struct *task)
-{
-       struct stack_stats ss;
-       struct mm_walk stack_walk = {
-               .pmd_entry = stack_usage_pte_range,
-               .mm = vma->vm_mm,
-               .private = &ss,
-       };
-
-       if (!vma->vm_mm || is_vm_hugetlb_page(vma))
-               return 0;
-
-       ss.vma = vma;
-       ss.startpage = task->stack_start & PAGE_MASK;
-       ss.usage = 0;
-
-#ifdef CONFIG_STACK_GROWSUP
-       walk_page_range(KSTK_ESP(task) & PAGE_MASK, vma->vm_end,
-               &stack_walk);
-#else
-       walk_page_range(vma->vm_start, (KSTK_ESP(task) & PAGE_MASK) + PAGE_SIZE,
-               &stack_walk);
-#endif
-       return ss.usage;
-}
-
-static inline void task_show_stack_usage(struct seq_file *m,
-                                               struct task_struct *task)
-{
-       struct vm_area_struct   *vma;
-       struct mm_struct        *mm = get_task_mm(task);
-
-       if (mm) {
-               down_read(&mm->mmap_sem);
-               vma = find_vma(mm, task->stack_start);
-               if (vma)
-                       seq_printf(m, "Stack usage:\t%lu kB\n",
-                               get_stack_usage_in_bytes(vma, task) >> 10);
-
-               up_read(&mm->mmap_sem);
-               mmput(mm);
-       }
-}
-#else
-static void task_show_stack_usage(struct seq_file *m, struct task_struct *task)
+static void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
 {
+       seq_printf(m, "Cpus_allowed:\t");
+       seq_cpumask(m, &task->cpus_allowed);
+       seq_printf(m, "\n");
+       seq_printf(m, "Cpus_allowed_list:\t");
+       seq_cpumask_list(m, &task->cpus_allowed);
+       seq_printf(m, "\n");
 }
-#endif         /* CONFIG_MMU */
 
 int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
                        struct pid *pid, struct task_struct *task)
@@ -424,12 +353,12 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
        }
        task_sig(m, task);
        task_cap(m, task);
+       task_cpus_allowed(m, task);
        cpuset_task_status_allowed(m, task);
 #if defined(CONFIG_S390)
        task_show_regs(m, task);
 #endif
        task_context_switch_counts(m, task);
-       task_show_stack_usage(m, task);
        return 0;
 }
 
@@ -491,24 +420,21 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
                cutime = sig->cutime;
                cstime = sig->cstime;
                cgtime = sig->cgtime;
-               rsslim = sig->rlim[RLIMIT_RSS].rlim_cur;
+               rsslim = ACCESS_ONCE(sig->rlim[RLIMIT_RSS].rlim_cur);
 
                /* add up live thread stats at the group level */
                if (whole) {
-                       struct task_cputime cputime;
                        struct task_struct *t = task;
                        do {
                                min_flt += t->min_flt;
                                maj_flt += t->maj_flt;
-                               gtime = cputime_add(gtime, task_gtime(t));
+                               gtime = cputime_add(gtime, t->gtime);
                                t = next_thread(t);
                        } while (t != task);
 
                        min_flt += sig->min_flt;
                        maj_flt += sig->maj_flt;
-                       thread_group_cputime(task, &cputime);
-                       utime = cputime.utime;
-                       stime = cputime.stime;
+                       thread_group_times(task, &utime, &stime);
                        gtime = cputime_add(gtime, sig->gtime);
                }
 
@@ -524,9 +450,8 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
        if (!whole) {
                min_flt = task->min_flt;
                maj_flt = task->maj_flt;
-               utime = task_utime(task);
-               stime = task_stime(task);
-               gtime = task_gtime(task);
+               task_times(task, &utime, &stime);
+               gtime = task->gtime;
        }
 
        /* scale priority and nice values from timeslices to -20..20 */
@@ -571,7 +496,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
                rsslim,
                mm ? mm->start_code : 0,
                mm ? mm->end_code : 0,
-               (permitted) ? task->stack_start : 0,
+               (permitted && mm) ? task->stack_start : 0,
                esp,
                eip,
                /* The signal information here is obsolete.