in pkg/scheduler/plugins/numaaware/provider/cpumanager/cpu_mng.go [149:210]
func (mng *cpuMng) Allocate(container *v1.Container, bestHit *policy.TopologyHint,
topoInfo *api.NumatopoInfo, resNumaSets api.ResNumaSets) map[string]cpuset.CPUSet {
cputopo := &topology.CPUTopology{
NumCPUs: topoInfo.CPUDetail.CPUs().Size(),
NumCores: topoInfo.CPUDetail.Cores().Size() * topoInfo.CPUDetail.Sockets().Size(),
NumSockets: topoInfo.CPUDetail.Sockets().Size(),
CPUDetails: topoInfo.CPUDetail,
}
reserved := cpuset.NewCPUSet()
reservedCPUs, ok := topoInfo.ResReserved[v1.ResourceCPU]
if ok {
// Take the ceiling of the reservation, since fractional CPUs cannot be
// exclusively allocated.
reservedCPUsFloat := float64(reservedCPUs.MilliValue()) / 1000
numReservedCPUs := int(math.Ceil(reservedCPUsFloat))
reserved, _ = takeByTopology(cputopo, cputopo.CPUDetails.CPUs(), numReservedCPUs)
klog.V(3).Infof("[cpumanager] reserve cpuset :%v", reserved)
}
requestNum := guaranteedCPUs(container)
availableCPUSet := resNumaSets[string(v1.ResourceCPU)]
availableCPUSet = availableCPUSet.Difference(reserved)
klog.V(4).Infof("alignedCPUs: %v requestNum: %v bestHit %v", availableCPUSet, requestNum, bestHit)
result := cpuset.NewCPUSet()
if bestHit.NUMANodeAffinity != nil {
alignedCPUs := cpuset.NewCPUSet()
for _, numaNodeID := range bestHit.NUMANodeAffinity.GetBits() {
alignedCPUs = alignedCPUs.Union(availableCPUSet.Intersection(cputopo.CPUDetails.CPUsInNUMANodes(numaNodeID)))
}
numAlignedToAlloc := alignedCPUs.Size()
if requestNum < numAlignedToAlloc {
numAlignedToAlloc = requestNum
}
alignedCPUs, err := takeByTopology(cputopo, alignedCPUs, numAlignedToAlloc)
if err != nil {
return map[string]cpuset.CPUSet{
string(v1.ResourceCPU): cpuset.NewCPUSet(),
}
}
result = result.Union(alignedCPUs)
}
// Get any remaining CPUs from what's leftover after attempting to grab aligned ones.
remainingCPUs, err := takeByTopology(cputopo, availableCPUSet.Difference(result), requestNum-result.Size())
if err != nil {
return map[string]cpuset.CPUSet{
string(v1.ResourceCPU): cpuset.NewCPUSet(),
}
}
result = result.Union(remainingCPUs)
return map[string]cpuset.CPUSet{
string(v1.ResourceCPU): result,
}
}