From b9e8fdb0057941a0b0bf445451360e8be61ae833 Mon Sep 17 00:00:00 2001 From: Kirtana Ashok Date: Fri, 7 Jun 2024 12:41:20 -0700 Subject: [PATCH] Add support for windows CPU affinity Signed-off-by: Kirtana Ashok --- config-windows.md | 8 ++++++++ schema/config-windows.json | 11 +++++++++++ specs-go/config.go | 11 +++++++++++ 3 files changed, 30 insertions(+) diff --git a/config-windows.md b/config-windows.md index 73a6d639e..037321a61 100644 --- a/config-windows.md +++ b/config-windows.md @@ -82,6 +82,14 @@ The following parameters can be specified (mutually exclusive): * **`count`** *(uint64, OPTIONAL)* - specifies the number of CPUs available to the container. It represents the fraction of the configured processor `count` in a container in relation to the processors available in the host. The fraction ultimately determines the portion of processor cycles that the threads in a container can use during each scheduling interval, as the number of cycles per 10,000 cycles. * **`shares`** *(uint16, OPTIONAL)* - limits the share of processor time given to the container relative to other workloads on the processor. The processor `shares` (`weight` at the platform level) is a value between 0 and 10,000. * **`maximum`** *(uint16, OPTIONAL)* - determines the portion of processor cycles that the threads in a container can use during each scheduling interval, as the number of cycles per 10,000 cycles. Set processor `maximum` to a percentage times 100. +* **`affinity`** *(array of objects, OPTIONAL)* - specifies the set of CPU to affinitize for this container. + + Each entry has the following structure: + + Ref: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/miniport/ns-miniport-_group_affinity + + * **`mask`** *(uint64, REQUIRED)* - specifies the CPU mask relative to this CPU group. + * **`group`** *(uint32, REQUIRED)* - specifies the processor group this mask refers to, as returned by GetLogicalProcessorInformationEx. Ref: https://docs.microsoft.com/en-us/virtualization/api/hcs/schemareference#Container_Processor diff --git a/schema/config-windows.json b/schema/config-windows.json index 68b51e902..7cc1594f0 100644 --- a/schema/config-windows.json +++ b/schema/config-windows.json @@ -38,6 +38,17 @@ }, "maximum": { "$ref": "defs.json#/definitions/uint16" + }, + "affinity": { + "type": "object", + "properties": { + "mask": { + "$ref": "defs.json#/definitions/uint64" + }, + "group": { + "$ref": "defs.json#/definitions/uint32" + } + } } } }, diff --git a/specs-go/config.go b/specs-go/config.go index c44346740..cf810cc04 100644 --- a/specs-go/config.go +++ b/specs-go/config.go @@ -635,6 +635,17 @@ type WindowsCPUResources struct { // cycles per 10,000 cycles. Set processor `maximum` to a percentage times // 100. Maximum *uint16 `json:"maximum,omitempty"` + // Set of CPUs to affinitize for this container. + Affinity []WindowsCPUGroupAffinity `json:"affinity,omitempty"` +} + +// Similar to _GROUP_AFFINITY struct defined in +// https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/miniport/ns-miniport-_group_affinity +type WindowsCPUGroupAffinity struct { + // CPU mask relative to this CPU group. + Mask uint64 `json:"mask,omitempty"` + // Processor group the mask refers to, as returned by GetLogicalProcessorInformationEx. + Group uint32 `json:"group,omitempty"` } // WindowsStorageResources contains storage resource management settings.