...
1
16
17 package topologymanager
18
19 type singleNumaNodePolicy struct {
20
21 numaInfo *NUMAInfo
22 opts PolicyOptions
23 }
24
25 var _ Policy = &singleNumaNodePolicy{}
26
27
28 const PolicySingleNumaNode string = "single-numa-node"
29
30
31 func NewSingleNumaNodePolicy(numaInfo *NUMAInfo, opts PolicyOptions) Policy {
32 return &singleNumaNodePolicy{numaInfo: numaInfo, opts: opts}
33 }
34
35 func (p *singleNumaNodePolicy) Name() string {
36 return PolicySingleNumaNode
37 }
38
39 func (p *singleNumaNodePolicy) canAdmitPodResult(hint *TopologyHint) bool {
40 return hint.Preferred
41 }
42
43
44 func filterSingleNumaHints(allResourcesHints [][]TopologyHint) [][]TopologyHint {
45 var filteredResourcesHints [][]TopologyHint
46 for _, oneResourceHints := range allResourcesHints {
47 var filtered []TopologyHint
48 for _, hint := range oneResourceHints {
49 if hint.NUMANodeAffinity == nil && hint.Preferred {
50 filtered = append(filtered, hint)
51 }
52 if hint.NUMANodeAffinity != nil && hint.NUMANodeAffinity.Count() == 1 && hint.Preferred {
53 filtered = append(filtered, hint)
54 }
55 }
56 filteredResourcesHints = append(filteredResourcesHints, filtered)
57 }
58 return filteredResourcesHints
59 }
60
61 func (p *singleNumaNodePolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, bool) {
62 filteredHints := filterProvidersHints(providersHints)
63
64 singleNumaHints := filterSingleNumaHints(filteredHints)
65
66 merger := NewHintMerger(p.numaInfo, singleNumaHints, p.Name(), p.opts)
67 bestHint := merger.Merge()
68
69 if bestHint.NUMANodeAffinity.IsEqual(p.numaInfo.DefaultAffinityMask()) {
70 bestHint = TopologyHint{nil, bestHint.Preferred}
71 }
72
73 admit := p.canAdmitPodResult(&bestHint)
74 return bestHint, admit
75 }
76
View as plain text