예제 #1
0
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);
		}
	}
예제 #2
0
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);
}
예제 #3
0
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);
}