Annotation of XNU/osfmk/kern/sf.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  * 
                     25:  */
                     26: 
                     27: #ifndef        _KERN_SF_H_
                     28: #define _KERN_SF_H_
                     29: 
                     30: /*
                     31:  * The calls most likely to change are: policy_thread_done and
                     32:  * policy_thread_begin.  They're the policy calls related to 
                     33:  * context switching. I'm not satisfied with what I have now and
                     34:  * these are the forms I'm trying next.
                     35:  * 
                     36:  * I still have to merge the data type names from my different sandboxes
                     37:  * and I don't really talk about locking except for the run queue locking.
                     38:  * 
                     39:  * A good example of the data type problem is sched_thread_t and thread_t.
                     40:  * Right now, they're equivalent BUT eventually, i expect that policies
                     41:  * will only use sched_thread_t which will only contain the scheduling
                     42:  * attributes and the framework will know how to convert sched_thread_t
                     43:  * to thread_t (policy-mechanism seperation).
                     44:  * 
                     45:  * There is a big change for run queues: there is a single lock for an
                     46:  * entire run queue array structure (instead of a lock per queue header).
                     47:  * It's OK for a policy to reorganize a particular queue BUT it has to
                     48:  * disable the queue header (sched_queue_disable).  Since a queue header
                     49:  * isn't shared by multiple policies and the framework won't touch the
                     50:  * queue header if it's disabled, the policy can do anything it wants
                     51:  * without taking out a global lock.
                     52:  * 
                     53:  * The only run queue primitives provided are the really fast ones:
                     54:  * insert at the head (sched_queue_preempt), insert at the tail
                     55:  * and if the queue was empty check for preemption 
                     56:  * (sched_queue_add_preempt), just insert at the tail
                     57:  * (sched_queue_add_only), and remove (sched_queue_remove).  Everything
                     58:  * else needs to be done by first disabling the queue header (and then
                     59:  * you can do whatever you want to the queue).
                     60:  * 
                     61:  * BTW, the convention here is:
                     62:  * 
                     63:  *    policy_xxx - calls from the framework into policies (via the
                     64:  *     pointers in the policy object)
                     65:  * 
                     66:  *    sched_xxx - scheduling mechanisms provided by the framework
                     67:  *         which can be called by policies.
                     68:  * 
                     69:  * ----------
                     70:  * 
                     71:  * Initializes an instance of a scheduling policy assigning it the
                     72:  * corresponding policy_id and run queue headers.
                     73:  * 
                     74:  * policy_init(
                     75:  *     sched_policy_object      *policy,
                     76:  *     int policy_id,                          / * policy number * /
                     77:  *     int priority_mask_length,                       / * length of a priority mask * /
                     78:  *     sched_priority_mask *priority_mask );   / * mask for this policy * /
                     79:  * 
                     80:  * Enable/disable a scheduling policy on a processor [set]
                     81:  * 
                     82:  * policy_enable_processor_set(
                     83:  *     sched_policy_object *policy,            / * policy * /
                     84:  *     processor_set_t processor_set );                / * processor set * /
                     85:  * 
                     86:  * policy_disable_processor_set(
                     87:  *     sched_policy_object *policy,
                     88:  *     processor_set_t processor_set);
                     89:  * 
                     90:  * policy_enable_processor(
                     91:  *     sched_policy_object *policy,            / * policy * /
                     92:  *     processor_t processor );                        / * processor set * /
                     93:  * 
                     94:  * policy_disable_processor(
                     95:  *     sched_policy_object *policy,
                     96:  *     processor_t processor);
                     97:  * 
                     98:  * Notifies the policy that the thread has become runnable
                     99:  * 
                    100:  * policy_thread_unblock(
                    101:  *     sched_policy_object *policy,
                    102:  *     sched_thread_t thread )
                    103:  * 
                    104:  * Notifies the policy that the current thread is done or
                    105:  * a new thread has been selected to run
                    106:  * 
                    107:  * policy_thread_done(
                    108:  *     sched_policy_object *policy,
                    109:  *     sched_thread_t *old_thread );
                    110:  * 
                    111:  * policy_thread_begin(
                    112:  *     sched_policy_object *policy,
                    113:  *     sched_thread_t *new_thread );
                    114:  * 
                    115:  * Attach/detach a thread from the scheduling policy
                    116:  * 
                    117:  * policy_thread_attach(
                    118:  *     sched_policy_object *policy,
                    119:  *     sched_thread_t *thread );
                    120:  * 
                    121:  * policy_thread_detach(
                    122:  *     sched_policy_object *policy,
                    123:  *     sched_thread_t *thread );
                    124:  * 
                    125:  * Set the thread's processor [set]
                    126:  * 
                    127:  * policy_thread_processor(
                    128:  *     sched_policy_object *policy,
                    129:  *     sched_thread_t *thread,
                    130:  *     processor_t processor );
                    131:  * 
                    132:  * policy_thread_processor_set(
                    133:  *     sched_policy_object *policy,
                    134:  *     sched_thread_t *thread,
                    135:  *     processor_set_t processor_set);
                    136:  * 
                    137:  * Set/get a thread's scheduling attributes
                    138:  * 
                    139:  * policy_thread_set(
                    140:  *     sched_policy_object *policy,
                    141:  *     sched_thread_t thread,
                    142:  *     sched_policy_attributes policy_attributes);
                    143:  * 
                    144:  * policy_thread_get(
                    145:  *     sched_policy_object *policy,
                    146:  *     sched_thread_t thread,
                    147:  *     sched_policy_attributes *policy_attributes);
                    148:  * 
                    149:  * Scheduling Framework Interfaces
                    150:  * 
                    151:  * [en/dis]able particular run queue headers on a processor [set],
                    152:  * 
                    153:  * Lock the run queues, update the mask, unlock the run queues.  If
                    154:  * enabling, check preemption.
                    155:  * 
                    156:  * sched_queue_enable(
                    157:  *     run_queue_t             runq,
                    158:  *     sched_priority_mask *mask );
                    159:  * 
                    160:  * sched_queue_disable(
                    161:  *     run_queue_t             runq,
                    162:  *     sched_priority_mask *mask );
                    163:  * 
                    164:  * Lock the run queues, insert the thread at the head, unlock the
                    165:  * run queues and preempt (if possible).
                    166:  * 
                    167:  * sched_queue_preempt(
                    168:  *     meta_priority_t priority,
                    169:  *     thread_t                thread,
                    170:  *     run_queue_t             run_queues );
                    171:  * 
                    172:  * Lock the run queues, add the thread to the tail, unlock the run queues
                    173:  * and preempt if appropriate.
                    174:  * 
                    175:  * sched_queue_add_preempt(
                    176:  *     meta_priority_t priority,
                    177:  *     thread_t                thread,
                    178:  *     run_queue_t             run_queues );
                    179:  * 
                    180:  * Lock the run queues, add the thread to the tail, unlock the queues
                    181:  * but don't check for preemption.
                    182:  * 
                    183:  * sched_queue_add_only(
                    184:  *     meta_priority_t priority,
                    185:  *     thread_t                thread,
                    186:  *     run_queue_t             run_queues );
                    187:  * 
                    188:  * Lock the run queues, remove the entry the thread, unlock the run queues.
                    189:  * 
                    190:  * sched_queue_remove(
                    191:  *     thread_t                thread );
                    192:  */
                    193: 
                    194: #include <kern/kern_types.h>
                    195: #include <kern/sched.h>
                    196: #include <mach/thread_switch.h>
                    197: #include <mach/mach_types.h>
                    198: 
                    199: /*
                    200:  * Type definitions and constants for MK Scheduling Framework
                    201:  */
                    202: typedef int    sf_return_t;
                    203: 
                    204: /* successful completion */
                    205: #define SF_SUCCESS                                     0
                    206: 
                    207: /* error codes */
                    208: #define SF_FAILURE                                     1
                    209: #define SF_KERN_RESOURCE_SHORTAGE      2
                    210: 
                    211: /* Scheduler Framework Object -- i.e., a scheduling policy */
                    212: typedef struct sf_policy       *sf_object_t;
                    213: 
                    214: /* Scheduler Framework thread definition is just a thread (for now) */
                    215: typedef thread_t                       sched_thread_t;
                    216: 
                    217: /* Scheduler Framework priority mask definition */
                    218: typedef struct {
                    219:        int bitmap[NRQBM];
                    220: } sf_priority_mask, *sf_priority_mask_t;
                    221: 
                    222: /* Scheduler Framework meta-priority definition is just an int (for now) */
                    223: typedef int    meta_priority_t;
                    224: 
                    225: /**********
                    226:  *
                    227:  * Scheduling Attributes
                    228:  *
                    229:  **********/
                    230: 
                    231: struct sp_attributes {
                    232:        int                     policy_id;      /* index of SP for kernel */
                    233: };
                    234: 
                    235: typedef int    sp_attributes_size_t;
                    236: 
                    237: #define SP_ATTRIBUTES_NULL     ((sp_attributes_t) 0)
                    238: 
                    239: /**********
                    240:  *
                    241:  * Scheduling Information
                    242:  *
                    243:  **********/
                    244: 
                    245: /*** ??? typedef void  *sp_info_t; ***/
                    246: typedef int    sp_info_size_t;
                    247: 
                    248: #define SP_INFO_NULL           ((sp_info_t) 0)
                    249: 
                    250: /*
                    251:  * maximum number of scheduling policies that the Scheduling Framework
                    252:  * will host (picked arbitrarily)
                    253:  */
                    254: #define MAX_SCHED_POLS         ( 10 )
                    255: 
                    256: /**********
                    257:  *
                    258:  * Scheduling Framework Interfaces
                    259:  *
                    260:  **********/
                    261: 
                    262: /* Initialize Framework and selected policies */
                    263: void           sf_init(void);
                    264: 
                    265: /* [En/Dis]able particular run queue headers on a processor [set] */
                    266: 
                    267: /* Lock run queues, update mask, unlock run queues.  If enabling, check preemption */
                    268: sf_return_t    (*sf_queue_enable)(
                    269:                    run_queue_t         runq,
                    270:                    sf_priority_mask    *mask);
                    271: 
                    272: sf_return_t    (*sf_queue_disable)(
                    273:                    run_queue_t         runq,
                    274:                    sf_priority_mask    *mask);
                    275: 
                    276: /* Lock run queues, insert thread at head, unlock run queues and preempt (if possible) */
                    277: sf_return_t    (*sf_queue_preempt)(
                    278:                    meta_priority_t     priority,
                    279:                    thread_t            thread,
                    280:                    run_queue_t         run_queues);
                    281: 
                    282: /* Lock run queues, add thread to tail, unlock run queues and preempt if appropriate */
                    283: sf_return_t    (*sf_queue_add_preempt)(
                    284:                    meta_priority_t     priority,
                    285:                    thread_t            thread,
                    286:                    run_queue_t         run_queues);
                    287: 
                    288: /* Lock run queues, add thread to tail, unlock queues but don't check for preemption */
                    289: sf_return_t    (*sf_queue_add_only)(
                    290:                    meta_priority_t     priority,
                    291:                    thread_t            thread,
                    292:                    run_queue_t         run_queues);
                    293: 
                    294: /* Lock run queues, remove thread entry, unlock run queues */
                    295: sf_return_t    (*sf_queue_remove)(
                    296:                    thread_t            thread);
                    297: 
                    298: /**********
                    299:  *
                    300:  * Scheduling Policy Interfaces
                    301:  *
                    302:  **********/
                    303: 
                    304: /*
                    305:  * Operation list for scheduling policies.  (Modeled after the
                    306:  * device operations `.../mach_kernel/device/conf.h.')
                    307:  *
                    308:  * Key to some abbreviations:
                    309:  *     sp = scheduling policy
                    310:  *     sf = scheduling framework
                    311:  */
                    312: typedef struct sched_policy_ops {
                    313:     /* Initialize an instance of a scheduling policy */
                    314:     sf_return_t        (*sp_init)(
                    315:                sf_object_t                     policy,
                    316:                int                                     policy_id,
                    317:                int                                     priority_mask_length,
                    318:                sf_priority_mask        *priority_mask);
                    319: 
                    320:     /* Enable/disable a scheduling policy on a processor [set] */
                    321:     sf_return_t        (*sp_enable_processor_set)(
                    322:                sf_object_t                     policy,
                    323:                processor_set_t         processor_set);
                    324: 
                    325:     sf_return_t        (*sp_disable_processor_set)(
                    326:                sf_object_t                     policy,
                    327:                processor_set_t         processor_set);
                    328: 
                    329:     sf_return_t        (*sp_enable_processor)(
                    330:                sf_object_t                     policy,
                    331:                processor_t                     processor);
                    332: 
                    333:     sf_return_t        (*sp_disable_processor)(
                    334:                sf_object_t                     policy,
                    335:                processor_t                     processor);
                    336: 
                    337:     /* Allow the policy to update the meta-priority of a running thread */
                    338:     sf_return_t        (*sp_thread_update_mpri)(
                    339:                sf_object_t                     policy,
                    340:                sched_thread_t          thread);
                    341: 
                    342:     /* Notify the policy that a thread has become runnable */
                    343:     sf_return_t        (*sp_thread_unblock)(
                    344:                sf_object_t                     policy,
                    345:                sched_thread_t          thread);
                    346: 
                    347:     /* Notify the policy that the current thread is done */
                    348:     /*** ??? Should this call take a `reason' argument? ***/
                    349:     sf_return_t        (*sp_thread_done)(
                    350:                sf_object_t                     policy,
                    351:                sched_thread_t          old_thread);
                    352: 
                    353:     /* Notify the policy that a new thread has been selected to run */
                    354:     sf_return_t        (*sp_thread_begin)(
                    355:                sf_object_t                     policy,
                    356:                sched_thread_t          new_thread);
                    357: 
                    358:     /* Notify the policy that an old thread is ready to be requeued */
                    359:     sf_return_t        (*sp_thread_dispatch)(
                    360:                sf_object_t                     policy,
                    361:                sched_thread_t          old_thread);
                    362: 
                    363:     /* Attach/detach a thread from the scheduling policy */
                    364:     sf_return_t        (*sp_thread_attach)(
                    365:                sf_object_t                     policy,
                    366:                sched_thread_t          thread);
                    367: 
                    368:     sf_return_t        (*sp_thread_detach)(
                    369:                sf_object_t                     policy,
                    370:                sched_thread_t          thread);
                    371: 
                    372:     /* Set the thread's processor [set] */
                    373:     sf_return_t        (*sp_thread_processor)(
                    374:                sf_object_t                     policy,
                    375:                sched_thread_t          *thread,
                    376:                processor_t                     processor);
                    377: 
                    378:     sf_return_t        (*sp_thread_processor_set)(
                    379:                sf_object_t                     policy,
                    380:                sched_thread_t          thread,
                    381:                processor_set_t         processor_set);
                    382: 
                    383:     /* Set/get a thread's scheduling attributes */
                    384:     sf_return_t        (*sp_thread_set)(
                    385:                sf_object_t                     policy,
                    386:                sched_thread_t          thread,
                    387:                sp_attributes_t         policy_attributes);
                    388: 
                    389:     sf_return_t        (*sp_thread_get)(
                    390:                sf_object_t                             policy,
                    391:                sched_thread_t                  thread,
                    392:                sp_attributes_t                 policy_attributes,
                    393:                sp_attributes_size_t    size);
                    394: 
                    395:     /* Print scheduling info for a given thread */
                    396:     int        (*sp_db_print_sched_stats)(
                    397:                sf_object_t                     policy,
                    398:                sched_thread_t          thread);
                    399: 
                    400:     /***
                    401:      *** ??? Hopefully, many of the following operations are only
                    402:      *** temporary.  Consequently, they haven't been forced to take
                    403:      *** the same form as the others just yet.  That should happen
                    404:      *** for all of those that end up being permanent additions to the
                    405:      *** list of standard operations.
                    406:      ***/
                    407: 
                    408:     /* `swtch_pri()' routine -- attempt to give up processor */
                    409:     void (*sp_swtch_pri)(
                    410:                sf_object_t                     policy,
                    411:                int                                     pri);
                    412: 
                    413:     /* `thread_switch()' routine -- context switch w/ optional hint */
                    414:     kern_return_t (*sp_thread_switch)(
                    415:                sf_object_t                     policy,
                    416:                thread_act_t            hint_act,
                    417:                int                                     option,
                    418:                mach_msg_timeout_t      option_time);
                    419: 
                    420:     /* `thread_depress_abort()' routine -- prematurely abort depression */
                    421:     kern_return_t (*sp_thread_depress_abort)(
                    422:                sf_object_t                     policy,
                    423:                sched_thread_t          thread);
                    424: 
                    425:     /* `thread_depress_timeout()' routine -- timeout on depression */
                    426:     void       (*sp_thread_depress_timeout)(
                    427:                sf_object_t                     policy,
                    428:                thread_t                        thread);
                    429: 
                    430:     /* `task_attach()' routine -- associate task with scheduling policy */
                    431:     sf_return_t (*sp_task_attach)(
                    432:                sf_object_t                     policy,
                    433:                task_t                          task);
                    434: 
                    435:     /* `task_detach()' routine -- disassociate task from scheduling policy */
                    436:     sf_return_t (*sp_task_detach)(
                    437:                sf_object_t                     policy,
                    438:                task_t                          task);
                    439: 
                    440:     /* `task_policy()' routine -- set scheduling policy and parameters */
                    441:     kern_return_t (*sp_task_policy)(
                    442:                sf_object_t                             policy,
                    443:                task_t                                  task,
                    444:                policy_t                                policy_id,
                    445:                policy_base_t                   base,
                    446:                mach_msg_type_number_t  count,
                    447:                boolean_t                               set_limit,
                    448:                boolean_t                               change,
                    449:                policy_limit_t                  *limit_ptr,
                    450:                int                                             *lc_ptr);
                    451: 
                    452:     /* `task_set_policy()' routine -- set scheduling policy and parameters */
                    453:     kern_return_t (*sp_task_set_policy)(
                    454:                sf_object_t                             policy,
                    455:                task_t                                  task,
                    456:                processor_set_t                 pset,
                    457:                policy_t                                policy_id,
                    458:                policy_base_t                   base,
                    459:                mach_msg_type_number_t  base_count,
                    460:                policy_limit_t                  limit,
                    461:                mach_msg_type_number_t  limit_count,
                    462:                boolean_t                               change);
                    463: 
                    464:     kern_return_t (*sp_task_set_sched)(
                    465:                sf_object_t                             policy,
                    466:                task_t                                  task,
                    467:                policy_t                                policy_id,
                    468:                sched_attr_t                    sched_attr,
                    469:                mach_msg_type_number_t  sched_attrCnt,
                    470:                boolean_t                               set_limit,
                    471:                boolean_t                               change);
                    472: 
                    473:     kern_return_t (*sp_task_get_sched)(
                    474:                sf_object_t                             policy,
                    475:                task_t                                  task,
                    476:                policy_t                                policy_id,
                    477:                sched_attr_t                    sched_attr,
                    478:                mach_msg_type_number_t  sched_attrCnt,
                    479:                mach_msg_type_number_t  sched_attr_size);
                    480: 
                    481:     boolean_t (*sp_thread_runnable)(
                    482:                sf_object_t                     policy,
                    483:                sched_thread_t          thread);
                    484: 
                    485:     sf_return_t        (*sp_alarm_expired)(
                    486:                sf_object_t                     policy,
                    487:                long                            alarm_seqno,
                    488:                kern_return_t           result,
                    489:                int                                     alarm_type,
                    490:                mach_timespec_t         wakeup_time,
                    491:                void                            *alarm_data);
                    492: 
                    493: } sp_ops_t;
                    494: 
                    495: /**********
                    496:  *
                    497:  * Scheduling Policy
                    498:  *
                    499:  **********/
                    500: 
                    501: typedef struct sf_policy {
                    502:        int                                     policy_id;                              /* policy number */
                    503:        int                                     priority_mask_length;   /* length of a priority mask */
                    504:        sf_priority_mask        priority_mask;                  /* mask for this policy */
                    505: 
                    506:        /***
                    507:         *** ??? does this have to be so general?  why not just
                    508:         *** have room in this struct for the priority mask?  then
                    509:         *** there is no need for an allocation and less indirection
                    510:         *** is required for normal access.
                    511:         ***/
                    512: 
                    513:        /*
                    514:         * This is the size of the scheduling parameters
                    515:         * data structure for this scheduling policy, in
                    516:         * bytes.
                    517:         *
                    518:         * These are the parameters that are actually
                    519:         * communicated -- and meaningful -- outside
                    520:         * the policy.  (This is as opposed to the
                    521:         * internal state, which has some overlap with
                    522:         * the scheduling parameters.  The size of the
                    523:         * internal state is given by `sched_info_size'
                    524:         * in this structure.)
                    525:         *
                    526:         * By convention, the first field in the sched
                    527:         * parameters structure is the scheduling policy
                    528:         * ID.  This makes the parameters more readily
                    529:         * self-describing.
                    530:         */
                    531:        sp_attributes_size_t    sched_attributes_size;
                    532: 
                    533:        /*
                    534:         * This is the size of the scheduling policy's
                    535:         * internal state that describes the state of a
                    536:         * thread, in bytes.
                    537:         */
                    538:        sp_info_size_t                  sched_info_size;
                    539: 
                    540:        /*
                    541:         * policy-specific versions
                    542:         * of standard sched ops
                    543:         */
                    544:        sp_ops_t                                sp_ops;
                    545: } sched_policy_t;
                    546: 
                    547: #define SCHED_POLICY_NULL      ((sched_policy_t *) 0)
                    548: 
                    549: #define policy_id_to_sched_policy(policy_id)           \
                    550:        (((policy_id) != POLICY_NULL)?                                  \
                    551:                        &sched_policy[(policy_id)] : SCHED_POLICY_NULL)
                    552: 
                    553: /*
                    554:  * Declaration for array of scheduling policies known to kernel
                    555:  */
                    556: extern sched_policy_t  sched_policy[MAX_SCHED_POLS];
                    557: 
                    558: /*
                    559:  * Maximum sizes for scheduling-policy-specific information and 
                    560:  * attributes, calculated dynamically based on the scheduling
                    561:  * policies that were initialized at system startup time.
                    562:  */
                    563: extern sp_info_size_t          max_sched_info_size;
                    564: extern         sp_attributes_size_t    max_sched_attributes_size;
                    565: 
                    566: #endif /* _KERN_SF_H_ */

unix.superglobalmegacorp.com

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