Bug 7078 - powerbook sluggish after update from 2.6.18-rc4 to rc5
Summary: powerbook sluggish after update from 2.6.18-rc4 to rc5
Status: CLOSED CODE_FIX
Alias: None
Product: Other
Classification: Unclassified
Component: Other (show other bugs)
Hardware: i386 Linux
: P2 blocking
Assignee: other_other
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-08-30 04:27 UTC by o587914
Modified: 2006-08-31 01:52 UTC (History)
2 users (show)

See Also:
Kernel Version: 2.6.18-rc5
Subsystem:
Regression: ---
Bisected commit-id:


Attachments
dmesg-2.6.18-rc4.txt (14.85 KB, text/plain)
2006-08-30 10:33 UTC, o587914
Details
dmesg-2.6.18-rc5.txt (13.09 KB, text/plain)
2006-08-30 10:34 UTC, o587914
Details

Description o587914 2006-08-30 04:27:52 UTC
Most recent kernel where this bug did not occur: 2.6.18-rc4
Distribution: Gentoo Linux
Hardware Environment: PowerBook6,2
Software Environment: 
Problem Description: after I have updated from 2.6.18-rc4 to rc5 the machine 
behaves very 'sluggish'. Programms take ages to start or don't even start. For 
example if I start an KDE application the "sand glass" in the task entry does 
nothing. normaly it twists, but with rc5 it does nothing and the application 
does not start.
well.. difficult to describe I guess. I wish I could get into a console to see 
if something eats up my cpu, but konsole does not start within 2-3 minutes... 
even CTRL+ALT+F1 does nothing.

Steps to reproduce: update from rc4 to rc5 and use your powerbook.. ;-)
Comment 1 Diego Calleja 2006-08-30 09:05:01 UTC
could you attach a working and a non-working dmesg?
Comment 2 o587914 2006-08-30 10:33:33 UTC
Created attachment 8906 [details]
dmesg-2.6.18-rc4.txt
Comment 3 o587914 2006-08-30 10:34:01 UTC
Created attachment 8907 [details]
dmesg-2.6.18-rc5.txt
Comment 4 o587914 2006-08-30 10:37:01 UTC
I think dmesg doesn't show any significant differences. the reiserfs entries 
might be triggered by the hard shutdown (holding powerbutton for a few seconds) 
from -rc5, because I wasn't able to shut down the system correctly.
Comment 5 Benjamin Herrenschmidt 2006-08-30 14:53:30 UTC
Does this patch from paulus fixes it ? (It shall be in 2.6.18 final)
---

diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 18e59e4..a124499 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -125,15 +125,8 @@ static long timezone_offset;
 unsigned long ppc_proc_freq;
 unsigned long ppc_tb_freq;
 
-u64 tb_last_jiffy __cacheline_aligned_in_smp;
-unsigned long tb_last_stamp;
-
-/*
- * Note that on ppc32 this only stores the bottom 32 bits of
- * the timebase value, but that's enough to tell when a jiffy
- * has passed.
- */
-DEFINE_PER_CPU(unsigned long, last_jiffy);
+static u64 tb_last_jiffy __cacheline_aligned_in_smp;
+static DEFINE_PER_CPU(u64, last_jiffy);
 
 #ifdef CONFIG_VIRT_CPU_ACCOUNTING
 /*
@@ -458,7 +451,7 @@ void do_gettimeofday(struct timeval *tv)
                do {
                        seq = read_seqbegin_irqsave(&xtime_lock, flags);
                        sec = xtime.tv_sec;
-                       nsec = xtime.tv_nsec + tb_ticks_since(tb_last_stamp);
+                       nsec = xtime.tv_nsec + tb_ticks_since(tb_last_jiffy);
                } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
                usec = nsec / 1000;
                while (usec >= 1000000) {
@@ -700,7 +693,6 @@ #endif
                tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy;
                if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) {
                        tb_last_jiffy = tb_next_jiffy;
-                       tb_last_stamp = per_cpu(last_jiffy, cpu);
                        do_timer(regs);
                        timer_recalc_offset(tb_last_jiffy);
                        timer_check_rtc();
@@ -749,7 +741,7 @@ void __init smp_space_timers(unsigned in
        int i;
        unsigned long half = tb_ticks_per_jiffy / 2;
        unsigned long offset = tb_ticks_per_jiffy / max_cpus;
-       unsigned long previous_tb = per_cpu(last_jiffy, boot_cpuid);
+       u64 previous_tb = per_cpu(last_jiffy, boot_cpuid);
 
        /* make sure tb > per_cpu(last_jiffy, cpu) for all cpus always */
        previous_tb -= tb_ticks_per_jiffy;
@@ -830,7 +822,7 @@ #endif
         * and therefore the (jiffies - wall_jiffies) computation
         * has been removed.
         */
-       tb_delta = tb_ticks_since(tb_last_stamp);
+       tb_delta = tb_ticks_since(tb_last_jiffy);
        tb_delta = mulhdu(tb_delta, do_gtod.varp->tb_to_xs); /* in xsec */
        new_nsec -= SCALE_XSEC(tb_delta, 1000000000);
 
@@ -950,8 +942,7 @@ void __init time_init(void)
        if (__USE_RTC()) {
                /* 601 processor: dec counts down by 128 every 128ns */
                ppc_tb_freq = 1000000000;
-               tb_last_stamp = get_rtcl();
-               tb_last_jiffy = tb_last_stamp;
+               tb_last_jiffy = get_rtcl();
        } else {
                /* Normal PowerPC with timebase register */
                ppc_md.calibrate_decr();
@@ -959,7 +950,7 @@ void __init time_init(void)
                       ppc_tb_freq / 1000000, ppc_tb_freq % 1000000);
                printk(KERN_DEBUG "time_init: processor frequency   = %lu.%.6lu
MHz\n",
                       ppc_proc_freq / 1000000, ppc_proc_freq % 1000000);
-               tb_last_stamp = tb_last_jiffy = get_tb();
+               tb_last_jiffy = get_tb();
        }
 
        tb_ticks_per_jiffy = ppc_tb_freq / HZ;
@@ -1036,7 +1027,7 @@ void __init time_init(void)
        do_gtod.varp = &do_gtod.vars[0];
        do_gtod.var_idx = 0;
        do_gtod.varp->tb_orig_stamp = tb_last_jiffy;
-       __get_cpu_var(last_jiffy) = tb_last_stamp;
+       __get_cpu_var(last_jiffy) = tb_last_jiffy;
        do_gtod.varp->stamp_xsec = (u64) xtime.tv_sec * XSEC_PER_SEC;
        do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
        do_gtod.varp->tb_to_xs = tb_to_xs;
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h
index dcde441..5785ac4 100644
--- a/include/asm-powerpc/time.h
+++ b/include/asm-powerpc/time.h
@@ -30,10 +30,6 @@ extern unsigned long tb_ticks_per_usec;
 extern unsigned long tb_ticks_per_sec;
 extern u64 tb_to_xs;
 extern unsigned      tb_to_us;
-extern unsigned long tb_last_stamp;
-extern u64 tb_last_jiffy;
-
-DECLARE_PER_CPU(unsigned long, last_jiffy);
 
 struct rtc_time;
 extern void to_tm(int tim, struct rtc_time * tm);
Comment 6 o587914 2006-08-31 01:52:15 UTC
2.6.18-rc5-git3 works again. that patch seems to have fixed the issues. Thanks 
a lot!

Note You need to log in before you can comment on or make changes to this bug.