总结
创建调度器配置文件。
声明
#include <zircon/syscalls.h>
zx_status_t zx_profile_create(zx_handle_t profile_rsrc,
uint32_t options,
const zx_profile_info_t* profile,
zx_handle_t* out);
说明
zx_profile_create()
用于创建新的 profile 对象。
参数 profile 指定配置文件中的设置,该设置反过来会在调用 zx_object_set_profile()
时应用于线程。profile 的字段如下所示。options 必须为零。
#define ZX_PROFILE_INFO_FLAG_PRIORITY (1 << 0)
#define ZX_PROFILE_INFO_FLAG_CPU_MASK (1 << 1)
#define ZX_PROFILE_INFO_FLAG_DEADLINE (1 << 2)
#define ZX_PROFILE_INFO_FLAG_NO_INHERIT (1 << 3)
#define ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY (1 << 4)
typedef struct zx_profile_info {
// A bitmask of ZX_PROFILE_INFO_FLAG_* values. Controls overall profile
// options as well as determining which other fields below have been specified.
// Other fields are considered unset.
uint32_t flags;
uint8_t padding1[4];
union {
struct {
// Scheduling priority. |flags| must have ZX_PROFILE_INFO_FLAG_PRIORITY or
// ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY set.
int32_t priority;
uint8_t padding2[20];
};
// Scheduling deadline. |flags| must have ZX_PROFILE_INFO_FLAG_DEADLINE set.
zx_sched_deadline_params_t deadline_params;
};
// CPUs that threads may be scheduled on. |flags| must have
// ZX_PROFILE_INFO_FLAG_CPU_MASK set.
zx_cpu_set_t cpu_affinity_mask;
} zx_profile_info_t;
除了指定 zx_profile_info_t
结构中的哪些字段包含有效值之外,flags
字段还可控制整体个人资料选项。系统会忽略未设置相应 flag
位的字段中的值。这样就可以区分值为 0
和未设置的字段,即使将来会添加其他字段,也是如此。
ZX_PROFILE_INFO_FLAG_PRIORITY
和 ZX_PROFILE_INFO_FLAG_DEADLINE
为配置文件指定 scheduling discipline
:“公平调度”(针对 PRIORITY
)或“截止时间安排”(针对 DEADLINE
)。不能同时选择多个学科。
ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY
允许创建可应用于 VMAR 的配置文件,并且与调度相关的任何标志都不兼容。在选择内存优先级时,只有 ZX_PRIORITY_DEFAULT
和 ZX_PRIORITY_HIGH
目前有意义,其中前者是所有 VMAR 最初拥有的默认值,后者表示应避免对应用了该配置文件的对象执行所有内核发起的回收。
默认情况下,如果个人资料被分配给一个在 futex 中分配了所有者的 futex 阻塞的线程,则会参与个人资料继承(请参阅 zx_futex_wait()
)。使用 ZX_PROFILE_INFO_FLAG_NO_INHERIT
创建的配置文件不会参与个人资料继承。当在与所有者的 futex 中分配有此类配置文件块的线程时,Futex 的所有者不会从阻塞线程收到直接的配置文件压力(但是,它们可能会收到来自阻塞线程后面的其他线程的压力)。
截止日期个人资料必须始终可沿用。尝试创建不可继承的截止期限配置文件将失败并显示 ZX_ERR_INVALID_ARGS。
成功后,将返回新个人资料的句柄。
权限
profile_rsrc 必须具有基本 ZX_RSRC_SYSTEM_PROFILE_BASE
资源种类 ZX_RESOURCE_KIND_SYSTEM
。
调用方作业政策必须允许 ZX_POL_NEW_PROFILE
。
返回值
成功后,返回 ZX_OK
和新个人资料的句柄(通过 out)。如果失败,则返回负的错误值。
错误
ZX_ERR_BAD_HANDLE
profile_rsrc 不是有效的句柄。
ZX_ERR_ACCESS_DENIED
profile_rsrc 不是配置文件资源。
ZX_ERR_INVALID_ARGS
提供的一个或多个参数无效:
- profile 或 out 是无效的指针
- flags 包含未知选项
- flags 未指定调度规则、CPU 亲和性掩码或内存优先级。
- flags 一次性指定了多个时间安排规则。
- flags 将时间安排规则指定为截止期限,但配置文件也被标记为“不继承”。
- flags 指定调度规则和内存优先级。
- options 不为零
- “Priority”是无效的优先级
ZX_ERR_NO_MEMORY
:因内存不足而失败。