diff --git a/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go b/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go index 7c79d8f6dcd..eb8cbd1e12a 100644 --- a/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go +++ b/pkg/kubelet/cm/topologymanager/policy_single_numa_node.go @@ -18,7 +18,6 @@ package topologymanager import ( "k8s.io/klog" - "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" "k8s.io/kubernetes/pkg/kubelet/lifecycle" ) @@ -122,11 +121,10 @@ func (p *singleNumaNodePolicy) mergeProvidersHints(providersHints []map[string][ } } - // Set the bestHint 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...) - bestHint := TopologyHint{defaultAffinity, false} + // Set the bestHint to return from this function as {nil false}. + // This will only be returned if no better hint can be found when + // merging hints from each hint provider. + bestHint := TopologyHint{} iterateAllProviderTopologyHints(allResourcesHints, func(permutation []TopologyHint) { mergedHint := mergePermutation(p.numaNodes, permutation) // Only consider mergedHints that result in a NUMANodeAffinity == 1 to @@ -135,12 +133,19 @@ func (p *singleNumaNodePolicy) mergeProvidersHints(providersHints []map[string][ return } - // If the current defaultHint is the same size as the new mergedHint, - // do not update defaultHint - if mergedHint.NUMANodeAffinity.Count() == bestHint.NUMANodeAffinity.Count() { + // If the current bestHint NUMANodeAffinity is nil, update bestHint + // to the current mergedHint. + if bestHint.NUMANodeAffinity == nil { + bestHint = mergedHint return } - // In all other cases, update defaultHint to the current mergedHint + + // Only consider mergedHints that have a narrower NUMANodeAffinity + // than the NUMANodeAffinity in the current bestHint. + if !mergedHint.NUMANodeAffinity.IsNarrowerThan(bestHint.NUMANodeAffinity) { + return + } + // In all other cases, update bestHint to the current mergedHint bestHint = mergedHint }) return bestHint diff --git a/pkg/kubelet/cm/topologymanager/policy_test.go b/pkg/kubelet/cm/topologymanager/policy_test.go index 084d9b55790..61ca7d0496f 100644 --- a/pkg/kubelet/cm/topologymanager/policy_test.go +++ b/pkg/kubelet/cm/topologymanager/policy_test.go @@ -89,35 +89,6 @@ func commonPolicyMergeTestCases(numaNodes []int) []policyMergeTestCase { Preferred: true, }, }, - { - name: "Two providers, 1 hint each, no common mask", - hp: []HintProvider{ - &mockHintProvider{ - map[string][]TopologyHint{ - "resource1": { - { - NUMANodeAffinity: NewTestBitMask(0), - Preferred: true, - }, - }, - }, - }, - &mockHintProvider{ - map[string][]TopologyHint{ - "resource2": { - { - NUMANodeAffinity: NewTestBitMask(1), - Preferred: true, - }, - }, - }, - }, - }, - expected: TopologyHint{ - NUMANodeAffinity: NewTestBitMask(numaNodes...), - Preferred: false, - }, - }, { name: "Two providers, 1 no hints, 1 single hint preferred 1/2", hp: []HintProvider{ @@ -430,6 +401,35 @@ func (p *bestEffortPolicy) mergeTestCases(numaNodes []int) []policyMergeTestCase Preferred: false, }, }, + { + name: "Two providers, 1 hint each, no common mask", + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource1": { + { + NUMANodeAffinity: NewTestBitMask(0), + Preferred: true, + }, + }, + }, + }, + &mockHintProvider{ + map[string][]TopologyHint{ + "resource2": { + { + NUMANodeAffinity: NewTestBitMask(1), + Preferred: true, + }, + }, + }, + }, + }, + expected: TopologyHint{ + NUMANodeAffinity: NewTestBitMask(numaNodes...), + Preferred: false, + }, + }, { name: "Two providers, 1 hint each, 1 wider mask, both preferred 1/2", hp: []HintProvider{ @@ -733,6 +733,35 @@ func (p *singleNumaNodePolicy) mergeTestCases(numaNodes []int) []policyMergeTest Preferred: true, }, }, + { + name: "Two providers, 1 hint each, no common mask", + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource1": { + { + NUMANodeAffinity: NewTestBitMask(0), + Preferred: true, + }, + }, + }, + }, + &mockHintProvider{ + map[string][]TopologyHint{ + "resource2": { + { + NUMANodeAffinity: NewTestBitMask(1), + Preferred: true, + }, + }, + }, + }, + }, + expected: TopologyHint{ + NUMANodeAffinity: nil, + Preferred: false, + }, + }, { name: "Two providers, 1 hint each, same mask, 1 preferred, 1 not 1/2", hp: []HintProvider{