static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) { #ifdef CONFIG_SCHEDSTATS if (se->sleep_start) { u64 delta = rq_of(cfs_rq)->clock - se->sleep_start; if ((s64)delta < 0) delta = 0; if (unlikely(delta > se->sleep_max)) se->sleep_max = delta; se->sleep_start = 0; se->sum_sleep_runtime += delta; } if (se->block_start) { u64 delta = rq_of(cfs_rq)->clock - se->block_start; if ((s64)delta < 0) delta = 0; if (unlikely(delta > se->block_max)) se->block_max = delta; se->block_start = 0; se->sum_sleep_runtime += delta; /* * Blocking time is in units of nanosecs, so shift by 20 to * get a milliseconds-range estimation of the amount of * time that the task spent sleeping: */ if (unlikely(prof_on == SLEEP_PROFILING)) { struct task_struct *tsk = task_of(se); profile_hits(SLEEP_PROFILING, (void *)get_wchan(tsk), delta >> 20); } }
static int get_stat(int pid, char * buffer) { struct task_struct ** p = get_task(pid); unsigned long sigignore=0, sigcatch=0, bit=1, wchan; int i,tty_pgrp; char state; if (!p || !*p) return 0; if ((*p)->state < 0 || (*p)->state > 5) state = '.'; else state = "RSDZTD"[(*p)->state]; wchan = get_wchan(*p); for(i=0; i<32; ++i) { switch((int) (*p)->sigaction[i].sa_handler) { case 1: sigignore |= bit; break; case 0: break; default: sigcatch |= bit; } bit <<= 1; } tty_pgrp = (*p)->tty; if (tty_pgrp > 0 && tty_table[tty_pgrp]) tty_pgrp = tty_table[tty_pgrp]->pgrp; else tty_pgrp = -1; return sprintf(buffer,"%d (%s) %c %d %d %d %d %d %u %u \ %u %u %u %d %d %d %d %d %d %u %u %d %u %u %u %u %u %u %u %u %d \ %d %d %d %u\n", pid, (*p)->comm, state, (*p)->p_pptr->pid, (*p)->pgrp, (*p)->session, (*p)->tty, tty_pgrp, (*p)->flags, (*p)->min_flt, (*p)->cmin_flt, (*p)->maj_flt, (*p)->cmaj_flt, (*p)->utime, (*p)->stime, (*p)->cutime, (*p)->cstime, (*p)->counter, /* this is the kernel priority --- subtract 30 in your user-level program. */ (*p)->priority, /* this is the nice value --- subtract 15 in your user-level program. */ (*p)->timeout, (*p)->it_real_value, (*p)->start_time, VSIZE((*p),(*p)->kernel_stack_page), (*p)->rss, /* you might want to shift this left 3 */ (*p)->rlim[RLIMIT_RSS].rlim_cur, (*p)->start_code, (*p)->end_code, (*p)->start_stack, KSTK_ESP((*p)->kernel_stack_page), KSTK_EIP((*p)->kernel_stack_page), (*p)->signal, (*p)->blocked, sigignore, sigcatch, wchan); }
static int get_stat(int pid, char * buffer) { struct task_struct ** p = get_task(pid), *tsk; unsigned long sigignore=0, sigcatch=0, wchan; unsigned long vsize, eip, esp; long priority, nice; int i,tty_pgrp; char state; if (!p || (tsk = *p) == NULL) return 0; if (tsk->state < 0 || tsk->state > 5) state = '.'; else state = "RSDZTW"[tsk->state]; vsize = eip = esp = 0; if (tsk->mm && tsk->mm != &init_mm) { struct vm_area_struct *vma = tsk->mm->mmap; while (vma) { vsize += vma->vm_end - vma->vm_start; vma = vma->vm_next; } if (tsk->kernel_stack_page) { eip = KSTK_EIP(tsk); esp = KSTK_ESP(tsk); } } wchan = get_wchan(tsk); if (tsk->sig) { unsigned long bit = 1; for(i=0; i<32; ++i) { switch((unsigned long) tsk->sig->action[i].sa_handler) { case 0: break; case 1: sigignore |= bit; break; default: sigcatch |= bit; } bit <<= 1; } } if (tsk->tty) tty_pgrp = tsk->tty->pgrp; else tty_pgrp = -1; /* scale priority and nice values from timeslices to -20..20 */ /* to make it look like a "normal" unix priority/nice value */ priority = tsk->counter; priority = 20 - (priority * 10 + DEF_PRIORITY / 2) / DEF_PRIORITY; nice = tsk->priority; nice = 20 - (nice * 20 + DEF_PRIORITY / 2) / DEF_PRIORITY; return sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu \ %lu %lu %lu %lu %lu %lu %lu %lu\n", pid, tsk->comm, state, tsk->p_pptr->pid, tsk->pgrp, tsk->session, tsk->tty ? kdev_t_to_nr(tsk->tty->device) : 0, tty_pgrp, tsk->flags, tsk->min_flt, tsk->cmin_flt, tsk->maj_flt, tsk->cmaj_flt, tsk->utime, tsk->stime, tsk->cutime, tsk->cstime, priority, nice, tsk->timeout, tsk->it_real_value, tsk->start_time, vsize, tsk->mm ? tsk->mm->rss : 0, /* you might want to shift this left 3 */ tsk->rlim ? tsk->rlim[RLIMIT_RSS].rlim_cur : 0, tsk->mm ? tsk->mm->start_code : 0, tsk->mm ? tsk->mm->end_code : 0, tsk->mm ? tsk->mm->start_stack : 0, esp, eip, tsk->signal, tsk->blocked, sigignore, sigcatch, wchan, tsk->nswap, tsk->cnswap); }