| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| library zx; |
| |
| type ProfileInfoType = strict enum { |
| ZX_PROFILE_INFO_SCHEDULER = 1; |
| }; |
| |
| type ProfileScheduler = strict union { |
| 1: priority int32; |
| 2: boost uint32; |
| 3: deboost uint32; |
| 4: quantum uint32; |
| }; |
| |
| const ZX_PRIORITY_LOWEST int32 = 0; |
| const ZX_PRIORITY_LOW int32 = 8; |
| const ZX_PRIORITY_DEFAULT int32 = 16; |
| const ZX_PRIORITY_HIGH int32 = 24; |
| const ZX_PRIORITY_HIGHEST int32 = 31; |
| |
| type ProfileInfoData = strict union { |
| 1: scheduler ProfileScheduler; |
| }; |
| |
| type ProfileInfo = struct { |
| type ProfileInfoType; |
| // TODO(scottmg): This needs to be presented as an unnamed union in C, and |
| // ProfileInfoData doesn't really need a name. Not sure if the semantics of |
| // fidl unions make sense here. |
| unnamed ProfileInfoData; |
| }; |
| |
| @transport("Syscall") |
| closed protocol Profile { |
| /// ## Summary |
| /// |
| /// Create a scheduler profile. |
| /// |
| /// ## Declaration |
| /// |
| /// ```c |
| /// #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); |
| /// ``` |
| /// |
| /// ## Description |
| /// |
| /// `zx_profile_create()` creates a new [profile](/docs/reference/kernel_objects/profile.md) object. |
| /// |
| /// The parameter *profile* specifies the settings in the profile, which in turn |
| /// will be applied to threads when [`zx_object_set_profile()`] is called. The |
| /// fields of *profile* are shown below. *options* must be zero. |
| /// |
| /// ```c |
| /// #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; |
| /// ``` |
| /// |
| /// The `flags` field controls overall profile options in addition to specifying |
| /// which fields in the `zx_profile_info_t` structure contain valid values. Values |
| /// in fields without a corresponding `flag` bit set will be ignored. This allows |
| /// fields with values of `0` and unset fields to be distinguished, even if |
| /// additional fields are added in future. |
| /// |
| /// `ZX_PROFILE_INFO_FLAG_PRIORITY` and `ZX_PROFILE_INFO_FLAG_DEADLINE` specify the |
| /// `scheduling discipline` for the profile, either "fair scheduling" (for |
| /// `PRIORITY`) or "deadline scheduling" (for `DEADLINE`. No more than one of these |
| /// disciplines may be selected at the same time. |
| /// |
| /// `ZX_PROFILE_INFO_FLAG_MEMORY_PRIORITY` allows for creating a profile that can be applied to |
| /// VMARs and is incompatible with any flags related scheduling. When selecting a memory |
| /// priority only `ZX_PRIORITY_DEFAULT` and `ZX_PRIORITY_HIGH` currently have meaning, with the |
| /// former being the default all VMARs initially have, and the latter indicating that all kernel |
| /// initiated reclamation on objects the profile is applied to should be avoided. |
| /// |
| /// By default, profiles participate in profile inheritance when assigned to a |
| /// thread which blocks in a futex with an assigned owner (see `zx_futex_wait()`). |
| /// Profiles created with the `ZX_PROFILE_INFO_FLAG_NO_INHERIT` do not. When |
| /// threads assigned with such a profile block in a futex with an owner, the |
| /// owner of the futex receives no direct profile pressure from the blocking |
| /// thread (however, they may receive pressure from a different thread |
| /// blocked behind the blocking thread). |
| /// |
| /// Deadline profiles must always be inheritable. Attempts to create a |
| /// non-inheritable deadline profile will fail with ZX_ERR_INVALID_ARGS. |
| /// |
| /// |
| /// Upon success a handle for the new profile is returned. |
| /// |
| /// ## Rights |
| /// |
| /// *profile_rsrc* must have resource kind `ZX_RESOURCE_KIND_SYSTEM` with base |
| /// `ZX_RSRC_SYSTEM_PROFILE_BASE`. |
| /// |
| /// Caller job policy must allow `ZX_POL_NEW_PROFILE`. |
| /// |
| /// ## Return value |
| /// |
| /// Returns `ZX_OK` and a handle to the new profile (via *out*) on success. In the |
| /// event of failure, a negative error value is returned. |
| /// |
| /// ## Errors |
| /// |
| /// `ZX_ERR_BAD_HANDLE` *profile_rsrc* is not a valid handle. |
| /// |
| /// `ZX_ERR_ACCESS_DENIED` *profile_rsrc* is not the profile resource. |
| /// |
| /// `ZX_ERR_INVALID_ARGS` One or more of the arguments provided were invalid: |
| /// |
| /// * *profile* or *out* was an invalid pointer |
| /// * *flags* contains an unknown option |
| /// * *flags* either failed to specify a scheduling discipline, a cpu affinity mask, or a |
| /// memory priority. |
| /// * *flags* specified more than one scheduling discipline at once. |
| /// * *flags* specified the scheduling discipline as deadline, but the profile |
| /// was also marked as "no inherit". |
| /// * *flags* specified a scheduling discipline and a memory priority. |
| /// * *options* was not zero |
| /// * *priority* was an invalid priority |
| /// |
| /// `ZX_ERR_NO_MEMORY` Failure due to lack of memory. |
| /// |
| /// ## See also |
| /// |
| /// - [`zx_object_set_profile()`] |
| /// - [`zx_futex_wait()`] |
| /// |
| /// [`zx_object_set_profile()`]: object_set_profile.md |
| /// [`zx_futex_wait()`]: futex_wait.md |
| strict Create(resource struct { |
| profile_rsrc Handle:RESOURCE; |
| options uint32; |
| profile ProfileInfo; |
| }) -> (resource struct { |
| out Handle:PROFILE; |
| }) error Status; |
| }; |