/*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
struct processor_set {
queue_head_t active_queue; /* active processors */
queue_head_t idle_queue; /* idle processors */
- int idle_count;
- processor_t low_hint;
- processor_t high_hint;
+ processor_t low_pri, low_count;
- int processor_count;
+ int online_processor_count;
+
+ int cpu_set_low, cpu_set_hi;
+ int cpu_set_count;
decl_simple_lock_data(,sched_lock) /* lock for above */
+#if defined(CONFIG_SCHED_TRADITIONAL) || defined(CONFIG_SCHED_FIXEDPRIORITY)
+ struct run_queue pset_runq; /* runq for this processor set */
+ int pset_runq_bound_count;
+ /* # of threads in runq bound to any processor in pset */
+#endif
+
struct ipc_port * pset_self; /* port for operations */
struct ipc_port * pset_name_self; /* port for information */
extern struct pset_node pset_node0;
-extern queue_head_t tasks, threads;
+extern queue_head_t tasks, terminated_tasks, threads; /* Terminated tasks are ONLY for stackshot */
extern int tasks_count, threads_count;
-decl_mutex_data(extern,tasks_threads_lock)
+decl_lck_mtx_data(extern,tasks_threads_lock)
+
+struct processor_meta {
+ queue_head_t idle_queue;
+ processor_t primary;
+};
+
+typedef struct processor_meta *processor_meta_t;
+#define PROCESSOR_META_NULL ((processor_meta_t) 0)
struct processor {
queue_chain_t processor_queue;/* idle/active queue link,
processor_set_t processor_set; /* assigned set */
int current_pri; /* priority of current thread */
+ sched_mode_t current_thmode; /* sched mode of current thread */
+ int cpu_id; /* platform numeric id */
timer_call_data_t quantum_timer; /* timer for quantum expiration */
uint64_t quantum_end; /* time when current quantum ends */
uint64_t deadline; /* current deadline */
int timeslice; /* quanta before timeslice ends */
+#if defined(CONFIG_SCHED_TRADITIONAL) || defined(CONFIG_SCHED_FIXEDPRIORITY)
struct run_queue runq; /* runq for this processor */
+ int runq_bound_count; /* # of threads bound to this processor */
+#endif
+#if defined(CONFIG_SCHED_GRRR)
+ struct grrr_run_queue grrr_runq; /* Group Ratio Round-Robin runq */
+#endif
+ processor_meta_t processor_meta;
struct ipc_port * processor_self; /* port for operations */
- decl_simple_lock_data(,lock)
processor_t processor_list; /* all existing processors */
processor_data_t processor_data; /* per-processor data */
extern unsigned int processor_count;
decl_simple_lock_data(extern,processor_list_lock)
-extern processor_t master_processor;
+extern uint32_t processor_avail_count;
+
+extern processor_t master_processor;
+
+extern boolean_t sched_stats_active;
/*
* Processor state is accessed by locking the scheduling lock
#define PROCESSOR_OFF_LINE 0 /* Not available */
#define PROCESSOR_SHUTDOWN 1 /* Going off-line */
#define PROCESSOR_START 2 /* Being started */
-#define PROCESSOR_IDLE 3 /* Idle */
-#define PROCESSOR_DISPATCHING 4 /* Dispatching (idle -> running) */
-#define PROCESSOR_RUNNING 5 /* Normal execution */
+#define PROCESSOR_INACTIVE 3 /* Inactive (unavailable) */
+#define PROCESSOR_IDLE 4 /* Idle (available) */
+#define PROCESSOR_DISPATCHING 5 /* Dispatching (idle -> active) */
+#define PROCESSOR_RUNNING 6 /* Normal execution */
extern processor_t current_processor(void);
#define pset_unlock(p) simple_unlock(&(p)->sched_lock)
#define pset_lock_init(p) simple_lock_init(&(p)->sched_lock, 0)
-#define processor_lock(p) simple_lock(&(p)->lock)
-#define processor_unlock(p) simple_unlock(&(p)->lock)
-#define processor_lock_init(p) simple_lock_init(&(p)->lock, 0)
-
/* Update hints */
-#define pset_hint_low(ps, p) \
-MACRO_BEGIN \
- if ((ps)->low_hint != PROCESSOR_NULL) { \
- if ((p) != (ps)->low_hint) { \
- if ((p)->runq.count < (ps)->low_hint->runq.count) \
- (ps)->low_hint = (p); \
- } \
- } \
- else \
- (ps)->low_hint = (p); \
+#define pset_pri_hint(ps, p, pri) \
+MACRO_BEGIN \
+ if ((p) != (ps)->low_pri) { \
+ if ((pri) < (ps)->low_pri->current_pri) \
+ (ps)->low_pri = (p); \
+ else \
+ if ((ps)->low_pri->state < PROCESSOR_IDLE) \
+ (ps)->low_pri = (p); \
+ } \
+MACRO_END
+
+#define pset_count_hint(ps, p, cnt) \
+MACRO_BEGIN \
+ if ((p) != (ps)->low_count) { \
+ if ((cnt) < SCHED(processor_runq_count)((ps)->low_count)) \
+ (ps)->low_count = (p); \
+ else \
+ if ((ps)->low_count->state < PROCESSOR_IDLE) \
+ (ps)->low_count = (p); \
+ } \
MACRO_END
-#define pset_hint_high(ps, p) \
-MACRO_BEGIN \
- if ((ps)->high_hint != PROCESSOR_NULL) { \
- if ((p) != (ps)->high_hint) { \
- if ((p)->runq.count > (ps)->high_hint->runq.count) \
- (ps)->high_hint = (p); \
- } \
- } \
- else \
- (ps)->high_hint = (p); \
+#define pset_pri_init_hint(ps, p) \
+MACRO_BEGIN \
+ (ps)->low_pri = (p); \
MACRO_END
+#define pset_count_init_hint(ps, p) \
+MACRO_BEGIN \
+ (ps)->low_count = (p); \
+MACRO_END
+
+
extern void processor_bootstrap(void) __attribute__((section("__TEXT, initcode")));
extern void processor_init(
processor_t processor,
- int slot_num,
+ int cpu_id,
processor_set_t processor_set) __attribute__((section("__TEXT, initcode")));
+extern void processor_meta_init(
+ processor_t processor,
+ processor_t primary);
+
extern kern_return_t processor_shutdown(
processor_t processor);
#define pset_deallocate(x)
#define pset_reference(x)
+extern void machine_run_count(
+ uint32_t count);
+
+extern boolean_t machine_processor_is_inactive(
+ processor_t processor);
+
+extern processor_t machine_choose_processor(
+ processor_set_t pset,
+ processor_t processor);
+
#else /* MACH_KERNEL_PRIVATE */
__BEGIN_DECLS
#endif /* MACH_KERNEL_PRIVATE */
-#ifdef XNU_KERNEL_PRIVATE
-
-extern uint32_t processor_avail_count;
-
-#endif
#endif /* _KERN_PROCESSOR_H_ */