From eda15215621f450a9a79b411217dcd15b0cb6581 Mon Sep 17 00:00:00 2001 From: Adrian Chiris Date: Thu, 5 Dec 2019 08:10:27 +0000 Subject: [PATCH] Make mergeProviderHints policy-specific: - Remove need to pass policy and numaNodes as arguments - Remove PolicySingleNUMANode special case check in policy_best_effort - Add mergeProviderHints base to policy_single_numa_node for upcoming commit --- .../cm/topologymanager/policy_best_effort.go | 25 +++++++------------ .../cm/topologymanager/policy_restricted.go | 2 +- .../policy_single_numa_node.go | 12 ++++++++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/pkg/kubelet/cm/topologymanager/policy_best_effort.go b/pkg/kubelet/cm/topologymanager/policy_best_effort.go index 6379daa81a9..26c7163bd83 100644 --- a/pkg/kubelet/cm/topologymanager/policy_best_effort.go +++ b/pkg/kubelet/cm/topologymanager/policy_best_effort.go @@ -48,7 +48,7 @@ func (p *bestEffortPolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.PodAd } func (p *bestEffortPolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) { - hint := mergeProvidersHints(p, p.numaNodes, providersHints) + hint := p.mergeProvidersHints(providersHints) admit := p.canAdmitPodResult(&hint) return hint, admit } @@ -72,7 +72,7 @@ func (p *bestEffortPolicy) Merge(providersHints []map[string][]TopologyHint) (To // providerHints[-1][z] // } // callback(permutation) -func iterateAllProviderTopologyHints(allProviderHints [][]TopologyHint, callback func([]TopologyHint)) { +func (p *bestEffortPolicy) iterateAllProviderTopologyHints(allProviderHints [][]TopologyHint, callback func([]TopologyHint)) { // Internal helper function to accumulate the permutation before calling the callback. var iterate func(i int, accum []TopologyHint) iterate = func(i int, accum []TopologyHint) { @@ -94,10 +94,10 @@ func iterateAllProviderTopologyHints(allProviderHints [][]TopologyHint, callback // Merge a TopologyHints permutation to a single hint by performing a bitwise-AND // of their affinity masks. The hint shall be preferred if all hits in the permutation // are preferred. -func mergePermutation(policy Policy, numaNodes []int, permutation []TopologyHint) TopologyHint { +func (p *bestEffortPolicy) mergePermutation(permutation []TopologyHint) TopologyHint { // Get the NUMANodeAffinity from each hint in the permutation and see if any // of them encode unpreferred allocations. - defaultAffinity, _ := bitmask.NewBitMask(numaNodes...) + defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...) preferred := true var numaAffinities []bitmask.BitMask for _, hint := range permutation { @@ -111,17 +111,10 @@ func mergePermutation(policy Policy, numaNodes []int, permutation []TopologyHint if !hint.Preferred { preferred = false } - - // Special case PolicySingleNumaNode to only prefer hints where - // all providers have a single NUMA affinity set. - if policy != nil && policy.Name() == PolicySingleNumaNode && hint.NUMANodeAffinity != nil && hint.NUMANodeAffinity.Count() > 1 { - preferred = false - } - } // Merge the affinities using a bitwise-and operation. - mergedAffinity, _ := bitmask.NewBitMask(numaNodes...) + mergedAffinity, _ := bitmask.NewBitMask(p.numaNodes...) mergedAffinity.And(numaAffinities...) // Build a mergedHint from the merged affinity mask, indicating if an // preferred allocation was used to generate the affinity mask or not. @@ -129,10 +122,10 @@ func mergePermutation(policy Policy, numaNodes []int, permutation []TopologyHint } // Merge the hints from all hint providers to find the best one. -func mergeProvidersHints(policy Policy, numaNodes []int, providersHints []map[string][]TopologyHint) TopologyHint { +func (p *bestEffortPolicy) mergeProvidersHints(providersHints []map[string][]TopologyHint) TopologyHint { // Set the default affinity as an any-numa affinity containing the list // of NUMA Nodes available on this machine. - defaultAffinity, _ := bitmask.NewBitMask(numaNodes...) + defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...) // Loop through all hint providers and save an accumulated list of the // hints returned by each hint provider. If no hints are provided, assume @@ -170,10 +163,10 @@ func mergeProvidersHints(policy Policy, numaNodes []int, providersHints []map[st // permutations that have at least one NUMA ID set. If no merged mask can be // found that has at least one NUMA ID set, return the 'defaultAffinity'. bestHint := TopologyHint{defaultAffinity, false} - iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) { + p.iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) { // Get the NUMANodeAffinity from each hint in the permutation and see if any // of them encode unpreferred allocations. - mergedHint := mergePermutation(policy, numaNodes, permutation) + mergedHint := p.mergePermutation(permutation) // Only consider mergedHints that result in a NUMANodeAffinity > 0 to // replace the current bestHint. diff --git a/pkg/kubelet/cm/topologymanager/policy_restricted.go b/pkg/kubelet/cm/topologymanager/policy_restricted.go index cc522980c0e..34e3fb3c247 100644 --- a/pkg/kubelet/cm/topologymanager/policy_restricted.go +++ b/pkg/kubelet/cm/topologymanager/policy_restricted.go @@ -52,7 +52,7 @@ func (p *restrictedPolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.PodAd } func (p *restrictedPolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) { - hint := mergeProvidersHints(p, p.numaNodes, providersHints) + hint := p.mergeProvidersHints(providersHints) admit := p.canAdmitPodResult(&hint) return hint, admit } diff --git a/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go b/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go index 6f29e1c27b7..41b02c3ee8d 100644 --- a/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go +++ b/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go @@ -17,6 +17,7 @@ limitations under the License. package topologymanager import ( + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" "k8s.io/kubernetes/pkg/kubelet/lifecycle" ) @@ -52,8 +53,17 @@ func (p *singleNumaNodePolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.P } } +func (p *singleNumaNodePolicy) mergeProvidersHints(providersHints []map[string][]TopologyHint) TopologyHint { + // Set the default hint to return from this function as an any-NUMANode + // affinity with an unpreferred allocation. This will only be returned if + // no better hint can be found when merging hints from each hint provider. + defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...) + defaultHint := TopologyHint{defaultAffinity, false} + return defaultHint +} + func (p *singleNumaNodePolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) { - hint := mergeProvidersHints(p, p.numaNodes, providersHints) + hint := p.mergeProvidersHints(providersHints) admit := p.canAdmitPodResult(&hint) return hint, admit }