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')
This commit is contained in:
Tomas Hruby 2010-09-15 14:11:01 +00:00
parent 0ac9b6d4cf
commit 454589debd
3 changed files with 34 additions and 7 deletions

View file

@ -48,6 +48,9 @@ extern void poweroff16_end();
PUBLIC void * k_stacks; PUBLIC void * k_stacks;
FORWARD _PROTOTYPE( void ser_debug, (int c)); 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) PUBLIC __dead void arch_monitor(void)
{ {
@ -471,6 +474,11 @@ PRIVATE void ser_debug(const int c)
case '3': case '3':
ser_dump_segs(); ser_dump_segs();
break; break;
#ifdef CONFIG_SMP
case '4':
ser_dump_proc_cpu();
break;
#endif
#if DEBUG_TRACE #if DEBUG_TRACE
#define TOGGLECASE(ch, flag) \ #define TOGGLECASE(ch, flag) \
case ch: { \ case ch: { \
@ -495,7 +503,6 @@ PRIVATE void ser_debug(const int c)
serial_debug_active = 0; serial_debug_active = 0;
} }
PUBLIC void ser_dump_proc() PUBLIC void ser_dump_proc()
{ {
struct proc *pp; 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 #if SPROFILE
PUBLIC int arch_init_profile_clock(const u32_t freq) PUBLIC int arch_init_profile_clock(const u32_t freq)

View file

@ -258,10 +258,12 @@ PUBLIC void print_proc(struct proc *pp)
struct proc *depproc = NULL; struct proc *depproc = NULL;
endpoint_t dep; 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 ", printf("%d: %s %d prio %d time %d/%d cycles 0x%x%08x cpu %2d "
proc_nr(pp), pp->p_name, pp->p_endpoint, "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_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), rtsflagstr(pp->p_rts_flags), miscflagstr(pp->p_misc_flags),
schedulerstr(pp->p_scheduler)); schedulerstr(pp->p_scheduler));

View file

@ -329,8 +329,9 @@ check_misc_flags:
if (!proc_is_runnable(p)) if (!proc_is_runnable(p))
goto not_runnable_pick_new; goto not_runnable_pick_new;
TRACE(VF_SCHEDULING, printf("starting %s / %d\n", TRACE(VF_SCHEDULING, printf("cpu %d starting %s / %d "
p->p_name, p->p_endpoint);); "pc 0x%08x\n",
cpuid, p->p_name, p->p_endpoint, p->p_reg.pc););
#if DEBUG_TRACE #if DEBUG_TRACE
p->p_schedules++; p->p_schedules++;
#endif #endif
@ -1448,7 +1449,7 @@ PRIVATE struct proc * pick_proc(void)
rdy_head = get_cpulocal_var(run_q_head); rdy_head = get_cpulocal_var(run_q_head);
for (q=0; q < NR_SCHED_QUEUES; q++) { for (q=0; q < NR_SCHED_QUEUES; q++) {
if(!(rp = rdy_head[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; continue;
} }
assert(proc_is_runnable(rp)); assert(proc_is_runnable(rp));