]> git.saurik.com Git - apple/xnu.git/blame - osfmk/kern/timer_call.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / osfmk / kern / timer_call.h
CommitLineData
1c79356b 1/*
c910b4d9 2 * Copyright (c) 1993-1995, 1999-2008 Apple Inc. All rights reserved.
1c79356b 3 *
2d21ac55 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
0a7de745 5 *
2d21ac55
A
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
0a7de745 14 *
2d21ac55
A
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
0a7de745 17 *
2d21ac55
A
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
8f6c56a5
A
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2d21ac55
A
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
0a7de745 25 *
2d21ac55 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
1c79356b 27 */
f427ee49 28
1c79356b 29/*
f427ee49
A
30 * The timer_call system is responsible for manipulating timers that call
31 * callbacks at a given deadline (with or without some leeway for coalescing).
32 *
33 * Call timer_call_setup once on a timer_call structure to register the callback
34 * function and a context parameter that's passed to it (param0).
35 *
36 * To arm the timer to fire at a deadline, call any of the timer_call_enter
37 * functions. If the function used accepts a parameter, it will be passed to
38 * the callback function when it fires.
39 *
40 * If the timer needs to be cancelled (like if the timer_call has been armed but
41 * now needs to be deallocated), call timer_call_cancel.
1c79356b
A
42 */
43
44#ifndef _KERN_TIMER_CALL_H_
45#define _KERN_TIMER_CALL_H_
46
1c79356b 47#include <mach/mach_types.h>
39236c6e 48#include <kern/kern_types.h>
1c79356b 49
39236c6e 50#ifdef XNU_KERNEL_PRIVATE
1c79356b 51
fe8ab488 52#include <kern/simple_lock.h>
6d2010ae 53
39236c6e
A
54#ifdef MACH_KERNEL_PRIVATE
55#include <kern/queue.h>
f427ee49 56#include <kern/priority_queue.h>
0a7de745 57#include <kern/mpqueue.h>
39236c6e
A
58
59extern boolean_t mach_timer_coalescing_enabled;
60extern void timer_call_queue_init(mpqueue_head_t *);
f427ee49
A
61#endif /* MACH_KERNEL_PRIVATE */
62
63#if XNU_TARGET_OS_OSX
64#define TIMER_TRACE 1
39236c6e
A
65#endif
66
f427ee49
A
67typedef void *timer_call_param_t;
68typedef void (*timer_call_func_t)(
69 timer_call_param_t param0,
70 timer_call_param_t param1);
71
6d2010ae 72typedef struct timer_call {
f427ee49
A
73 uint64_t tc_soft_deadline;
74 decl_simple_lock_data(, tc_lock); /* protects tc_queue */
75 struct priority_queue_entry_deadline tc_pqlink;
76 queue_head_t *tc_queue;
77 queue_chain_t tc_qlink;
78 timer_call_func_t tc_func;
79 timer_call_param_t tc_param0;
80 timer_call_param_t tc_param1;
81 uint64_t tc_ttd; /* Time to deadline at creation */
82#if TIMER_TRACE
83 uint64_t tc_entry_time;
84#endif
85 uint32_t tc_flags;
86 /* this field is locked by the lock in the object tc_queue points at */
87 bool tc_async_dequeue;
39236c6e
A
88} timer_call_data_t, *timer_call_t;
89
0a7de745 90#define EndOfAllTime 0xFFFFFFFFFFFFFFFFULL
39236c6e 91
39236c6e
A
92
93/*
94 * Flags to alter the default timer/timeout coalescing behavior
95 * on a per-timer_call basis.
96 *
97 * The SYS urgency classes indicate that the timer_call is not
98 * directly related to the current thread at the time the timer_call
99 * is entered, so it is ignored in the calculation entirely (only
100 * the subclass specified is used).
101 *
102 * The USER flags indicate that both the current thread scheduling and QoS
103 * attributes, in addition to the per-timer_call urgency specification,
104 * are used to establish coalescing behavior.
105 */
0a7de745
A
106#define TIMER_CALL_SYS_NORMAL TIMEOUT_URGENCY_SYS_NORMAL
107#define TIMER_CALL_SYS_CRITICAL TIMEOUT_URGENCY_SYS_CRITICAL
108#define TIMER_CALL_SYS_BACKGROUND TIMEOUT_URGENCY_SYS_BACKGROUND
39236c6e 109
0a7de745
A
110#define TIMER_CALL_USER_MASK TIMEOUT_URGENCY_USER_MASK
111#define TIMER_CALL_USER_NORMAL TIMEOUT_URGENCY_USER_NORMAL
112#define TIMER_CALL_USER_CRITICAL TIMEOUT_URGENCY_USER_CRITICAL
113#define TIMER_CALL_USER_BACKGROUND TIMEOUT_URGENCY_USER_BACKGROUND
39236c6e 114
0a7de745 115#define TIMER_CALL_URGENCY_MASK TIMEOUT_URGENCY_MASK
39236c6e
A
116
117/*
118 * Indicate that a specific leeway value is being provided (otherwise
119 * the leeway parameter is ignored). This supplied value can currently
120 * only be used to extend the leeway calculated internally from the
121 * urgency class provided.
122 */
0a7de745 123#define TIMER_CALL_LEEWAY TIMEOUT_URGENCY_LEEWAY
39236c6e
A
124
125/*
126 * Non-migratable timer_call
127 */
0a7de745
A
128#define TIMER_CALL_LOCAL TIMEOUT_URGENCY_FIRST_AVAIL
129#define TIMER_CALL_RATELIMITED TIMEOUT_URGENCY_RATELIMITED
130extern boolean_t timer_call_enter(
131 timer_call_t call,
132 uint64_t deadline,
133 uint32_t flags);
134
135extern boolean_t timer_call_enter1(
136 timer_call_t call,
137 timer_call_param_t param1,
138 uint64_t deadline,
139 uint32_t flags);
140
141extern boolean_t timer_call_enter_with_leeway(
142 timer_call_t call,
143 timer_call_param_t param1,
144 uint64_t deadline,
145 uint64_t leeway,
146 uint32_t flags,
147 boolean_t ratelimited);
148
0a7de745
A
149extern boolean_t timer_call_cancel(
150 timer_call_t call);
151
0a7de745
A
152extern void timer_call_setup(
153 timer_call_t call,
154 timer_call_func_t func,
155 timer_call_param_t param0);
9bccf70c 156
fe8ab488
A
157extern int timer_get_user_idle_level(void);
158extern kern_return_t timer_set_user_idle_level(int ilevel);
159
160#define NUM_LATENCY_QOS_TIERS (6)
161typedef struct {
162 uint32_t powergate_latency_abstime;
163
164 uint32_t idle_entry_timer_processing_hdeadline_threshold_abstime;
165 uint32_t interrupt_timer_coalescing_ilat_threshold_abstime;
166 uint32_t timer_resort_threshold_abstime;
167
168 int32_t timer_coalesce_rt_shift;
169 int32_t timer_coalesce_bg_shift;
170 int32_t timer_coalesce_kt_shift;
171 int32_t timer_coalesce_fp_shift;
172 int32_t timer_coalesce_ts_shift;
173
174 uint64_t timer_coalesce_rt_abstime_max;
175 uint64_t timer_coalesce_bg_abstime_max;
176 uint64_t timer_coalesce_kt_abstime_max;
177 uint64_t timer_coalesce_fp_abstime_max;
178 uint64_t timer_coalesce_ts_abstime_max;
179
180 uint32_t latency_qos_scale[NUM_LATENCY_QOS_TIERS];
181 uint64_t latency_qos_abstime_max[NUM_LATENCY_QOS_TIERS];
182 boolean_t latency_tier_rate_limited[NUM_LATENCY_QOS_TIERS];
183} timer_coalescing_priority_params_t;
184extern timer_coalescing_priority_params_t tcoal_prio_params;
185
f427ee49
A
186/*
187 * Initialize the timer call subsystem during system startup.
188 */
189extern void timer_call_init(void);
190
191#if MACH_KERNEL_PRIVATE
192
193/*
194 * Handle deadlines in the past.
195 */
196uint64_t timer_call_past_deadline_timer_handle(uint64_t deadline,
197 uint64_t ctime);
198
199/*
200 * Running timers are only active for a given CPU when a non-idle thread
201 * is running.
202 */
203
204enum running_timer {
205 RUNNING_TIMER_QUANTUM,
206#if KPERF
207 RUNNING_TIMER_KPERF,
208#endif /* KPERF */
209 RUNNING_TIMER_MAX,
210};
211
212/*
213 * Get the earliest active deadline for this processor.
214 */
215uint64_t running_timers_deadline(processor_t processor);
216
217/*
218 * Run the expire handler to process any timers past their deadline. Returns
219 * true if any timer was processed, and false otherwise.
220 */
221bool running_timers_expire(processor_t processor, uint64_t now);
222
223/*
224 * Set up a new deadline for the given running timer on the processor, but don't
225 * synchronize it with the hardware. A subsequent call to running_timers_sync
226 * is necessary. This allows thread_dispatch to batch all of the setup and only
227 * set the decrementer once.
228 */
229void running_timer_setup(processor_t processor, enum running_timer timer,
230 void *param, uint64_t deadline, uint64_t now);
231
232/*
233 * Synchronize the state of any running timers that have been set up with the
234 * hardware.
235 */
236void running_timers_sync(void);
237
238/*
239 * Enter a new deadline for the given running timer on the processor and put it
240 * into effect.
241 */
242void running_timer_enter(processor_t processor, enum running_timer timer,
243 void *param, uint64_t deadline, uint64_t now);
244
245/*
246 * Clear the deadline and parameters for the given running timer on the
247 * processor.
248 */
249void running_timer_clear(processor_t processor, enum running_timer timer);
250
251/*
252 * Cancel a running timer on the processor.
253 */
254void running_timer_cancel(processor_t processor, enum running_timer timer);
255
256/*
257 * Activate the running timers for the given, current processor. Should only be
258 * called by thread_dispatch.
259 */
260void running_timers_activate(processor_t processor);
261
262/*
263 * Deactivate the running timers for the given, current processor. Should only
264 * be called by thread_dispatch.
265 */
266void running_timers_deactivate(processor_t processor);
267
268#endif /* MACH_KERNEL_PRIVATE */
269
39236c6e 270#endif /* XNU_KERNEL_PRIVATE */
1c79356b
A
271
272#endif /* _KERN_TIMER_CALL_H_ */