]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/timer_queue.h
xnu-3789.1.32.tar.gz
[apple/xnu.git] / osfmk / kern / timer_queue.h
index 3975b31015c034fbea258fbdb84b0ea6ac3b4688..879a311fd493141fb44d0eb02b3ba4763bcab7ce 100644 (file)
 
 #include <kern/queue.h>
 
+/* Kernel trace events associated with timers and timer queues */
+#define DECR_TRAP_LATENCY      MACHDBG_CODE(DBG_MACH_EXCP_DECI, 0)
+#define DECR_SET_DEADLINE      MACHDBG_CODE(DBG_MACH_EXCP_DECI, 1)
+#define DECR_TIMER_CALLOUT     MACHDBG_CODE(DBG_MACH_EXCP_DECI, 2)
+#define DECR_PM_DEADLINE       MACHDBG_CODE(DBG_MACH_EXCP_DECI, 3)
+#define DECR_TIMER_MIGRATE     MACHDBG_CODE(DBG_MACH_EXCP_DECI, 4)
+#if defined(i386) || defined(x86_64)
+#define DECR_RDHPET            MACHDBG_CODE(DBG_MACH_EXCP_DECI, 5)
+#define DECR_SET_TSC_DEADLINE  MACHDBG_CODE(DBG_MACH_EXCP_DECI, 6)
+#define DECR_SET_APIC_DEADLINE MACHDBG_CODE(DBG_MACH_EXCP_DECI, 16)
+#endif
+#define DECR_TIMER_ENTER       MACHDBG_CODE(DBG_MACH_EXCP_DECI, 7)
+#define DECR_TIMER_CANCEL      MACHDBG_CODE(DBG_MACH_EXCP_DECI, 8)
+#define DECR_TIMER_QUEUE       MACHDBG_CODE(DBG_MACH_EXCP_DECI, 9)
+#define DECR_TIMER_EXPIRE      MACHDBG_CODE(DBG_MACH_EXCP_DECI,10)
+#define DECR_TIMER_ASYNC_DEQ   MACHDBG_CODE(DBG_MACH_EXCP_DECI,11)
+#define DECR_TIMER_UPDATE      MACHDBG_CODE(DBG_MACH_EXCP_DECI,12)
+#define DECR_TIMER_ESCALATE    MACHDBG_CODE(DBG_MACH_EXCP_DECI,13)
+#define DECR_TIMER_OVERDUE     MACHDBG_CODE(DBG_MACH_EXCP_DECI,14)
+#define DECR_TIMER_RESCAN      MACHDBG_CODE(DBG_MACH_EXCP_DECI,15)
+
 /*
  *     Invoked by kernel, implemented by platform.
  */
 
 /* Request an expiration deadline, returns queue association */
-extern mpqueue_head_t *timer_queue_assign(
+extern mpqueue_head_t *        timer_queue_assign(
                                uint64_t                deadline);
 
 extern uint64_t                timer_call_slop(
-                                               uint64_t                deadline);
+                               uint64_t                deadline,
+                               uint64_t                armtime,
+                               uint32_t                urgency,
+                               thread_t                arming_thread,
+                               boolean_t               *rlimited);
+extern boolean_t       timer_resort_threshold(uint64_t);
 
 /* Cancel an associated expiration deadline and specify new deadline */
 extern void            timer_queue_cancel(
@@ -55,15 +81,74 @@ extern void         timer_queue_cancel(
                                uint64_t                deadline,
                                uint64_t                new_deadline);
 
+/* Return a pointer to the local timer queue for a given cpu */
+extern mpqueue_head_t *        timer_queue_cpu(
+                               int                     cpu);
+
+/* Call a function with argument on a cpu */
+extern void            timer_call_cpu(
+                               int                     cpu,
+                               void                    (*fn)(void *),
+                               void                    *arg);
+
+/* Queue a function to be called with argument on a cpu */
+extern void            timer_call_nosync_cpu(
+                               int                     cpu,
+                               void                    (*fn)(void *),
+                               void                    *arg);
+
 /*
  *     Invoked by platform, implemented by kernel.
  */
 
+/*
+ *     Invoked by kernel, implemented by platform.
+ */
+
+#define NUM_LATENCY_QOS_TIERS (6)
+
+typedef struct {
+       uint32_t idle_entry_timer_processing_hdeadline_threshold_ns;
+       uint32_t interrupt_timer_coalescing_ilat_threshold_ns;
+       uint32_t timer_resort_threshold_ns;
+
+       int32_t timer_coalesce_rt_shift;
+       int32_t timer_coalesce_bg_shift;
+       int32_t timer_coalesce_kt_shift;
+       int32_t timer_coalesce_fp_shift;
+       int32_t timer_coalesce_ts_shift;
+
+       uint64_t timer_coalesce_rt_ns_max;
+       uint64_t timer_coalesce_bg_ns_max;
+       uint64_t timer_coalesce_kt_ns_max;
+       uint64_t timer_coalesce_fp_ns_max;
+       uint64_t timer_coalesce_ts_ns_max;
+
+       uint32_t latency_qos_scale[NUM_LATENCY_QOS_TIERS];
+       uint64_t latency_qos_ns_max[NUM_LATENCY_QOS_TIERS];
+       boolean_t latency_tier_rate_limited[NUM_LATENCY_QOS_TIERS];
+} timer_coalescing_priority_params_ns_t;
+
+extern timer_coalescing_priority_params_ns_t * timer_call_get_priority_params(void);
+
+
+extern uint64_t                timer_call_slop(
+       uint64_t                deadline,
+       uint64_t                armtime,
+       uint32_t                urgency,
+       thread_t                arming_thread,
+       boolean_t               *rlimited);
+
 /* Process deadline expiration for queue, returns new deadline */
 extern uint64_t                timer_queue_expire(
                                mpqueue_head_t          *queue,
                                uint64_t                deadline);
 
+extern uint64_t                timer_queue_expire_with_options(
+                               mpqueue_head_t *,
+                               uint64_t,
+                               boolean_t);
+
 /* Shutdown a timer queue and reassign existing activities */
 extern void            timer_queue_shutdown(
                                mpqueue_head_t          *queue);
@@ -73,6 +158,32 @@ extern int          timer_queue_migrate(
                                mpqueue_head_t          *from,
                                mpqueue_head_t          *to);
 
+/*
+ *     Invoked by platform, implemented by platfrom.
+ */
+
+extern void            timer_intr(int inuser, uint64_t iaddr);
+
+#if defined(i386) || defined(x86_64)
+extern uint64_t                setPop(uint64_t time);
+#else
+extern int             setPop(uint64_t time);
+#endif
+
+extern void            timer_resync_deadlines(void);
+
+extern void            timer_set_deadline(uint64_t deadline);
+
+/* Migrate the local timer queue of a given cpu to the master cpu */
+extern uint32_t                timer_queue_migrate_cpu(int target_cpu);
+
+extern void            timer_queue_trace(
+                               mpqueue_head_t          *queue);
+extern void            timer_queue_trace_cpu(int cpu);
+
+extern uint64_t                timer_sysctl_get(int oid);
+extern int             timer_sysctl_set(int oid, uint64_t value);
+
 #endif /* MACH_KERNEL_PRIVATE */
 
 #endif /* _KERN_TIMER_QUEUE_H_ */