]> 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 050b09afac99c8f7f2d85c2e6e4210b382f58c61..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 queue_t         timer_queue_assign(
-                                               uint64_t                deadline);
+extern mpqueue_head_t *        timer_queue_assign(
+                               uint64_t                deadline);
+
+extern uint64_t                timer_call_slop(
+                               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(
-                                               queue_t                 queue,
-                                               uint64_t                deadline,
-                                               uint64_t                new_deadline);
+extern void            timer_queue_cancel(
+                               mpqueue_head_t          *queue,
+                               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(
-                                               queue_t                 queue,
-                                               uint64_t                deadline);
+                               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(
-                                               queue_t                 queue);
+extern void            timer_queue_shutdown(
+                               mpqueue_head_t          *queue);
+
+/* Move timer requests from one queue to another */
+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 */