Patchwork Fix Linux task preemption on Versatile board

login
register
mail settings
Submitter Daniel Jacobowitz
Date Sept. 13, 2009, 1:54 p.m.
Message ID <20090913135441.GA24216@caradoc.them.org>
Download mbox | patch
Permalink /patch/33550/
State Superseded
Headers show

Comments

Daniel Jacobowitz - Sept. 13, 2009, 1:54 p.m.
Recent versions of the Linux kernel will not preempt CPU-intensive
tasks unless the clock used by sched_clock() works.  On -M versatilepb
that's the 24MHz timer in the system controller.  It's a very simple
timer, so implement it.

Signed-off-by: Daniel Jacobowitz <dan@codesourcery.com>
---

 hw/arm_sysctl.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
Aurelien Jarno - Sept. 14, 2009, 9:18 a.m.
On Sun, Sep 13, 2009 at 09:54:41AM -0400, Daniel Jacobowitz wrote:
> Recent versions of the Linux kernel will not preempt CPU-intensive
> tasks unless the clock used by sched_clock() works.  On -M versatilepb
> that's the 24MHz timer in the system controller.  It's a very simple
> timer, so implement it.

Thanks for fixing this long standing issue that has been reported a few
times already on the mailing list. I have applied the patch.

Patch

diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
index 686c1cc..26300ef 100644
--- a/hw/arm_sysctl.c
+++ b/hw/arm_sysctl.c
@@ -7,6 +7,8 @@ 
  * This code is licenced under the GPL.
  */
 
+#include "hw.h"
+#include "qemu-timer.h"
 #include "sysbus.h"
 #include "primecell.h"
 #include "sysemu.h"
@@ -71,8 +73,7 @@  static uint32_t arm_sysctl_read(void *opaque, target_phys_addr_t offset)
     case 0x58: /* BOOTCS */
         return 0;
     case 0x5c: /* 24MHz */
-        /* ??? not implemented.  */
-        return 0;
+        return muldiv64(qemu_get_clock(vm_clock), 24000000, get_ticks_per_sec());
     case 0x60: /* MISC */
         return 0;
     case 0x84: /* PROCID0 */