The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_idle.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2000, All rights reserved.  See /usr/src/COPYRIGHT
    3  *
    4  * $FreeBSD: releng/5.1/sys/kern/kern_idle.c 114471 2003-05-02 00:33:12Z julian $
    5  */
    6 
    7 #include "opt_ktrace.h"
    8 
    9 #include <sys/param.h>
   10 #include <sys/systm.h>
   11 #include <sys/kernel.h>
   12 #include <sys/ktr.h>
   13 #include <sys/kthread.h>
   14 #include <sys/lock.h>
   15 #include <sys/mutex.h>
   16 #include <sys/pcpu.h>
   17 #include <sys/proc.h>
   18 #include <sys/resourcevar.h>
   19 #include <sys/sched.h>
   20 #include <sys/smp.h>
   21 #include <sys/unistd.h>
   22 #ifdef KTRACE
   23 #include <sys/uio.h>
   24 #include <sys/ktrace.h>
   25 #endif
   26 
   27 static void idle_setup(void *dummy);
   28 SYSINIT(idle_setup, SI_SUB_SCHED_IDLE, SI_ORDER_FIRST, idle_setup, NULL)
   29 
   30 static void idle_proc(void *dummy);
   31 
   32 /*
   33  * Setup per-cpu idle process contexts.  The AP's shouldn't be running or
   34  * accessing their idle processes at this point, so don't bother with
   35  * locking.
   36  */
   37 static void
   38 idle_setup(void *dummy)
   39 {
   40 #ifdef SMP
   41         struct pcpu *pc;
   42 #endif
   43         struct proc *p;
   44         struct thread *td;
   45         int error;
   46 
   47 #ifdef SMP
   48         SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
   49                 error = kthread_create(idle_proc, NULL, &p,
   50                     RFSTOPPED | RFHIGHPID, 0, "idle: cpu%d", pc->pc_cpuid);
   51                 pc->pc_idlethread = FIRST_THREAD_IN_PROC(p);
   52                 if (pc->pc_curthread == NULL) {
   53                         pc->pc_curthread = pc->pc_idlethread;
   54                         pc->pc_idlethread->td_critnest = 0;
   55                 }
   56 #else
   57                 error = kthread_create(idle_proc, NULL, &p,
   58                     RFSTOPPED | RFHIGHPID, 0, "idle");
   59                 PCPU_SET(idlethread, FIRST_THREAD_IN_PROC(p));
   60 #endif
   61                 if (error)
   62                         panic("idle_setup: kthread_create error %d\n", error);
   63 
   64                 PROC_LOCK(p);
   65                 p->p_flag |= P_NOLOAD;
   66                 mtx_lock_spin(&sched_lock);
   67                 p->p_state = PRS_NORMAL;
   68                 td = FIRST_THREAD_IN_PROC(p);
   69                 td->td_state = TDS_CAN_RUN;
   70                 td->td_flags |= TDF_IDLETD;
   71                 mtx_unlock_spin(&sched_lock);
   72                 PROC_UNLOCK(p);
   73 #ifdef SMP
   74         }
   75 #endif
   76 }
   77 
   78 /*
   79  * idle process context
   80  */
   81 static void
   82 idle_proc(void *dummy)
   83 {
   84 #ifdef DIAGNOSTIC
   85         int count;
   86 #endif
   87         struct thread *td;
   88         struct proc *p;
   89 
   90         td = curthread;
   91         p = td->td_proc;
   92         for (;;) {
   93                 mtx_assert(&Giant, MA_NOTOWNED);
   94 
   95 #ifdef DIAGNOSTIC
   96                 count = 0;
   97 
   98                 while (count >= 0 && sched_runnable() == 0) {
   99 #else
  100                 while (sched_runnable() == 0) {
  101 #endif
  102                 /*
  103                  * This is a good place to put things to be done in
  104                  * the background, including sanity checks.
  105                  */
  106 
  107 #ifdef DIAGNOSTIC
  108                         if (count++ < 0)
  109                                 CTR0(KTR_PROC, "idle_proc: timed out waiting"
  110                                     " for a process");
  111 #endif
  112 
  113 #ifdef __i386__
  114                         cpu_idle();
  115 #endif
  116                 }
  117 
  118                 mtx_lock_spin(&sched_lock);
  119                 p->p_stats->p_ru.ru_nvcsw++;
  120                 td->td_state = TDS_CAN_RUN;
  121                 mi_switch();
  122                 mtx_unlock_spin(&sched_lock);
  123         }
  124 }

Cache object: f896e488da472b33ded5a7271d1b7202


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.