diff --git a/include/linux/sched.h b/include/linux/sched.h
index d04186d8cc685d9be0ddea01fc94a23b7a6828a7..ab84adf5bb9af8f3a36e8445880a37f0794abded 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -100,6 +100,7 @@ DECLARE_PER_CPU(unsigned long, process_counts);
 extern int nr_processes(void);
 extern unsigned long nr_running(void);
 extern unsigned long nr_uninterruptible(void);
+extern unsigned long nr_active(void);
 extern unsigned long nr_iowait(void);
 
 #include <linux/time.h>
diff --git a/kernel/sched.c b/kernel/sched.c
index a9ecac398bb9b979a4457ea0ade69259c9e7dc53..6e52e0adff80dfc04fa921dd88a0df7bce8a4a2a 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1658,6 +1658,21 @@ unsigned long nr_iowait(void)
 	return sum;
 }
 
+unsigned long nr_active(void)
+{
+	unsigned long i, running = 0, uninterruptible = 0;
+
+	for_each_online_cpu(i) {
+		running += cpu_rq(i)->nr_running;
+		uninterruptible += cpu_rq(i)->nr_uninterruptible;
+	}
+
+	if (unlikely((long)uninterruptible < 0))
+		uninterruptible = 0;
+
+	return running + uninterruptible;
+}
+
 #ifdef CONFIG_SMP
 
 /*
diff --git a/kernel/timer.c b/kernel/timer.c
index 9062a82ee8ec40d9a6ef985c625bd8daaf5778c5..6b812c04737b5b611c9d40257f8c3b28292955c4 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -825,7 +825,7 @@ void update_process_times(int user_tick)
  */
 static unsigned long count_active_tasks(void)
 {
-	return (nr_running() + nr_uninterruptible()) * FIXED_1;
+	return nr_active() * FIXED_1;
 }
 
 /*