摘要
创建调度器配置文件。
声明
#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 用于指定配置文件中的设置,这些设置会在调用 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)
#define ZX_PROFILE_INFO_FLAG_CRITICAL (1 << 5)
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;
flags 字段用于控制整体配置文件选项,并指定 zx_profile_info_t 结构中的哪些字段包含有效值。系统会忽略未设置相应 flag 位的字段中的值。这样一来,即使日后添加了其他字段,也可以区分值为 0 的字段和未设置的字段。
ZX_PROFILE_INFO_FLAG_PRIORITY 和 ZX_PROFILE_INFO_FLAG_DEADLINE 用于指定配置文件的
scheduling discipline,可以是“公平调度”(适用于
PRIORITY)或“截止时间调度”(适用于 DEADLINE。您一次最多只能选择其中一种调度方式。
ZX_PROFILE_INFO_FLAG_CRITICAL 可选择修改 ZX_PROFILE_INFO_FLAG_DEADLINE,以表明截止时间代表一项关键任务,该任务应放置在单独的关键截止时间运行队列中。关键截止时间配置文件等待程序会将关键标志传播给其所阻塞的 futex 的所有者。
仅当存在 ZX_PROFILE_INFO_FLAG_DEADLINE 时有效。
ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY 允许创建可应用于 VMAR 的配置文件,并且与任何与调度相关的标志不兼容。选择内存优先级时,目前只有 ZX_PRIORITY_DEFAULT 和 ZX_PRIORITY_HIGH 有意义,前者是所有 VMAR 最初拥有的默认值,后者表示应避免对配置文件所应用的对象执行所有内核发起的回收。
默认情况下,当配置文件分配给在具有已分配所有者的 futex 中阻塞的线程时,配置文件会参与配置文件继承(请参阅 zx_futex_wait())。使用 ZX_PROFILE_INFO_FLAG_NO_INHERIT 创建的配置文件不会参与配置文件继承。 当分配了此类配置文件的线程在具有所有者的 futex 中阻塞时,futex 的所有者不会直接受到阻塞线程的配置文件压力(不过,他们可能会受到阻塞线程后面阻塞的其他线程的压力)。
截止时间配置文件必须始终可继承。 尝试创建不可继承的截止时间配置文件将失败,并显示 ZX_ERR_INVALID_ARGS。
成功后,系统会返回新配置文件的句柄。
权限
profile_rsrc 必须具有资源类型 ZX_RESOURCE_KIND_SYSTEM,且基数为
ZX_RSRC_SYSTEM_PROFILE_BASE。
调用方作业政策必须允许 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 指定了调度方式和内存优先级。
- flags 指定了关键标志,但未指定截止时间调度方式。
- options 不为零
- priority 是无效的优先级
ZX_ERR_NO_MEMORY 因内存不足而失败。