]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/processor.h
xnu-1456.1.26.tar.gz
[apple/xnu.git] / osfmk / kern / processor.h
index 50e7ae7f6122940e5693eafcb02b38249241a3f9..fcf61d0444612d7e04fa4dbfc64d74bbd1c461f5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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;
 
@@ -115,7 +113,15 @@ extern struct pset_node    pset_node0;
 
 extern queue_head_t            tasks, threads;
 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,
@@ -129,6 +135,7 @@ struct processor {
        processor_set_t         processor_set;  /* assigned set */
 
        int                                     current_pri;    /* priority 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 */
@@ -138,9 +145,9 @@ struct processor {
        int                                     timeslice;              /* quanta before timeslice ends */
 
        struct run_queue        runq;                   /* runq for this processor */
+       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 */
@@ -150,7 +157,9 @@ extern processor_t          processor_list;
 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;
 
 /*
  *     Processor state is accessed by locking the scheduling lock
@@ -159,9 +168,10 @@ extern processor_t master_processor;
 #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);
 
@@ -174,43 +184,41 @@ extern processor_t        cpu_to_processor(
 #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_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_count_hint(ps, p, cnt)            \
+MACRO_BEGIN                                                                                            \
+       if ((p) != (ps)->low_count) {                                           \
+               if ((cnt) < (ps)->low_count->runq.count)                \
+                       (ps)->low_count = (p);                                          \
+               else                                                                                    \
+               if ((ps)->low_count->state < PROCESSOR_IDLE)    \
+                       (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);
 
@@ -236,6 +244,12 @@ extern kern_return_t       processor_info_count(
 #define pset_deallocate(x)
 #define pset_reference(x)
 
+extern void                    machine_run_count(
+                                               uint32_t        count);
+
+extern boolean_t       machine_cpu_is_inactive(
+                                               int                     cpu_id);
+
 #else  /* MACH_KERNEL_PRIVATE */
 
 __BEGIN_DECLS
@@ -250,9 +264,4 @@ __END_DECLS
 
 #endif /* MACH_KERNEL_PRIVATE */
 
-#ifdef XNU_KERNEL_PRIVATE
-
-extern uint32_t                processor_avail_count;
-
-#endif
 #endif /* _KERN_PROCESSOR_H_ */