* if the task was reniced, its score doubles
  * superuser or direct hardware access tasks (CAP_SYS_ADMIN, CAP_SYS_RESOURCE
        or CAP_SYS_RAWIO) have their score divided by 4
- * if oom condition happened in one cpuset and checked task does not belong
+ * if oom condition happened in one cpuset and checked process does not belong
        to it, its score is divided by 8
  * the resulting score is multiplied by two to the power of oom_adj, i.e.
        points <<= oom_adj when it is positive and
 
 
        do_posix_clock_monotonic_gettime(&uptime);
        read_lock(&tasklist_lock);
-       points = badness(task, uptime.tv_sec);
+       points = badness(task->group_leader, uptime.tv_sec);
        read_unlock(&tasklist_lock);
        return sprintf(buffer, "%lu\n", points);
 }
 
 static DEFINE_SPINLOCK(zone_scan_lock);
 /* #define DEBUG */
 
+/*
+ * Is all threads of the target process nodes overlap ours?
+ */
+static int has_intersects_mems_allowed(struct task_struct *tsk)
+{
+       struct task_struct *t;
+
+       t = tsk;
+       do {
+               if (cpuset_mems_allowed_intersects(current, t))
+                       return 1;
+               t = next_thread(t);
+       } while (t != tsk);
+
+       return 0;
+}
+
 /**
  * badness - calculate a numeric value for how bad this task has been
  * @p: task struct of which task we should calculate
        struct mm_struct *mm;
        struct task_struct *child;
        int oom_adj = p->signal->oom_adj;
+       struct task_cputime task_time;
+       unsigned long utime;
+       unsigned long stime;
 
        if (oom_adj == OOM_DISABLE)
                return 0;
          * of seconds. There is no particular reason for this other than
          * that it turned out to work very well in practice.
         */
-       cpu_time = (cputime_to_jiffies(p->utime) + cputime_to_jiffies(p->stime))
-               >> (SHIFT_HZ + 3);
+       thread_group_cputime(p, &task_time);
+       utime = cputime_to_jiffies(task_time.utime);
+       stime = cputime_to_jiffies(task_time.stime);
+       cpu_time = (utime + stime) >> (SHIFT_HZ + 3);
+
 
        if (uptime >= p->start_time.tv_sec)
                run_time = (uptime - p->start_time.tv_sec) >> 10;
         * because p may have allocated or otherwise mapped memory on
         * this node before. However it will be less likely.
         */
-       if (!cpuset_mems_allowed_intersects(current, p))
+       if (!has_intersects_mems_allowed(p))
                points /= 8;
 
        /*
 static struct task_struct *select_bad_process(unsigned long *ppoints,
                                                struct mem_cgroup *mem)
 {
-       struct task_struct *g, *p;
+       struct task_struct *p;
        struct task_struct *chosen = NULL;
        struct timespec uptime;
        *ppoints = 0;
 
        do_posix_clock_monotonic_gettime(&uptime);
-       do_each_thread(g, p) {
+       for_each_process(p) {
                unsigned long points;
 
                /*
                        chosen = p;
                        *ppoints = points;
                }
-       } while_each_thread(g, p);
+       }
 
        return chosen;
 }