xref: /kernel/uniproton/src/include/uapi/prt_cpup.h (revision 54568cb3)
1/*
2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *          http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2009-12-22
13 * Description: CPU占用率模块对外头文件。
14 */
15#ifndef PRT_CPUP_H
16#define PRT_CPUP_H
17
18#include "prt_buildef.h"
19#include "prt_module.h"
20#include "prt_errno.h"
21
22#ifdef __cplusplus
23#if __cplusplus
24extern "C" {
25#endif /* __cpluscplus */
26#endif /* __cpluscplus */
27
28/*
29 * CPUP错误码:参数(CPUP告警阈值)设定不在规定范围(0,10000]。
30 *
31 * 值: 0x02000601
32 *
33 * 解决方案: CPUP告警阈值设定在规定范围(0,10000]内。
34 */
35#define OS_ERRNO_CPUP_INTERVAL_NOT_SUITED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x01)
36
37/*
38 * CPUP错误码:指针参数为NULL。
39 *
40 * 值: 0x02000602
41 *
42 * 解决方案: 传入非0的有效地址。
43 */
44#define OS_ERRNO_CPUP_PTR_NULL OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x02)
45
46/*
47 * CPUP错误码:恢复阈值设定不小于告警阈值。
48 *
49 * 值: 0x02000603
50 *
51 * 解决方案: 恢复阈值小于告警阈值。
52 */
53#define OS_ERRNO_CPUP_RESUME_NOT_SUITED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x03)
54
55/*
56 * CPUP错误码:CPUP初始化申请内存失败。
57 *
58 * 值: 0x02000604
59 *
60 * 解决方案: 确认缺省静态内存是否足够,以及采样个数(参见配置宏OS_CPUP_SAMPLE_RECORD_NUM)是否过大。
61 */
62#define OS_ERRNO_CPUP_NO_MEMORY OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x04)
63
64/*
65 * CPUP错误码:在osStart之前调用CPUP模块相关功能接口。
66 *
67 * 值: 0x02000605
68 *
69 * 解决方案: 调用CPUP模块功能接口时,请查看是否在osStart之后。
70 */
71#define OS_ERRNO_CPUP_OS_NOT_STARTED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x05)
72
73/*
74 * CPUP错误码:CPUP采样时间间隔为0。
75 *
76 * 值: 0x02000606
77 *
78 * 解决方案: 系统级CPUP设置采样时间间隔必须大于0,当CPUP告警功能打开时,线程级CPUP采样时间间隔也必须大于0。
79 */
80#define OS_ERRNO_CPUP_SAMPLE_TIME_ZERO OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x06)
81
82/*
83 * CPUP错误码:CPUP功能开关未打开或者未初始化时,获取CPUP、设置告警阈值或者补偿IDLE钩子执行时间。
84 *
85 * 值: 0x02000607
86 *
87 * 解决方案: 需保证在打开功能开关,在osStart之后才能获取CPUP、设置告警阈值或者补偿IDLE钩子执行时间。
88 */
89#define OS_ERRNO_CPUP_NOT_INITED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x07)
90
91/*
92 * CPUP错误码:使用获取线程级所有线程的CPUP接口时,输入的线程数为0。
93 *
94 * 值: 0x02000608
95 *
96 * 解决方案: 使用获取线程级所有线程的CPUP接口时,输入的线程数必须大于0
97 */
98#define OS_ERRNO_CPUP_THREAD_INNUM_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x08)
99
100/*
101 * CPUP错误码:CPUP告警恢复及CPUP告警阈值配置错误。
102 *
103 * 值: 0x02000609
104 *
105 * 解决方案: CPUP告警阈值设定应该小于CPUP告警恢复阈值。
106 */
107#define OS_ERRNO_CPUP_RESUME_VALUE_ERROR OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x09)
108
109/*
110 * CPU占用率告警标志。
111 */
112#define CPUP_INFO_TYPE_OVERLOAD 0x01
113
114/*
115 * CPU占用率恢复告警标志。
116 */
117#define CPUP_INFO_TYPE_RECONVERT 0x02
118
119/*
120 * 设置cpu占用率的注册信息结构体。
121 */
122struct CpupModInfo {
123    /* CPUP告警标志 */
124    bool cpupWarnFlag;
125    /* 采样间隔,单位tick */
126    U32 sampleTime;
127    /* CPU占用率告警阈值 */
128    U32 warn;
129    /* CPU占用率告警恢复阈值 */
130    U32 resume;
131};
132
133/*
134 * CPUP告警信息。
135 */
136struct CpupWarnInfo {
137    /* CPU占用率告警信息类型 */
138    U16 type;
139    /* 保留 */
140    U16 reserve;
141};
142
143/*
144 * @brief CPUP告警回调函数类型定义。
145 *
146 * @par 描述
147 * 通过该回调函数的类型定义回调函数钩子。
148 * @attention 无
149 *
150 * @param  #struct CpupWarnInfo*   [IN] 类型#struct CpupWarnInfo*,CPUP告警信息。
151 *
152 * @retval 无。
153 * @par 依赖
154 * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
155 * @see 无。
156 */
157typedef void (*CpupHookFunc)(struct CpupWarnInfo *);
158
159/*
160 * 线程级CPU占用率结构体。
161 */
162struct CpupThread {
163    /* 线程ID */
164    U32 id;
165    /* 占用率,取值[0,10000] */
166    U16 usage;
167    /* 保留 */
168    U16 resv;
169};
170
171/*
172 * @brief 获取当前cpu占用率。
173 *
174 * @par 描述
175 * 通过本接口获取当前cpu占用率。
176 * @attention
177 * <ul>
178 * <li>该接口必须在CPUP模块裁剪开关打开,并在osStart之后才能调用此接口,否则返回0xffffffff。</li>
179 * <li>精度为万分之一。</li>
180 * <li>为了减小CPUP统计对线程调度的性能影响,OS采用了基于IDLE计数的统计算法,
181 * 统计结果会有一定误差,误差不超过百分之五。</li>
182 * </ul>
183 *
184 * @param 无。
185 *
186 * @retval #0xffffffff      获取失败,CPUP裁剪开关未打开,或未初始化,或者在osStart之前调用。
187 * @retval #[0,10000]       返回当前cpu占用率。
188 * @par 依赖
189 * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
190 * @see PRT_CpupAvg | PRT_CpupThread
191 */
192extern U32 PRT_CpupNow(void);
193
194/*
195 * @brief 获取指定个数的线程的CPU占用率。
196 *
197 * @par 描述
198 * 根据用户输入的线程个数,获取指定个数的线程CPU占用率。
199 * @attention
200 * <ul>
201 * <li>当且仅当CPUP模式配置为线程级时,该接口有效。</li>
202 * <li>当配置项中的采样周期值等于0时,线程级CPUP采样周期为两次调用该接口或者PRT_CpupNow之间
203 * 的间隔。否则,线程级CPUP采样周期为配置项中的OS_CPUP_SAMPLE_INTERVAL大小。</li>
204 * <li>输出的实际线程个数不大于系统中实际的线程个数(任务个数和一个中断线程)。</li>
205 * <li>若输入的线程个数为1,则仅输出中断线程(除任务线程以外的线程统称)的CPUP信息。</li>
206 * <li>若在一个采样周期内有任务被删除,则统计的任务线程和中断线程CPUP总和小于10000。</li>
207 * </ul>
208 *
209 * @param inNum  [IN]  类型#U32,输入的线程个数。
210 * @param cpup   [OUT] 类型#struct CpupThread *,缓冲区,输出参数,用于填写输出个数线程的CPUP信息。
211 * @param outNum [OUT] 类型#U32 *,保存输出的实际线程个数指针。
212 *
213 * @retval #OS_OK  0x00000000,获取成功。
214 * @retval #其它值,获取失败。
215 * @par 依赖
216 * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
217 * @see PRT_CpupNow
218 */
219extern U32 PRT_CpupThread(U32 inNum, struct CpupThread *cpup, U32 *outNum);
220
221#if defined(OS_OPTION_CPUP_WARN)
222/*
223 * @brief 设置CPU占用率告警阈值。
224 *
225 * @par 描述
226 * 根据用户配置的CPU占用率告警阈值warn和告警恢复阈值resume,设置告警和恢复阈值。
227 * @attention
228 * <ul>
229 * <li>OsStart之前不能调用此接口。</li>
230 * </ul>
231 *
232 * @param warn   [IN]  类型#U32,CPUP告警阈值。
233 * @param resume [IN]  类型#U32,CPUP恢复阈值。
234 *
235 * @retval #OS_OK  0x00000000,阈值设定成功。
236 * @retval #其它值,阈值设定失败。
237 * @par 依赖
238 * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
239 * @see PRT_CpupGetWarnValue
240 */
241extern U32 PRT_CpupSetWarnValue(U32 warn, U32 resume);
242
243/*
244 * @brief 查询CPUP告警阈值和告警恢复阈值
245 *
246 * @par 描述
247 * 根据用户配置的告警阈值指针warn和告警恢复阈值指针resume,查询告警阈值和告警恢复阈值
248 * @attention
249 * <ul>
250 * <li>OsStart之前不能调用此接口。</li>
251 * </ul>
252 *
253 * @param warn   [OUT] 类型#U32 *,CPUP告警阈值。
254 * @param resume [OUT] 类型#U32 *,CPUP恢复阈值。
255 *
256 * @retval #OS_OK  0x00000000,获取成功。
257 * @retval #其它值,获取失败。
258 * @par 依赖
259 * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
260 * @see PRT_CpupSetWarnValue
261 */
262extern U32 PRT_CpupGetWarnValue(U32 *warn, U32 *resume);
263
264/*
265 * @brief 注册CPUP告警回调函数
266 *
267 * @par 描述
268 * 根据用户配置的回调函数hook,注册CPUP告警回调函数
269 * @attention
270 * <ul>
271 * <li>不允许重复或覆盖注册钩子。</li>
272 * <li>hook为NULL时,表示删除该钩子。</li>
273 * </ul>
274 *
275 * @param hook [IN]  类型#CpupHookFunc,CPU告警回调函数。
276 *
277 * @retval #OS_OK  0x00000000,注册成功。
278 * @retval #其它值,注册失败。
279 * @par 依赖
280 * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
281 * @see 无。
282 */
283extern U32 PRT_CpupRegWarnHook(CpupHookFunc hook);
284#endif
285
286#ifdef __cplusplus
287#if __cplusplus
288}
289#endif /* __cpluscplus */
290#endif /* __cpluscplus */
291
292#endif /* PRT_CPUP_H */
293