From 454589debdbabef0b0795b3eeda2180e6a972b79 Mon Sep 17 00:00:00 2001 From: Tomas Hruby Date: Wed, 15 Sep 2010 14:11:01 +0000 Subject: [PATCH] SMP - Print cpu of the process - adds '4' to print processes assigned to each cpu without printing the process it is blocked on (a lightweight '1') --- kernel/arch/i386/arch_system.c | 26 +++++++++++++++++++++++++- kernel/debug.c | 8 +++++--- kernel/proc.c | 7 ++++--- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/kernel/arch/i386/arch_system.c b/kernel/arch/i386/arch_system.c index 5cc381adc..971a189c8 100644 --- a/kernel/arch/i386/arch_system.c +++ b/kernel/arch/i386/arch_system.c @@ -48,6 +48,9 @@ extern void poweroff16_end(); PUBLIC void * k_stacks; FORWARD _PROTOTYPE( void ser_debug, (int c)); +#ifdef CONFIG_SMP +FORWARD _PROTOTYPE( void ser_dump_proc_cpu, (void)); +#endif PUBLIC __dead void arch_monitor(void) { @@ -471,6 +474,11 @@ PRIVATE void ser_debug(const int c) case '3': ser_dump_segs(); break; +#ifdef CONFIG_SMP + case '4': + ser_dump_proc_cpu(); + break; +#endif #if DEBUG_TRACE #define TOGGLECASE(ch, flag) \ case ch: { \ @@ -495,7 +503,6 @@ PRIVATE void ser_debug(const int c) serial_debug_active = 0; } - PUBLIC void ser_dump_proc() { struct proc *pp; @@ -508,6 +515,23 @@ PUBLIC void ser_dump_proc() } } +#ifdef CONFIG_SMP +PRIVATE void ser_dump_proc_cpu(void) +{ + struct proc *pp; + unsigned cpu; + + for (cpu = 0; cpu < ncpus; cpu++) { + printf("CPU %d processes : \n", cpu); + for (pp= BEG_USER_ADDR; pp < END_PROC_ADDR; pp++) { + if (isemptyp(pp) || pp->p_cpu != cpu) + continue; + print_proc(pp); + } + } +} +#endif + #if SPROFILE PUBLIC int arch_init_profile_clock(const u32_t freq) diff --git a/kernel/debug.c b/kernel/debug.c index e476c5439..9261d720a 100644 --- a/kernel/debug.c +++ b/kernel/debug.c @@ -258,10 +258,12 @@ PUBLIC void print_proc(struct proc *pp) struct proc *depproc = NULL; endpoint_t dep; - printf("%d: %s %d prio %d time %d/%d cycles 0x%x%08x cr3 0x%lx rts %s misc %s sched %s ", - proc_nr(pp), pp->p_name, pp->p_endpoint, + printf("%d: %s %d prio %d time %d/%d cycles 0x%x%08x cpu %2d " + "cr3 0x%lx rts %s misc %s sched %s ", + proc_nr(pp), pp->p_name, pp->p_endpoint, pp->p_priority, pp->p_user_time, - pp->p_sys_time, pp->p_cycles.hi, pp->p_cycles.lo, pp->p_seg.p_cr3, + pp->p_sys_time, pp->p_cycles.hi, pp->p_cycles.lo, pp->p_cpu, + pp->p_seg.p_cr3, rtsflagstr(pp->p_rts_flags), miscflagstr(pp->p_misc_flags), schedulerstr(pp->p_scheduler)); diff --git a/kernel/proc.c b/kernel/proc.c index 92415002d..be4ac1f67 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -329,8 +329,9 @@ check_misc_flags: if (!proc_is_runnable(p)) goto not_runnable_pick_new; - TRACE(VF_SCHEDULING, printf("starting %s / %d\n", - p->p_name, p->p_endpoint);); + TRACE(VF_SCHEDULING, printf("cpu %d starting %s / %d " + "pc 0x%08x\n", + cpuid, p->p_name, p->p_endpoint, p->p_reg.pc);); #if DEBUG_TRACE p->p_schedules++; #endif @@ -1448,7 +1449,7 @@ PRIVATE struct proc * pick_proc(void) rdy_head = get_cpulocal_var(run_q_head); for (q=0; q < NR_SCHED_QUEUES; q++) { if(!(rp = rdy_head[q])) { - TRACE(VF_PICKPROC, printf("queue %d empty\n", q);); + TRACE(VF_PICKPROC, printf("cpu %d queue %d empty\n", cpuid, q);); continue; } assert(proc_is_runnable(rp));