lkml.org 
[lkml]   [2008]   [Feb]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: Strange hang on ia64 with CONFIG_PRINTK_TIME=y
    > Perhaps what is happening is that cpu0 comes online ... safely skips
    > over the early printk calls. Calls cpu_init() which sets up the resources
    > *it* needs (ar.k3 points to per-cpu space), and then executes
    > sched_init() which marks it safe for all printk's. Then cpu1 comes
    > up and does a printk before it gets to cpu_init().

    I just tried Ingo's patch[1] on a 2.6.25-rc2 kernel with printk timestamps
    turned on ... and it booted just fine on my tiger4. The default path
    for non-boot cpus is from head.S to start_secondary(), and that
    calls cpu_init() pretty quickly. There shouldn't normally[2] be any
    printk() calls on the non-boot cpu before it is safe to do so.

    -Tony

    [1] Attached
    [2] If you set #define SMP_DEBUG in arch/ia64/kernel/smpboot.c
    that enables at least one printk() that will cause problems if you have
    also configured timestamps.
    kernel/sched.c | 14 ++++++++++----
    1 file changed, 10 insertions(+), 4 deletions(-)

    Index: linux-x86.q/kernel/sched.c
    ===================================================================
    --- linux-x86.q.orig/kernel/sched.c
    +++ linux-x86.q/kernel/sched.c
    @@ -666,6 +666,8 @@ const_debug unsigned int sysctl_sched_rt
    */
    const_debug unsigned int sysctl_sched_rt_ratio = 62259;

    +static __read_mostly int scheduler_running;
    +
    /*
    * For kernel-internal use: high-speed (but slightly incorrect) per-cpu
    * clock constructed from sched_clock():
    @@ -676,14 +678,16 @@ unsigned long long cpu_clock(int cpu)
    unsigned long flags;
    struct rq *rq;

    - local_irq_save(flags);
    - rq = cpu_rq(cpu);
    /*
    * Only call sched_clock() if the scheduler has already been
    * initialized (some code might call cpu_clock() very early):
    */
    - if (rq->idle)
    - update_rq_clock(rq);
    + if (unlikely(!scheduler_running))
    + return 0;
    +
    + local_irq_save(flags);
    + rq = cpu_rq(cpu);
    + update_rq_clock(rq);
    now = rq->clock;
    local_irq_restore(flags);

    @@ -7255,6 +7259,8 @@ void __init sched_init(void)
    * During early bootup we pretend to be a normal task:
    */
    current->sched_class = &fair_sched_class;
    +
    + scheduler_running = 1;
    }

    #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
    --
    \
     
     \ /
      Last update: 2008-02-19 23:43    [W:0.022 / U:29.880 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site