xref: /xnu-8792.81.2/osfmk/kern/workload_config.h (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1 /*
2  * Copyright (c) 2021 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
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.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
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
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
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.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #include <stdint.h>
30 #include <sys/queue.h>
31 #include <sys/work_interval.h>
32 #include <kern/work_interval.h>
33 
34 #pragma once
35 
36 #ifdef XNU_KERNEL_PRIVATE
37 
38 OS_ASSUME_NONNULL_BEGIN
39 
40     __BEGIN_DECLS
41 
42 typedef struct workload_config_ctx workload_config_ctx_t;
43 
44 extern workload_config_ctx_t workload_config_boot;
45 #if DEVELOPMENT || DEBUG
46 extern workload_config_ctx_t workload_config_devel;
47 #endif
48 
49 #define WORKLOAD_CONFIG_ID_NAME_MAX WORK_INTERVAL_WORKLOAD_ID_NAME_MAX
50 
51 typedef struct workload_config {
52 	uint32_t   wc_thread_group_flags;
53 	uint32_t   wc_flags;
54 	uint32_t   wc_create_flags;
55 	uint8_t    wc_class_offset;
56 	wi_class_t wc_class;
57 } workload_config_t;
58 
59 typedef enum {
60 	WLC_F_NONE          = 0,
61 	WLC_F_THREAD_POLICY = 1, // By default set for new workload configs.
62 } workload_config_flags_t;
63 
64 /*!
65  * @function   workload_config_init
66  * @abstract   Allocate global workload data structures.
67  * @param      ctx     Configuration context
68  * @result     KERN_SUCCESS on success or error.
69  */
70 extern kern_return_t workload_config_init(workload_config_ctx_t *ctx);
71 
72 /*!
73  * @function   workload_config_initialized
74  * @abstract   Tests whether or not a config context has been initialized
75  * @param      ctx     Configuration context
76  * @result     true if initialized, false if not
77  */
78 extern bool workload_config_initialized(const workload_config_ctx_t *ctx);
79 
80 /*!
81  * @function   workload_config_free
82  * @abstract   Free global workload data structures.
83  */
84 extern void workload_config_free(workload_config_ctx_t *ctx);
85 
86 /*!
87  * @function   workload_config_insert
88  * @abstract   Insert a new workload configuration
89  * @param      ctx     Configuration context
90  * @param      id     Workload identifier
91  * @param      phase  Phase assoicated with this config
92  * @param      config Configuration
93  * @result     KERN_SUCCESS on success or error.
94  */
95 extern kern_return_t workload_config_insert(workload_config_ctx_t *ctx,
96     const char *id, const char *phase, const workload_config_t *config);
97 
98 /*!
99  * @function   workload_config_set_default
100  * @abstract   Set the default phase for the specified workload ID
101  * @param      ctx     Configuration context
102  * @param      id     Workload identifier
103  * @param      phase  The new default phase
104  * @result     KERN_SUCCESS on success or error.
105  * @discussion The configuration for the specified phase must already exist.
106  */
107 extern kern_return_t workload_config_set_default(workload_config_ctx_t *ctx,
108     const char *id, const char *phase);
109 
110 /*!
111  * @function   workload_config_lookup
112  * @abstract   Find per phase workload configuration
113  * @param      id     Workload identifier
114  * @param      phase  Phase assoicated with this config
115  * @param      config Returned configuration
116  * @result     KERN_SUCCESS on success or error.
117  */
118 extern kern_return_t workload_config_lookup(const char *id, const char *phase,
119     workload_config_t *config);
120 
121 /*!
122  * @function   workload_config_lookup_default
123  * @abstract   Find the default phase workload configuration
124  * @param      id     Workload identifier
125  * @param      config Returned configuration
126  * @result     KERN_SUCCESS on success or error.
127  */
128 extern kern_return_t workload_config_lookup_default(const char *id,
129     workload_config_t *config);
130 
131 /*!
132  * @function   workload_config_iterate
133  * @abstract   Iterate over the active workload configuration
134  * @param      cb     Block called per ID
135  * @discussion If cb returns true, the iteration stops.
136  *             The phases argument can be passed into workload_config_iterate_phases.
137  */
138 extern void workload_config_iterate(bool (^cb)(const char *id,
139     const void *phases));
140 
141 /*!
142  * @function   workload_config_iterate_phase
143  * @abstract   Iterate over the phases in a workload configuration
144  * @param      phases Phase configuration to iterate over
145  * @param      cb     Block called per phase
146  * @discussion If cb returns true, the iteration stops.
147  *             This must always be called from a workload_config_iterate block.
148  */
149 extern void workload_config_phases_iterate(const void *phases,
150     bool (^cb)(const char *phase, const bool is_default,
151     const workload_config_t *config));
152 
153 /*!
154  * @function   workload_config_get_flags
155  * @abstract   Read the workload config flags
156  * @param      flags     Returns set flags
157  * @result     KERN_SUCCESS on success or error.
158  */
159 extern kern_return_t workload_config_get_flags(workload_config_flags_t *flags);
160 
161 /*!
162  * @function   workload_config_clear_flag
163  * @abstract   Clear a workload config flag
164  * @param      ctx     Configuration context
165  * @param      flag    Flag to be cleared
166  * @result     KERN_SUCCESS on success or error.
167  */
168 extern kern_return_t workload_config_clear_flag(workload_config_ctx_t *ctx,
169     workload_config_flags_t flag);
170 
171 /*!
172  * @function   workload_config_available
173  * @abstract   See if a workload configuration is available
174  * @result     KERN_SUCCESS on success or error.
175  * @discussion Note: this can be racy on kernels that support dynamically
176  *             setting and clearing workload configuration.
177  */
178 extern bool workload_config_available(void);
179 
180 __END_DECLS
181 
182     OS_ASSUME_NONNULL_END
183 
184 #endif /* XNU_KERNEL_PRIVATE */
185