← Back to team overview

linaro-release team mailing list archive

[Bug 709245] Re: ARM SMP scheduler performance bug

 

comparing the boot logs of an smp and a nosmp kernel (see attached
file), what struck me was an error message about the smp_twd clock:

 CPU: Testing write buffer coherency: ok
-twd_timer_setup: no clock found                                           <<<<<
-Calibrating local timer... 492.00MHz.                                      <<<<<
 L310 cache controller enabled
 l2x0: 16 ways, CACHE_ID 0x410000c4, AUX_CTRL 0x5e470000, Cache size: 1048576 B

looking closer at the code, i found that:

smp_twd.c::twd_timer_setup():

...
    if (twd_clk == NULL) {
        twd_clk = clk_get_sys("smp_twd", NULL);
        if (IS_ERR_OR_NULL(twd_clk))
            pr_warn("%s: no clock found\n", __func__);
    }
...

and clk_get_sys() prototype is:

struct clk *clk_get_sys(const char *dev_id, const char *con_id)

while clocks are defined as:

clock44xx_data.c in struct omap_clk omap44xx_clks[]:
...
CLK(NULL,   "smp_twd",      &smp_twd,   CK_44XX)
...

#define CLK(dev, con, ck, cp)       \
    {               \
         .cpu = cp,     \
        .lk = {         \
            .dev_id = dev,  \
            .con_id = con,  \
            .clk = ck,  \
        },          \
    }

so the parameters in clk_get_sys() are inverted:

--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -175,7 +175,8 @@ static void __cpuinit twd_calibrate_rate(void)
  */
 void __cpuinit twd_timer_setup(struct clock_event_device *clk)
 {
        if (twd_clk == NULL) {
-               twd_clk = clk_get_sys("smp_twd", NULL);
+               twd_clk = clk_get_sys(NULL, "smp_twd");
                if (IS_ERR_OR_NULL(twd_clk))
                        pr_warn("%s: no clock found\n", __func__);

this will make the error go away, but unfortunately won't fix the i/o
problem.

hdparm -t /dev/sda1

smp:

/dev/sda1:
 Timing buffered disk reads:   6 MB in  4.73 seconds =   1.27 MB/sec

nosmp:

/dev/sda1:
 Timing buffered disk reads:  44 MB in  3.08 seconds =  14.27 MB/sec


** Attachment added: "dmesg comparison: smp vs nosmp"
   https://bugs.launchpad.net/ubuntu/+source/linux-ti-omap4/+bug/709245/+attachment/2286211/+files/3.0.0-1202-omap4.smpvsnosmp

-- 
You received this bug notification because you are a member of Linaro
Release Team, which is subscribed to the bug report.
https://bugs.launchpad.net/bugs/709245

Title:
  ARM SMP scheduler performance bug

Status in Linaro Ubuntu Evaluation Builds:
  Confirmed
Status in Linaro Linux:
  Confirmed
Status in “linux-ti-omap4” package in Ubuntu:
  Confirmed
Status in “linux-ti-omap4” source package in Maverick:
  Confirmed
Status in “linux-ti-omap4” source package in Natty:
  Confirmed
Status in “linux-ti-omap4” source package in Oneiric:
  Confirmed

Bug description:
  Original Bug name: "panda: USB disk IO slow"

  My Panda's USB seems to be significantly slower than a Beagle C4.

  hdparm shows buffered reads as ~12MB/s on the Panda, and about ~20-25MB/s on a Beagle C4 from the same
  external Lacie USB disk.

  Kernel is 2.6.37-1002-linaro-omap

  Disk shows as:

  [    5.170440] scsi 0:0:0:0: Direct-Access     LaCie    d2 quadra             PQ: 0 ANSI: 4
  [    5.172546] sd 0:0:0:0: Attached scsi generic sg0 type 0
  [    5.175415] sd 0:0:0:0: [sda] 976773168 512-byte logical blocks: (500 GB/465 GiB)

  The board is otherwise idle during the test.

  Doing perf_2.6.37-12 record -a dd if=/dev/sda of=/dev/null bs=4096
  count=100000

  shows :
      81.41%         swapper  [kernel.kallsyms]     [k] default_idle
       6.33%              dd  [kernel.kallsyms]     [k] __copy_to_user
       0.94%         swapper  [kernel.kallsyms]     [k] cpu_idle
       0.51%              dd  [kernel.kallsyms]     [k] __make_request
       0.51%  perf_2.6.37-12  [kernel.kallsyms]     [k] __copy_from_user

  which suggests it's not CPU constrained.

  Dave

To manage notifications about this bug go to:
https://bugs.launchpad.net/linaro-ubuntu/+bug/709245/+subscriptions