Skip to content

Commit 066e4f5

Browse files
authored
Merge pull request #2664 from jcpunk/processors-extensions
feat(processor.extensions) Add support for CPU flag detection
2 parents 7cced2e + d6a0020 commit 066e4f5

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
module Facts
4+
module Linux
5+
module Processors
6+
class Extensions
7+
FACT_NAME = 'processors.extensions'
8+
9+
def call_the_resolver
10+
fact_value = Facter::Resolvers::Linux::Processors.resolve(:extensions)
11+
Facter::ResolvedFact.new(FACT_NAME, fact_value)
12+
end
13+
end
14+
end
15+
end
16+
end

lib/facter/framework/core/file_loader.rb

+1
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@
482482
require_relative '../../facts/linux/processor'
483483
require_relative '../../facts/linux/processors/cores'
484484
require_relative '../../facts/linux/processors/count'
485+
require_relative '../../facts/linux/processors/extensions'
485486
require_relative '../../facts/linux/processors/isa'
486487
require_relative '../../facts/linux/processors/models'
487488
require_relative '../../facts/linux/processors/physicalcount'

lib/facter/resolvers/processors.rb

+22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require 'set'
4+
35
module Facter
46
module Resolvers
57
module Linux
@@ -10,6 +12,7 @@ class Processors < BaseResolver
1012

1113
class << self
1214
# :count
15+
# :extensions
1316
# :models
1417
# :physical_count
1518
# :speed
@@ -32,6 +35,7 @@ def read_cpuinfo(fact_name)
3235
end
3336

3437
def read_processors(cpuinfo_output)
38+
@fact_list[:extensions] = Set[Facter::Resolvers::Uname.resolve(:processor)]
3539
@fact_list[:processors] = 0
3640
@fact_list[:models] = []
3741
@fact_list[:physical_processors] = []
@@ -41,7 +45,10 @@ def read_processors(cpuinfo_output)
4145
construct_models_list(tokens)
4246
count_physical_processors(tokens)
4347
build_speed(tokens)
48+
check_extensions(tokens)
4449
end
50+
@fact_list[:extensions] = @fact_list[:extensions].to_a
51+
@fact_list[:extensions].sort!
4552
end
4653

4754
def count_processors(tokens)
@@ -82,6 +89,21 @@ def build_speed_for_x86(tokens)
8289
speed = tokens.last.strip.match(/^(\d+).*/)[1]
8390
@fact_list[:speed] = speed.to_i * MHZ_TO_HZ
8491
end
92+
93+
def check_extensions(tokens)
94+
return unless tokens.first.strip == 'flags'
95+
96+
flags = tokens.last.split(' ')
97+
98+
# TODO: As we gain support for other arches, change the guard
99+
# so we only check the flags for the corosponding arches
100+
return unless @fact_list[:extensions].include?('x86_64')
101+
102+
@fact_list[:extensions].add('x86_64-v1') if (%w[cmov cx8 fpu fxsr lm mmx syscall sse2] - flags).empty?
103+
@fact_list[:extensions].add('x86_64-v2') if (%w[cx16 lahf_lm popcnt sse4_1 sse4_2 ssse3] - flags).empty?
104+
@fact_list[:extensions].add('x86_64-v3') if (%w[abm avx avx2 bmi1 bmi2 f16c fma movbe xsave] - flags).empty?
105+
@fact_list[:extensions].add('x86_64-v4') if (%w[avx512f avx512bw avx512cd avx512dq avx512vl] - flags).empty?
106+
end
85107
end
86108
end
87109
end

spec/facter/resolvers/processors_spec.rb

+25
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
describe Facter::Resolvers::Linux::Processors do
44
after do
55
Facter::Resolvers::Linux::Processors.invalidate_cache
6+
Facter::Resolvers::Uname.invalidate_cache
67
end
78

89
context 'when on x86 architecture' do
@@ -21,6 +22,9 @@
2122
end
2223

2324
let(:speed) { 2_294_000_000 }
25+
let(:extensions) do
26+
%w[x86_64 x86_64-v1 x86_64-v2 x86_64-v3]
27+
end
2428

2529
it 'returns number of processors' do
2630
result = Facter::Resolvers::Linux::Processors.resolve(:processors)
@@ -45,6 +49,16 @@
4549

4650
expect(result).to eq(speed)
4751
end
52+
53+
it 'returns extensions supported' do
54+
allow(Facter::Resolvers::Uname).to receive(:resolve)
55+
.with(:processor)
56+
.and_return('x86_64')
57+
58+
result = Facter::Resolvers::Linux::Processors.resolve(:extensions)
59+
60+
expect(result).to eq(extensions)
61+
end
4862
end
4963

5064
context 'when cpuinfo file is readable but no physical id' do
@@ -75,6 +89,7 @@
7589

7690
after do
7791
Facter::Resolvers::Linux::Processors.invalidate_cache
92+
Facter::Resolvers::Uname.invalidate_cache
7893
end
7994

8095
let(:physical_processors) { 2 }
@@ -135,6 +150,11 @@
135150
.and_return('1')
136151
end
137152

153+
after do
154+
Facter::Resolvers::Linux::Processors.invalidate_cache
155+
Facter::Resolvers::Uname.invalidate_cache
156+
end
157+
138158
let(:speed) { 2_926_000_000 }
139159
let(:physical_processors) { 2 }
140160

@@ -186,6 +206,11 @@
186206
.and_return('0')
187207
end
188208

209+
after do
210+
Facter::Resolvers::Linux::Processors.invalidate_cache
211+
Facter::Resolvers::Uname.invalidate_cache
212+
end
213+
189214
let(:physical_processors) { 1 }
190215

191216
it 'returns physical_devices_count' do

0 commit comments

Comments
 (0)