| From acc955917ca0e374669aa52405e159cc6f7f2610 Mon Sep 17 00:00:00 2001 |
| From: Luis Claudio R. Goncalves <lclaudio@uudg.org> |
| Date: Fri, 3 Jul 2009 08:30:21 -0500 |
| Subject: [PATCH] sched: Fix spurious system load spikes in /proc/loadavgrt |
| |
| commit 6c24cddbab29f64c31256444d083328936e9be18 in tip. |
| |
| Hello, |
| |
| The values in /proc/loadavgrt are sometimes the real load and sometimes |
| garbage. As you can see in th tests below, it occurs from in 2.6.21.5-rt20 |
| to 2.6.23-rc2-rt2. The code for calc_load(), in kernel/timer.c has not |
| changed much in -rt patches. |
| |
| [lclaudio@lab sandbox]$ ls /proc/loadavg* |
| /proc/loadavg /proc/loadavgrt |
| [lclaudio@lab sandbox]$ uname -a |
| Linux lab.casa 2.6.21-34.el5rt #1 SMP PREEMPT RT Thu Jul 12 15:26:48 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux |
| [lclaudio@lab sandbox]$ cat /proc/loadavg* |
| 4.57 4.90 4.16 3/146 23499 |
| 0.44 0.98 1.78 0/146 23499 |
| ... |
| [lclaudio@lab sandbox]$ cat /proc/loadavg* |
| 4.65 4.80 4.75 5/144 20720 |
| 23896.04 -898421.23 383170.94 2/144 20720 |
| |
| [root@neverland ~]# uname -a |
| Linux neverland.casa 2.6.21.5-rt20 #2 SMP PREEMPT RT Fri Jul 1318:31:38 BRT 2007 i686 athlon i386 GNU/Linux |
| [root@neverland ~]# cat /proc/loadavg* |
| 0.16 0.16 0.15 1/184 11240 |
| 344.65 0.38 311.71 0/184 11240 |
| |
| [williams@torg ~]$ uname -a |
| Linux torg 2.6.23-rc2-rt2 #14 SMP PREEMPT RT Tue Aug 7 20:07:31 CDT 2007 x86_64 x86_64 x86_64 GNU/Linux |
| [williams@torg ~]$ cat /proc/loadavg* |
| 0.88 0.76 0.57 1/257 7267 |
| 122947.70 103790.53 -564712.87 0/257 7267 |
| |
| ----------> |
| |
| Fixes spurious system load spikes observed in /proc/loadavgrt, as described in: |
| |
| Bug 253103: /proc/loadavgrt issues weird results |
| https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=253103 |
| |
| Signed-off-by: Luis Claudio R. Goncalves <lclaudio@uudg.org> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| |
| diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c |
| index 1497e35..40ca364 100644 |
| --- a/kernel/sched_rt.c |
| +++ b/kernel/sched_rt.c |
| @@ -909,6 +909,13 @@ unsigned long rt_nr_uninterruptible(void) |
| for_each_online_cpu(i) |
| sum += cpu_rq(i)->rt.rt_nr_uninterruptible; |
| |
| + /* |
| + * Since we read the counters lockless, it might be slightly |
| + * inaccurate. Do not allow it to go below zero though: |
| + */ |
| + if (unlikely((long)sum < 0)) |
| + sum = 0; |
| + |
| return sum; |
| } |
| |
| -- |
| 1.7.1.1 |
| |