Annotation of kernel/kern/processor.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /* 
                     26:  * Mach Operating System
                     27:  * Copyright (c) 1992,1991,1990,1989 Carnegie Mellon University
                     28:  * All Rights Reserved.
                     29:  * 
                     30:  * Permission to use, copy, modify and distribute this software and its
                     31:  * documentation is hereby granted, provided that both the copyright
                     32:  * notice and this permission notice appear in all copies of the
                     33:  * software, derivative works or modified versions, and any portions
                     34:  * thereof, and that both notices appear in supporting documentation.
                     35:  * 
                     36:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     37:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     38:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     39:  * 
                     40:  * Carnegie Mellon requests users of this software to return to
                     41:  * 
                     42:  *  Software Distribution Coordinator  or  [email protected]
                     43:  *  School of Computer Science
                     44:  *  Carnegie Mellon University
                     45:  *  Pittsburgh PA 15213-3890
                     46:  * 
                     47:  * any improvements or extensions that they make and grant Carnegie Mellon
                     48:  * the rights to redistribute these changes.
                     49:  */
                     50: 
                     51: /*
                     52:  *     processor.h:    Processor and processor-set definitions.
                     53:  */
                     54: 
                     55: #ifndef        _KERN_PROCESSOR_H_
                     56: #define        _KERN_PROCESSOR_H_
                     57: 
                     58: /*
                     59:  *     Data structures for managing processors and sets of processors.
                     60:  */
                     61: 
                     62: #import <mach/features.h>
                     63: 
                     64: #include <mach/boolean.h>
                     65: #include <mach/kern_return.h>
                     66: #include <mach/port.h>
                     67: #include <mach/processor_info.h>
                     68: #include <kern/cpu_number.h>
                     69: #include <kern/lock.h>
                     70: #include <kern/queue.h>
                     71: #include <kern/sched.h>
                     72: #include <kern/kern_types.h>
                     73: #include <kern/host.h>
                     74: 
                     75: #if    NCPUS > 1
                     76: #include <machine/ast_types.h>
                     77: #endif /* NCPUS > 1 */
                     78: 
                     79: struct processor_set {
                     80:        struct run_queue        runq;           /* runq for this set */
                     81:        queue_head_t            idle_queue;     /* idle processors */
                     82:        int                     idle_count;     /* how many ? */
                     83:        decl_simple_lock_data(, idle_lock)      /* lock for above */
                     84:        queue_head_t            processors;     /* all processors here */
                     85:        int                     processor_count;        /* how many ? */
                     86:        boolean_t               empty;          /* true if no processors */
                     87:        queue_head_t            tasks;          /* tasks assigned */
                     88:        int                     task_count;     /* how many */
                     89:        queue_head_t            threads;        /* threads in this set */
                     90:        int                     thread_count;   /* how many */
                     91:        int                     ref_count;      /* structure ref count */
                     92:        decl_simple_lock_data(, ref_lock)       /* lock for ref count */
                     93:        queue_chain_t           all_psets;      /* link for all_psets */
                     94:        boolean_t               active;         /* is pset in use */
                     95:        decl_simple_lock_data(, lock)           /* lock for everything else */
                     96:        struct ipc_port *       pset_self;      /* port for operations */
                     97:        struct ipc_port *       pset_name_self; /* port for information */
                     98:        int                     max_priority;   /* maximum priority */
                     99: #if    MACH_FIXPRI
                    100:        int                     policies;       /* bit vector for policies */
                    101: #endif /* MACH_FIXPRI */
                    102:        int                     set_quantum;    /* current default quantum */
                    103: #if    NCPUS > 1
                    104:        int                     quantum_adj_index; /* runtime quantum adj. */
                    105:        decl_simple_lock_data(, quantum_adj_lock)  /* lock for above */
                    106:        int                     machine_quantum[NCPUS+1]; /* ditto */
                    107: #endif /* NCPUS > 1 */
                    108:        long                    mach_factor;    /* mach_factor */
                    109:        long                    load_average;   /* load_average */
                    110:        long                    sched_load;     /* load avg for scheduler */
                    111: };
                    112: 
                    113: typedef struct processor_set   *processor_set_name_t;
                    114: 
                    115: extern struct processor_set    default_pset;
                    116: 
                    117: struct processor {
                    118:        struct run_queue runq;          /* local runq for this processor */
                    119:                /* XXX want to do this round robin eventually */
                    120:        queue_chain_t   processor_queue; /* idle/assign/shutdown queue link */
                    121:        int             state;          /* See below */
                    122:        struct thread   *next_thread;   /* next thread to run if dispatched */
                    123:        struct thread   *idle_thread;   /* this processor's idle thread. */
                    124:        int             quantum;        /* quantum for current thread */
                    125:        boolean_t       first_quantum;  /* first quantum in succession */
                    126:        int             last_quantum;   /* last quantum assigned */
                    127: 
                    128:        processor_set_t processor_set;  /* processor set I belong to */
                    129:        processor_set_t processor_set_next;     /* set I will belong to */
                    130:        queue_chain_t   processors;     /* all processors in set */
                    131:        decl_simple_lock_data(, lock)
                    132:        struct ipc_port *processor_self;        /* port for operations */
                    133:        int             slot_num;       /* machine-indep slot number */
                    134: #if    NCPUS > 1
                    135:        ast_check_t     ast_check_data; /* for remote ast_check invocation */
                    136: #endif /* NCPUS > 1 */
                    137:        /* punt id data temporarily */
                    138: };
                    139: 
                    140: extern struct processor        processor_array[NCPUS];
                    141: 
                    142: /*
                    143:  *     Chain of all processor sets.
                    144:  */
                    145: extern queue_head_t            all_psets;
                    146: extern int                     all_psets_count;
                    147: decl_simple_lock_data(extern, all_psets_lock);
                    148: 
                    149: /*
                    150:  *     The lock ordering is:
                    151:  *
                    152:  *                     all_psets_lock
                    153:  *                         |
                    154:  *                         |
                    155:  *                         V
                    156:  *                     pset_lock
                    157:  *                         |
                    158:  *             +-----------+---------------+-------------------+
                    159:  *             |           |               |                   |
                    160:  *             |           |               |                   |
                    161:  *             |           |               V                   V
                    162:  *             |           |           task_lock       pset_self->ip_lock
                    163:  *             |           |               |                   |
                    164:  *             |           |   +-----------+---------------+   |
                    165:  *             |           |   |                           |   |
                    166:  *             |           V   V                           V   V
                    167:  *             |       thread_lock*                    pset_ref_lock
                    168:  *             |           |
                    169:  *             |   +-------+
                    170:  *             |   |       |
                    171:  *             |   |       V
                    172:  *             |   |   runq_lock*
                    173:  *             |   |
                    174:  *             V   V
                    175:  *     processor_lock*
                    176:  *             |
                    177:  *             |
                    178:  *             V
                    179:  *     pset_idle_lock*
                    180:  *             |
                    181:  *             |
                    182:  *             V
                    183:  *     action_lock*
                    184:  *
                    185:  *     Locks marked with "*" are taken at splsched.
                    186:  */
                    187: 
                    188: /*
                    189:  *     XXX need a pointer to the master processor structure
                    190:  */
                    191: 
                    192: extern processor_t     master_processor;
                    193: 
                    194: /*
                    195:  *     NOTE: The processor->processor_set link is needed in one of the
                    196:  *     scheduler's critical paths.  [Figure out where to look for another
                    197:  *     thread to run on this processor.]  It is accessed without locking.
                    198:  *     The following access protocol controls this field.
                    199:  *
                    200:  *     Read from own processor - just read.
                    201:  *     Read from another processor - lock processor structure during read.
                    202:  *     Write from own processor - lock processor structure during write.
                    203:  *     Write from another processor - NOT PERMITTED.
                    204:  *
                    205:  */
                    206: 
                    207: /*
                    208:  *     Processor state locking:
                    209:  *
                    210:  *     Values for the processor state are defined below.  If the processor
                    211:  *     is off-line or being shutdown, then it is only necessary to lock
                    212:  *     the processor to change its state.  Otherwise it is only necessary
                    213:  *     to lock its processor set's idle_lock.  Scheduler code will
                    214:  *     typically lock only the idle_lock, but processor manipulation code
                    215:  *     will often lock both.
                    216:  */
                    217: 
                    218: #define PROCESSOR_OFF_LINE     0       /* Not in system */
                    219: #define        PROCESSOR_RUNNING       1       /* Running normally */
                    220: #define        PROCESSOR_IDLE          2       /* idle */
                    221: #define PROCESSOR_DISPATCHING  3       /* dispatching (idle -> running) */
                    222: #define        PROCESSOR_ASSIGN        4       /* Assignment is changing */
                    223: #define PROCESSOR_SHUTDOWN     5       /* Being shutdown */
                    224: 
                    225: /*
                    226:  *     Use processor ptr array to find current processor's data structure.
                    227:  *     This replaces a multiplication (index into processor_array) with
                    228:  *     an array lookup and a memory reference.  It also allows us to save
                    229:  *     space if processor numbering gets too sparse.
                    230:  */
                    231: 
                    232: extern processor_t     processor_ptr[NCPUS];
                    233: 
                    234: #define cpu_to_processor(i)    (processor_ptr[i])
                    235: 
                    236: #define current_processor()    (processor_ptr[cpu_number()])
                    237: #define current_processor_set()        (current_processor()->processor_set)
                    238: 
                    239: /* Compatibility -- will go away */
                    240: 
                    241: #define cpu_state(slot_num)    (processor_ptr[slot_num]->state)
                    242: #define cpu_idle(slot_num)     (cpu_state(slot_num) == PROCESSOR_IDLE)
                    243: 
                    244: /* Useful lock macros */
                    245: 
                    246: #define        pset_lock(pset)         simple_lock(&(pset)->lock)
                    247: #define pset_unlock(pset)      simple_unlock(&(pset)->lock)
                    248: #define        pset_ref_lock(pset)     simple_lock(&(pset)->ref_lock)
                    249: #define        pset_ref_unlock(pset)   simple_unlock(&(pset)->ref_lock)
                    250: 
                    251: #define processor_lock(pr)     simple_lock(&(pr)->lock)
                    252: #define processor_unlock(pr)   simple_unlock(&(pr)->lock)
                    253: 
                    254: typedef mach_port_t    *processor_array_t;
                    255: typedef mach_port_t    *processor_set_array_t;
                    256: typedef mach_port_t    *processor_set_name_array_t;
                    257: 
                    258: 
                    259: /*
                    260:  *     Exported functions
                    261:  */
                    262: 
                    263: /* Initialization */
                    264: 
                    265: #if    MACH_HOST
                    266: extern void    pset_sys_bootstrap(void);
                    267: extern void    pset_sys_init(void);
                    268: #endif /* MACH_HOST */
                    269: 
                    270: /* Pset internal functions */
                    271: 
                    272: extern void    pset_reference(processor_set_t);
                    273: extern void    pset_deallocate(processor_set_t);
                    274: extern void    pset_remove_processor(processor_set_t, processor_t);
                    275: extern void    pset_add_processor(processor_set_t, processor_t);
                    276: extern void    pset_remove_task(processor_set_t, struct task *);
                    277: extern void    pset_add_task(processor_set_t, struct task *);
                    278: extern void    pset_remove_thread(processor_set_t, struct thread *);
                    279: extern void    pset_add_thread(processor_set_t, struct thread *);
                    280: extern void    thread_change_psets(struct thread *,
                    281:                                processor_set_t, processor_set_t);
                    282: 
                    283: /* Processor interface */
                    284: 
                    285: extern kern_return_t processor_get_assignment(
                    286:                processor_t     processor,
                    287:                processor_set_t *processor_set);
                    288: 
                    289: extern kern_return_t processor_info(
                    290:                processor_t     processor,
                    291:                int             flavor,
                    292:                host_t *        host,
                    293:                processor_info_t info,
                    294:                natural_t *     count);
                    295: 
                    296: extern kern_return_t processor_start(
                    297:                processor_t     processor);
                    298: 
                    299: extern kern_return_t processor_exit(
                    300:                processor_t     processor);
                    301: 
                    302: extern kern_return_t processor_control(
                    303:                processor_t     processor,
                    304:                processor_info_t info,
                    305:                natural_t       count);
                    306: 
                    307: /* Pset interface */
                    308: 
                    309: extern kern_return_t processor_set_create(
                    310:                host_t          host,
                    311:                processor_set_t *new_set,
                    312:                processor_set_t *new_name);
                    313: 
                    314: extern kern_return_t processor_set_destroy(
                    315:                processor_set_t pset);
                    316: 
                    317: extern kern_return_t processor_set_info(
                    318:                processor_set_t pset,
                    319:                int             flavor,
                    320:                host_t          *host,
                    321:                processor_set_info_t info,
                    322:                natural_t       *count);
                    323: 
                    324: extern kern_return_t processor_set_max_priority(
                    325:                processor_set_t pset,
                    326:                int             max_priority,
                    327:                boolean_t       change_threads);
                    328: 
                    329: extern kern_return_t processor_set_policy_enable(
                    330:                processor_set_t pset,
                    331:                int             policy);
                    332: 
                    333: extern kern_return_t processor_set_policy_disable(
                    334:                processor_set_t pset,
                    335:                int             policy,
                    336:                boolean_t       change_threads);
                    337: 
                    338: extern kern_return_t processor_set_tasks(
                    339:                processor_set_t pset,
                    340:                task_array_t    *task_list,
                    341:                natural_t       *count);
                    342: 
                    343: extern kern_return_t processor_set_threads(
                    344:                processor_set_t pset,
                    345:                thread_array_t  *thread_list,
                    346:                natural_t       *count);
                    347: 
                    348: #endif /* _KERN_PROCESSOR_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.