@@ -17,7 +17,6 @@ limitations under the License.
17
17
package topologymanager
18
18
19
19
import (
20
- "k8s.io/klog"
21
20
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask"
22
21
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
23
22
)
@@ -55,7 +54,7 @@ func (p *singleNumaNodePolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.P
55
54
}
56
55
57
56
// Return hints that have valid bitmasks with exactly one bit set.
58
- func ( p * singleNumaNodePolicy ) filterHints (allResourcesHints [][]TopologyHint ) [][]TopologyHint {
57
+ func filterSingleNumaHints (allResourcesHints [][]TopologyHint ) [][]TopologyHint {
59
58
var filteredResourcesHints [][]TopologyHint
60
59
for _ , oneResourceHints := range allResourcesHints {
61
60
var filtered []TopologyHint
@@ -72,93 +71,17 @@ func (p *singleNumaNodePolicy) filterHints(allResourcesHints [][]TopologyHint) [
72
71
return filteredResourcesHints
73
72
}
74
73
75
- func (p * singleNumaNodePolicy ) mergeProvidersHints (providersHints []map [string ][]TopologyHint ) TopologyHint {
76
- // Set the default affinity as an any-numa affinity containing the list
77
- // of NUMA Nodes available on this machine.
78
- defaultAffinity , _ := bitmask .NewBitMask (p .numaNodes ... )
79
-
80
- // Loop through all provider hints and save an accumulated list of the
81
- // hints returned by each hint provider. If no hints are provided, assume
82
- // that provider has no preference for topology-aware allocation.
83
- var allProviderHints [][]TopologyHint
84
- for _ , hints := range providersHints {
85
- // If hints is nil, insert a single, preferred any-numa hint into allProviderHints.
86
- if len (hints ) == 0 {
87
- klog .Infof ("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource" )
88
- allProviderHints = append (allProviderHints , []TopologyHint {{nil , true }})
89
- continue
90
- }
91
-
92
- // Otherwise, accumulate the hints for each resource type into allProviderHints.
93
- for resource := range hints {
94
- if hints [resource ] == nil {
95
- klog .Infof ("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'" , resource )
96
- allProviderHints = append (allProviderHints , []TopologyHint {{nil , true }})
97
- continue
98
- }
99
-
100
- if len (hints [resource ]) == 0 {
101
- klog .Infof ("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'" , resource )
102
- allProviderHints = append (allProviderHints , []TopologyHint {{nil , false }})
103
- continue
104
- }
105
-
106
- allProviderHints = append (allProviderHints , hints [resource ])
107
- }
108
- }
109
-
74
+ func (p * singleNumaNodePolicy ) Merge (providersHints []map [string ][]TopologyHint ) (TopologyHint , lifecycle.PodAdmitResult ) {
75
+ filteredHints := filterProvidersHints (providersHints )
110
76
// Filter to only include don't cares and hints with a single NUMA node.
111
- allProviderHints = p .filterHints (allProviderHints )
112
-
113
- // Set the bestHint to return from this function as {nil false}.
114
- // This will only be returned if no better hint can be found when
115
- // merging hints from each hint provider.
116
- bestHint := TopologyHint {defaultAffinity , false }
117
- iterateAllProviderTopologyHints (allProviderHints , func (permutation []TopologyHint ) {
118
- // Get the NUMANodeAffinity from each hint in the permutation and see if any
119
- // of them encode unpreferred allocations.
120
- mergedHint := mergePermutation (p .numaNodes , permutation )
121
-
122
- // Only consider mergedHints that result in a NUMANodeAffinity > 0 to
123
- // replace the current bestHint.
124
- if mergedHint .NUMANodeAffinity .Count () == 0 {
125
- return
126
- }
127
-
128
- // If the current bestHint is non-preferred and the new mergedHint is
129
- // preferred, always choose the preferred hint over the non-preferred one.
130
- if mergedHint .Preferred && ! bestHint .Preferred {
131
- bestHint = mergedHint
132
- return
133
- }
134
-
135
- // If the current bestHint is preferred and the new mergedHint is
136
- // non-preferred, never update bestHint, regardless of mergedHint's
137
- // narowness.
138
- if ! mergedHint .Preferred && bestHint .Preferred {
139
- return
140
- }
141
-
142
- // If mergedHint and bestHint has the same preference, only consider
143
- // mergedHints that have a narrower NUMANodeAffinity than the
144
- // NUMANodeAffinity in the current bestHint.
145
- if ! mergedHint .NUMANodeAffinity .IsNarrowerThan (bestHint .NUMANodeAffinity ) {
146
- return
147
- }
148
-
149
- // In all other cases, update bestHint to the current mergedHint
150
- bestHint = mergedHint
151
- })
77
+ singleNumaHints := filterSingleNumaHints (filteredHints )
78
+ bestHint := mergeFilteredHints (p .numaNodes , singleNumaHints )
152
79
80
+ defaultAffinity , _ := bitmask .NewBitMask (p .numaNodes ... )
153
81
if bestHint .NUMANodeAffinity .IsEqual (defaultAffinity ) {
154
82
bestHint = TopologyHint {nil , bestHint .Preferred }
155
83
}
156
84
157
- return bestHint
158
- }
159
-
160
- func (p * singleNumaNodePolicy ) Merge (providersHints []map [string ][]TopologyHint ) (TopologyHint , lifecycle.PodAdmitResult ) {
161
- hint := p .mergeProvidersHints (providersHints )
162
- admit := p .canAdmitPodResult (& hint )
163
- return hint , admit
85
+ admit := p .canAdmitPodResult (& bestHint )
86
+ return bestHint , admit
164
87
}
0 commit comments