X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..b7266188b87f3620ec3f9f717e57194a7dd989fe:/osfmk/kern/sched.h diff --git a/osfmk/kern/sched.h b/osfmk/kern/sched.h index 3783f8d89..9a153ea29 100644 --- a/osfmk/kern/sched.h +++ b/osfmk/kern/sched.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2009 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -158,6 +158,7 @@ #define BASEPRI_FOREGROUND (BASEPRI_DEFAULT + 16) /* 47 */ #define BASEPRI_BACKGROUND (BASEPRI_DEFAULT + 15) /* 46 */ #define BASEPRI_DEFAULT (MAXPRI_USER - (NRQS / 4)) /* 31 */ +#define MAXPRI_THROTTLE (MINPRI + 4) /* 4 */ #define MINPRI_USER MINPRI /* 0 */ /* @@ -178,13 +179,6 @@ typedef struct run_queue *run_queue_t; #define first_timeslice(processor) ((processor)->timeslice > 0) -#define processor_timeslice_setup(processor, thread) \ -MACRO_BEGIN \ - (processor)->timeslice = \ - ((thread)->sched_mode & TH_MODE_TIMESHARE)? \ - (processor)->processor_set->timeshare_quanta: 1; \ -MACRO_END - #define thread_quantum_init(thread) \ MACRO_BEGIN \ (thread)->current_quantum = \ @@ -192,21 +186,14 @@ MACRO_BEGIN \ (thread)->realtime.computation: std_quantum; \ MACRO_END -/* Invoked at splsched by a thread on itself */ -#define csw_needed(thread, processor) ( \ - ((thread)->state & TH_SUSP) || \ - (first_timeslice(processor)? \ - ((processor)->runq.highq > (thread)->sched_pri || \ - (processor)->processor_set->runq.highq > (thread)->sched_pri) : \ - ((processor)->runq.highq >= (thread)->sched_pri || \ - (processor)->processor_set->runq.highq >= (thread)->sched_pri)) ) +extern struct run_queue rt_runq; /* * Scheduler routines. */ /* Remove thread from its run queue */ -extern run_queue_t run_queue_remove( +extern boolean_t run_queue_remove( thread_t thread); /* Handle quantum expiration for an executing thread */ @@ -214,10 +201,8 @@ extern void thread_quantum_expire( timer_call_param_t processor, timer_call_param_t thread); -/* Called at splsched by a thread on itself */ -extern ast_t csw_check( - thread_t thread, - processor_t processor); +/* Context switch check for current processor */ +extern ast_t csw_check(processor_t processor); extern uint32_t std_quantum, min_std_quantum; extern uint32_t std_quantum_us; @@ -243,34 +228,56 @@ extern void compute_averunnable( extern void compute_stack_target( void *arg); +extern void compute_memory_pressure( + void *arg); + /* * Conversion factor from usage * to priority. */ extern uint32_t sched_pri_shift; - -/* - * Scaling factor for usage - * based on load. - */ +extern uint32_t sched_fixed_shift; extern int8_t sched_load_shifts[NRQS]; extern int32_t sched_poll_yield_shift; extern uint32_t sched_safe_duration; +extern uint32_t sched_run_count, sched_share_count; +extern uint32_t sched_load_average, sched_mach_factor; + +extern uint32_t avenrun[3], mach_factor[3]; + extern uint64_t max_unsafe_computation; extern uint64_t max_poll_computation; -extern uint32_t avenrun[3], mach_factor[3]; +#define sched_run_incr() \ +MACRO_BEGIN \ + machine_run_count(hw_atomic_add(&sched_run_count, 1)); \ +MACRO_END + +#define sched_run_decr() \ +MACRO_BEGIN \ + machine_run_count(hw_atomic_sub(&sched_run_count, 1)); \ +MACRO_END + +#define sched_share_incr() \ +MACRO_BEGIN \ + (void)hw_atomic_add(&sched_share_count, 1); \ +MACRO_END + +#define sched_share_decr() \ +MACRO_BEGIN \ + (void)hw_atomic_sub(&sched_share_count, 1); \ +MACRO_END /* * thread_timer_delta macro takes care of both thread timers. */ #define thread_timer_delta(thread, delta) \ MACRO_BEGIN \ - (delta) = timer_delta(&(thread)->system_timer, \ + (delta) = (typeof(delta))timer_delta(&(thread)->system_timer, \ &(thread)->system_timer_save); \ - (delta) += timer_delta(&(thread)->user_timer, \ + (delta) += (typeof(delta))timer_delta(&(thread)->user_timer, \ &(thread)->user_timer_save); \ MACRO_END