Skip to content

Commit 4d76b1c

Browse files
author
nolancon
committed
Add mergeFilteredHints:
- Move remaining logic from mergeProvidersHints to generic top level mergeFilteredHints function. - Add numaNodes as parameter in order to make generic. - Move single NUMA node specific check to single-numa-node Merge function.
1 parent fc300e0 commit 4d76b1c

File tree

4 files changed

+59
-110
lines changed

4 files changed

+59
-110
lines changed

pkg/kubelet/cm/topologymanager/policy.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,53 @@ func filterProvidersHints(providersHints []map[string][]TopologyHint) [][]Topolo
9393
return allProviderHints
9494
}
9595

96+
func mergeFilteredHints(numaNodes []int, filteredHints [][]TopologyHint) TopologyHint {
97+
// Set the default affinity as an any-numa affinity containing the list
98+
// of NUMA Nodes available on this machine.
99+
defaultAffinity, _ := bitmask.NewBitMask(numaNodes...)
100+
101+
// Set the bestHint to return from this function as {nil false}.
102+
// This will only be returned if no better hint can be found when
103+
// merging hints from each hint provider.
104+
bestHint := TopologyHint{defaultAffinity, false}
105+
iterateAllProviderTopologyHints(filteredHints, func(permutation []TopologyHint) {
106+
// Get the NUMANodeAffinity from each hint in the permutation and see if any
107+
// of them encode unpreferred allocations.
108+
mergedHint := mergePermutation(numaNodes, permutation)
109+
// Only consider mergedHints that result in a NUMANodeAffinity > 0 to
110+
// replace the current bestHint.
111+
if mergedHint.NUMANodeAffinity.Count() == 0 {
112+
return
113+
}
114+
115+
// If the current bestHint is non-preferred and the new mergedHint is
116+
// preferred, always choose the preferred hint over the non-preferred one.
117+
if mergedHint.Preferred && !bestHint.Preferred {
118+
bestHint = mergedHint
119+
return
120+
}
121+
122+
// If the current bestHint is preferred and the new mergedHint is
123+
// non-preferred, never update bestHint, regardless of mergedHint's
124+
// narowness.
125+
if !mergedHint.Preferred && bestHint.Preferred {
126+
return
127+
}
128+
129+
// If mergedHint and bestHint has the same preference, only consider
130+
// mergedHints that have a narrower NUMANodeAffinity than the
131+
// NUMANodeAffinity in the current bestHint.
132+
if !mergedHint.NUMANodeAffinity.IsNarrowerThan(bestHint.NUMANodeAffinity) {
133+
return
134+
}
135+
136+
// In all other cases, update bestHint to the current mergedHint
137+
bestHint = mergedHint
138+
})
139+
140+
return bestHint
141+
}
142+
96143
// Iterate over all permutations of hints in 'allProviderHints [][]TopologyHint'.
97144
//
98145
// This procedure is implemented as a recursive function over the set of hints

pkg/kubelet/cm/topologymanager/policy_best_effort.go

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package topologymanager
1818

1919
import (
20-
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask"
2120
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
2221
)
2322

@@ -48,58 +47,7 @@ func (p *bestEffortPolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.PodAd
4847

4948
func (p *bestEffortPolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
5049
filteredProvidersHints := filterProvidersHints(providersHints)
51-
hint := p.mergeProvidersHints(filteredProvidersHints)
52-
admit := p.canAdmitPodResult(&hint)
53-
return hint, admit
54-
}
55-
56-
// Merge the hints from all hint providers to find the best one.
57-
func (p *bestEffortPolicy) mergeProvidersHints(filteredHints [][]TopologyHint) TopologyHint {
58-
// Set the default affinity as an any-numa affinity containing the list
59-
// of NUMA Nodes available on this machine.
60-
defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...)
61-
62-
// Iterate over all permutations of hints in 'allProviderHints'. Merge the
63-
// hints in each permutation by taking the bitwise-and of their affinity masks.
64-
// Return the hint with the narrowest NUMANodeAffinity of all merged
65-
// permutations that have at least one NUMA ID set. If no merged mask can be
66-
// found that has at least one NUMA ID set, return the 'defaultAffinity'.
67-
bestHint := TopologyHint{defaultAffinity, false}
68-
iterateAllProviderTopologyHints(filteredHints, func(permutation []TopologyHint) {
69-
// Get the NUMANodeAffinity from each hint in the permutation and see if any
70-
// of them encode unpreferred allocations.
71-
mergedHint := mergePermutation(p.numaNodes, permutation)
72-
73-
// Only consider mergedHints that result in a NUMANodeAffinity > 0 to
74-
// replace the current bestHint.
75-
if mergedHint.NUMANodeAffinity.Count() == 0 {
76-
return
77-
}
78-
79-
// If the current bestHint is non-preferred and the new mergedHint is
80-
// preferred, always choose the preferred hint over the non-preferred one.
81-
if mergedHint.Preferred && !bestHint.Preferred {
82-
bestHint = mergedHint
83-
return
84-
}
85-
86-
// If the current bestHint is preferred and the new mergedHint is
87-
// non-preferred, never update bestHint, regardless of mergedHint's
88-
// narowness.
89-
if !mergedHint.Preferred && bestHint.Preferred {
90-
return
91-
}
92-
93-
// If mergedHint and bestHint has the same preference, only consider
94-
// mergedHints that have a narrower NUMANodeAffinity than the
95-
// NUMANodeAffinity in the current bestHint.
96-
if !mergedHint.NUMANodeAffinity.IsNarrowerThan(bestHint.NUMANodeAffinity) {
97-
return
98-
}
99-
100-
// In all other cases, update bestHint to the current mergedHint
101-
bestHint = mergedHint
102-
})
103-
104-
return bestHint
50+
bestHint := mergeFilteredHints(p.numaNodes, filteredProvidersHints)
51+
admit := p.canAdmitPodResult(&bestHint)
52+
return bestHint, admit
10553
}

pkg/kubelet/cm/topologymanager/policy_restricted.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (p *restrictedPolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.PodAd
5353

5454
func (p *restrictedPolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
5555
filteredHints := filterProvidersHints(providersHints)
56-
hint := p.mergeProvidersHints(filteredHints)
56+
hint := mergeFilteredHints(p.numaNodes, filteredHints)
5757
admit := p.canAdmitPodResult(&hint)
5858
return hint, admit
5959
}

pkg/kubelet/cm/topologymanager/policy_single_numa_node.go

Lines changed: 8 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -71,63 +71,17 @@ func filterSingleNumaHints(allResourcesHints [][]TopologyHint) [][]TopologyHint
7171
return filteredResourcesHints
7272
}
7373

74-
func (p *singleNumaNodePolicy) mergeProvidersHints(filteredHints [][]TopologyHint) TopologyHint {
75-
// Set the default affinity as an any-numa affinity containing the list
76-
// of NUMA Nodes available on this machine.
77-
defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...)
78-
79-
// Set the bestHint to return from this function as {nil false}.
80-
// This will only be returned if no better hint can be found when
81-
// merging hints from each hint provider.
82-
bestHint := TopologyHint{defaultAffinity, false}
83-
iterateAllProviderTopologyHints(filteredHints, func(permutation []TopologyHint) {
84-
// Get the NUMANodeAffinity from each hint in the permutation and see if any
85-
// of them encode unpreferred allocations.
86-
mergedHint := mergePermutation(p.numaNodes, permutation)
87-
88-
// Only consider mergedHints that result in a NUMANodeAffinity > 0 to
89-
// replace the current bestHint.
90-
if mergedHint.NUMANodeAffinity.Count() == 0 {
91-
return
92-
}
93-
94-
// If the current bestHint is non-preferred and the new mergedHint is
95-
// preferred, always choose the preferred hint over the non-preferred one.
96-
if mergedHint.Preferred && !bestHint.Preferred {
97-
bestHint = mergedHint
98-
return
99-
}
100-
101-
// If the current bestHint is preferred and the new mergedHint is
102-
// non-preferred, never update bestHint, regardless of mergedHint's
103-
// narowness.
104-
if !mergedHint.Preferred && bestHint.Preferred {
105-
return
106-
}
107-
108-
// If mergedHint and bestHint has the same preference, only consider
109-
// mergedHints that have a narrower NUMANodeAffinity than the
110-
// NUMANodeAffinity in the current bestHint.
111-
if !mergedHint.NUMANodeAffinity.IsNarrowerThan(bestHint.NUMANodeAffinity) {
112-
return
113-
}
114-
115-
// In all other cases, update bestHint to the current mergedHint
116-
bestHint = mergedHint
117-
})
74+
func (p *singleNumaNodePolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
75+
filteredHints := filterProvidersHints(providersHints)
76+
// Filter to only include don't cares and hints with a single NUMA node.
77+
singleNumaHints := filterSingleNumaHints(filteredHints)
78+
bestHint := mergeFilteredHints(p.numaNodes, singleNumaHints)
11879

80+
defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...)
11981
if bestHint.NUMANodeAffinity.IsEqual(defaultAffinity) {
12082
bestHint = TopologyHint{nil, bestHint.Preferred}
12183
}
12284

123-
return bestHint
124-
}
125-
126-
func (p *singleNumaNodePolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
127-
filteredHints := filterProvidersHints(providersHints)
128-
// Filter to only include don't cares and hints with a single NUMA node.
129-
singleNumaHints := filterSingleNumaHints(filteredHints)
130-
hint := p.mergeProvidersHints(singleNumaHints)
131-
admit := p.canAdmitPodResult(&hint)
132-
return hint, admit
85+
admit := p.canAdmitPodResult(&bestHint)
86+
return bestHint, admit
13387
}

0 commit comments

Comments
 (0)