]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/processor.h
xnu-517.7.7.tar.gz
[apple/xnu.git] / osfmk / kern / processor.h
index be99fc1e760f4ea03194491be0f5b483cb6dec39..be661abaf37e80ee2a2edce52dc6696a5d96dfcf 100644 (file)
@@ -77,7 +77,6 @@
 #include <kern/lock.h>
 #include <kern/queue.h>
 #include <kern/sched.h>
-#include <kern/cpu_data.h>
 
 #include <machine/ast_types.h>
 
@@ -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_ */