X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..5eebf7385fedb1517b66b53c28e5aa6bb0a2be50:/osfmk/kern/processor.h diff --git a/osfmk/kern/processor.h b/osfmk/kern/processor.h index be99fc1e7..be661abaf 100644 --- a/osfmk/kern/processor.h +++ b/osfmk/kern/processor.h @@ -77,7 +77,6 @@ #include #include #include -#include #include @@ -85,11 +84,10 @@ struct processor_set { queue_head_t idle_queue; /* idle processors */ int idle_count; /* how many ? */ queue_head_t active_queue; /* active processors */ - decl_simple_lock_data(,sched_lock) /* lock for above */ queue_head_t processors; /* all processors here */ int processor_count;/* how many ? */ - decl_simple_lock_data(,processors_lock) /* lock for above */ + decl_simple_lock_data(,sched_lock) /* lock for above */ struct run_queue runq; /* runq for this set */ @@ -101,13 +99,14 @@ struct processor_set { boolean_t active; /* is pset in use */ decl_mutex_data(, lock) /* lock for above */ - int set_quanta; /* timeslice quanta for timesharing */ - int machine_quanta[NCPUS+1]; + int timeshare_quanta; /* timeshare quantum factor */ + int quantum_factors[NCPUS+1]; struct ipc_port * pset_self; /* port for operations */ struct ipc_port * pset_name_self; /* port for information */ - uint32_t run_count; /* number of threads running in set */ + uint32_t run_count; /* threads running in set */ + uint32_t share_count; /* timeshare threads running in set */ integer_t mach_factor; /* mach_factor */ integer_t load_average; /* load_average */ @@ -118,23 +117,27 @@ struct processor { queue_chain_t processor_queue;/* idle/active/action queue link, * MUST remain the first element */ int state; /* See below */ - int current_pri; /* priority of current thread */ - struct thread_shuttle + struct thread + *active_thread, /* thread running on processor */ *next_thread, /* next thread to run if dispatched */ *idle_thread; /* this processor's idle thread. */ + + processor_set_t processor_set; /* current membership */ + + int current_pri; /* priority of current thread */ + timer_call_data_t quantum_timer; /* timer for quantum expiration */ - int slice_quanta; /* quanta before timeslice ends */ uint64_t quantum_end; /* time when current quantum ends */ uint64_t last_dispatch; /* time of last dispatch */ + int timeslice; /* quanta before timeslice ends */ + uint64_t deadline; /* current deadline */ + struct run_queue runq; /* local runq for this processor */ - processor_set_t processor_set; /* current membership */ - processor_set_t processor_set_next; /* set to join in progress */ - queue_chain_t processors; /* all processors in set */ + queue_chain_t processors; /* all processors in set */ decl_simple_lock_data(,lock) struct ipc_port *processor_self;/* port for operations */ - cpu_data_t *cpu_data; /* machine-dep per-cpu data */ int slot_num; /* machine-indep slot number */ }; @@ -167,13 +170,12 @@ extern struct processor processor_array[NCPUS]; * will often lock both. */ -#define PROCESSOR_OFF_LINE 0 /* Not in system */ -#define PROCESSOR_RUNNING 1 /* Running a normal thread */ -#define PROCESSOR_IDLE 2 /* idle */ -#define PROCESSOR_DISPATCHING 3 /* dispatching (idle -> running) */ -#define PROCESSOR_ASSIGN 4 /* Assignment is changing */ -#define PROCESSOR_SHUTDOWN 5 /* Being shutdown */ -#define PROCESSOR_START 6 /* Being start */ +#define PROCESSOR_OFF_LINE 0 /* Not available */ +#define PROCESSOR_RUNNING 1 /* Normal execution */ +#define PROCESSOR_IDLE 2 /* Idle */ +#define PROCESSOR_DISPATCHING 3 /* Dispatching (idle -> running) */ +#define PROCESSOR_SHUTDOWN 4 /* Going off-line */ +#define PROCESSOR_START 5 /* Being started */ /* * Use processor ptr array to find current processor's data structure. @@ -187,7 +189,6 @@ extern processor_t processor_ptr[NCPUS]; #define cpu_to_processor(i) (processor_ptr[i]) #define current_processor() (processor_ptr[cpu_number()]) -#define current_processor_set() (current_processor()->processor_set) /* Compatibility -- will go away */ @@ -205,76 +206,86 @@ extern processor_t processor_ptr[NCPUS]; extern void pset_sys_bootstrap(void); -#define pset_quanta_update(pset) \ +#define timeshare_quanta_update(pset) \ MACRO_BEGIN \ int proc_count = (pset)->processor_count; \ int runq_count = (pset)->runq.count; \ \ - (pset)->set_quanta = (pset)->machine_quanta[ \ + (pset)->timeshare_quanta = (pset)->quantum_factors[ \ (runq_count > proc_count)? \ proc_count: runq_count]; \ MACRO_END -/* Implemented by MD layer */ +#define pset_run_incr(pset) \ + hw_atomic_add(&(pset)->run_count, 1) + +#define pset_run_decr(pset) \ + hw_atomic_sub(&(pset)->run_count, 1) + +#define pset_share_incr(pset) \ + hw_atomic_add(&(pset)->share_count, 1) + +#define pset_share_decr(pset) \ + hw_atomic_sub(&(pset)->share_count, 1) extern void cpu_up( - int cpu); + int cpu); extern kern_return_t processor_shutdown( - processor_t processor); + processor_t processor); extern void pset_remove_processor( - processor_set_t pset, - processor_t processor); + processor_set_t pset, + processor_t processor); extern void pset_add_processor( - processor_set_t pset, - processor_t processor); + processor_set_t pset, + processor_t processor); extern void pset_remove_task( - processor_set_t pset, - task_t task); + processor_set_t pset, + task_t task); extern void pset_add_task( - processor_set_t pset, - task_t task); + processor_set_t pset, + task_t task); extern void pset_remove_thread( - processor_set_t pset, - thread_t thread); + processor_set_t pset, + thread_t thread); extern void pset_add_thread( - processor_set_t pset, - thread_t thread); + processor_set_t pset, + thread_t thread); extern void thread_change_psets( - thread_t thread, - processor_set_t old_pset, - processor_set_t new_pset); + thread_t thread, + processor_set_t old_pset, + processor_set_t new_pset); extern kern_return_t processor_assign( - processor_t processor, - processor_set_t new_pset, - boolean_t wait); + processor_t processor, + processor_set_t new_pset, + boolean_t wait); extern kern_return_t processor_info_count( - processor_flavor_t flavor, - mach_msg_type_number_t *count); + processor_flavor_t flavor, + mach_msg_type_number_t *count); #endif /* MACH_KERNEL_PRIVATE */ extern kern_return_t processor_start( - processor_t processor); + processor_t processor); extern kern_return_t processor_exit( - processor_t processor); + processor_t processor); #endif /* __APPLE_API_PRIVATE */ extern void pset_deallocate( - processor_set_t pset); + processor_set_t pset); extern void pset_reference( - processor_set_t pset); + processor_set_t pset); #endif /* _KERN_PROCESSOR_H_ */