Skip to content

Commit a689075

Browse files
authored
Users/nmalkapuram/updatelscpu parser logic (#176)
* Adding logic for lscpu parser update * Updating lscpu parser and adding unittests * Resolving comments * fixing double.NaN values
1 parent 9cdc950 commit a689075

File tree

5 files changed

+288
-11
lines changed

5 files changed

+288
-11
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Architecture: x86_64
2+
CPU op-mode(s): 32-bit, 64-bit
3+
Address sizes: 46 bits physical, 57 bits virtual
4+
Byte Order: Little Endian
5+
CPU(s): 28
6+
On-line CPU(s) list: 0-27
7+
Vendor ID: GenuineIntel
8+
Model name: Intel(R) Xeon(R) Platinum 8480C
9+
CPU family: 6
10+
Model: 143
11+
Thread(s) per core: 2
12+
Core(s) per socket: 7
13+
Socket(s): 2
14+
Stepping: 8
15+
CPU max MHz: 380.0000
16+
CPU min MHz: 80.0000
17+
BogoMIPS: 4000.00
18+
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon
19+
ebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4
20+
x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ib
21+
stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflu
22+
opt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoin
23+
dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq
24+
a57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr ibt amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabiliti
25+
Virtualization features:
26+
Virtualization: VT-x
27+
Caches (sum of all):
28+
L1d: 4.3 MiB (112 instances)
29+
L1i: 2.5 MiB (112 instances)
30+
L2: 24 MiB (112 instances)
31+
L3: 20 MiB (2 instances)
32+
NUMA:
33+
NUMA node(s): 2
34+
NUMA node0 CPU(s): 0-5,18-23
35+
NUMA node1 CPU(s): 6-17,24-27
36+
Vulnerabilities:
37+
Gather data sampling: Not affected
38+
Itlb multihit: Not affected
39+
L1tf: Not affected
40+
Mds: Not affected
41+
Meltdown: Not affected
42+
Mmio stale data: Not affected
43+
Retbleed: Not affected
44+
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
45+
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
46+
Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence
47+
Srbds: Not affected
48+
Tsx async abort: Not affected

src/VirtualClient/VirtualClient.Contracts.UnitTests/Parser/LscpuParserTests.cs

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ public void LscpuParserParsesTheExpectedResultsFromIntelSystems_Scenario1()
2828
Assert.AreEqual(1, info.SocketCount);
2929
Assert.AreEqual(1, info.NumaNodeCount);
3030
Assert.IsTrue(info.IsHyperthreadingEnabled);
31+
Assert.AreEqual(double.NaN, info.MaxFrequencyMHz);
32+
Assert.AreEqual(double.NaN, info.MinFrequencyMHz);
33+
Assert.AreEqual(2793.438, info.FrequencyMHz);
34+
35+
Assert.AreEqual(7, info.Flags.Count);
36+
Assert.AreEqual("x86_64", info.Flags["Architecture"]);
37+
Assert.AreEqual("32-bit, 64-bit", info.Flags["CPU op-mode(s)"]);
38+
Assert.AreEqual("46 bits physical, 48 bits virtual", info.Flags["Address sizes"]);
39+
Assert.AreEqual("Little Endian", info.Flags["Byte Order"]);
40+
Assert.AreEqual("0-3", info.Flags["NUMA node0 CPU(s)"]);
41+
Assert.AreEqual("0-3", info.Flags["On-line CPU(s) list"]);
42+
Assert.AreEqual("5586.87", info.Flags["BogoMIPS"]);
3143

3244
IConvertible cacheMemory = 0;
3345
Assert.IsNotEmpty(info.Caches);
@@ -55,6 +67,18 @@ public void LscpuParserParsesTheExpectedResultsFromIntelSystems_Scenario2()
5567
Assert.AreEqual(1, info.SocketCount);
5668
Assert.AreEqual(1, info.NumaNodeCount);
5769
Assert.IsFalse(info.IsHyperthreadingEnabled);
70+
Assert.AreEqual(double.NaN, info.MaxFrequencyMHz);
71+
Assert.AreEqual(double.NaN, info.MinFrequencyMHz);
72+
Assert.AreEqual(2793.438, info.FrequencyMHz);
73+
74+
Assert.AreEqual(7, info.Flags.Count);
75+
Assert.AreEqual("x86_64", info.Flags["Architecture"]);
76+
Assert.AreEqual("32-bit, 64-bit", info.Flags["CPU op-mode(s)"]);
77+
Assert.AreEqual("46 bits physical, 48 bits virtual", info.Flags["Address sizes"]);
78+
Assert.AreEqual("Little Endian", info.Flags["Byte Order"]);
79+
Assert.AreEqual("0-3", info.Flags["NUMA node0 CPU(s)"]);
80+
Assert.AreEqual("0-3", info.Flags["On-line CPU(s) list"]);
81+
Assert.AreEqual("5586.87", info.Flags["BogoMIPS"]);
5882

5983
IConvertible cacheMemory = 0;
6084
Assert.IsNotEmpty(info.Caches);
@@ -82,6 +106,17 @@ public void LscpuParserParsesTheExpectedResultsFromAmpereSystems_Scenario1()
82106
Assert.AreEqual(1, info.SocketCount);
83107
Assert.AreEqual(1, info.NumaNodeCount);
84108
Assert.IsFalse(info.IsHyperthreadingEnabled);
109+
Assert.AreEqual(double.NaN, info.MaxFrequencyMHz);
110+
Assert.AreEqual(double.NaN, info.MinFrequencyMHz);
111+
Assert.AreEqual(double.NaN, info.FrequencyMHz);
112+
113+
Assert.AreEqual(6, info.Flags.Count);
114+
Assert.AreEqual("aarch64", info.Flags["Architecture"]);
115+
Assert.AreEqual("32-bit, 64-bit", info.Flags["CPU op-mode(s)"]);
116+
Assert.AreEqual("Little Endian", info.Flags["Byte Order"]);
117+
Assert.AreEqual("0,1", info.Flags["NUMA node0 CPU(s)"]);
118+
Assert.AreEqual("0,1", info.Flags["On-line CPU(s) list"]);
119+
Assert.AreEqual("50", info.Flags["BogoMIPS"]);
85120

86121
IConvertible cacheMemory = 0;
87122
Assert.IsNotEmpty(info.Caches);
@@ -97,7 +132,7 @@ public void LscpuParserParsesTheExpectedResultsFromAmpereSystems_Scenario1()
97132
[Test]
98133
public void LscpuParserParsesTheExpectedResultsFromAWSSystems_Scenario3()
99134
{
100-
string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, "lscpu", "lscpu_results3.txt"));
135+
string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, "lscpu", "lscpu_results_intel_3.txt"));
101136
LscpuParser parser = new LscpuParser(results);
102137
CpuInfo info = parser.Parse();
103138

@@ -109,6 +144,67 @@ public void LscpuParserParsesTheExpectedResultsFromAWSSystems_Scenario3()
109144
Assert.AreEqual(1, info.SocketCount);
110145
Assert.AreEqual(1, info.NumaNodeCount);
111146
Assert.IsFalse(info.IsHyperthreadingEnabled);
147+
Assert.AreEqual(double.NaN, info.MaxFrequencyMHz);
148+
Assert.AreEqual(double.NaN, info.MinFrequencyMHz);
149+
Assert.AreEqual(double.NaN, info.FrequencyMHz);
150+
151+
Assert.AreEqual(6, info.Flags.Count);
152+
Assert.AreEqual("aarch64", info.Flags["Architecture"]);
153+
Assert.AreEqual("32-bit, 64-bit", info.Flags["CPU op-mode(s)"]);
154+
Assert.AreEqual("Little Endian", info.Flags["Byte Order"]);
155+
Assert.AreEqual("0,1", info.Flags["NUMA node0 CPU(s)"]);
156+
Assert.AreEqual("0,1", info.Flags["On-line CPU(s) list"]);
157+
Assert.AreEqual("2100", info.Flags["BogoMIPS"]);
158+
159+
IConvertible cacheMemory = 0;
160+
Assert.IsNotEmpty(info.Caches);
161+
162+
Assert.IsTrue(info.Caches.Count() == 5);
163+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L1" && cache.SizeInBytes == 262144));
164+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L1d" && cache.SizeInBytes == 131072));
165+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L1i" && cache.SizeInBytes == 131072));
166+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L2" && cache.SizeInBytes == 2097152));
167+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L3" && cache.SizeInBytes == 33554432));
168+
}
169+
170+
[Test]
171+
public void LscpuParserParsesTheExpectedResultsIntelLabSystems_Scenario4()
172+
{
173+
string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, "lscpu", "lscpu_results_intel_4.txt"));
174+
LscpuParser parser = new LscpuParser(results);
175+
CpuInfo info = parser.Parse();
176+
177+
Assert.IsNotNull(info);
178+
Assert.AreEqual("Intel(R) Xeon(R) Platinum 8480C", info.Name);
179+
Assert.AreEqual("Intel(R) Xeon(R) Platinum 8480C Family 6 Model 143 Stepping 8, GenuineIntel", info.Description);
180+
Assert.AreEqual(28, info.LogicalCoreCount);
181+
Assert.AreEqual(14, info.PhysicalCoreCount);
182+
Assert.AreEqual(2, info.SocketCount);
183+
Assert.AreEqual(2, info.NumaNodeCount);
184+
Assert.IsTrue(info.IsHyperthreadingEnabled);
185+
Assert.AreEqual(380, info.MaxFrequencyMHz);
186+
Assert.AreEqual(80, info.MinFrequencyMHz);
187+
Assert.AreEqual(double.NaN, info.FrequencyMHz);
188+
189+
Assert.AreEqual(8, info.Flags.Count);
190+
Assert.AreEqual("x86_64", info.Flags["Architecture"]);
191+
Assert.AreEqual("32-bit, 64-bit", info.Flags["CPU op-mode(s)"]);
192+
Assert.AreEqual("46 bits physical, 57 bits virtual", info.Flags["Address sizes"]);
193+
Assert.AreEqual("Little Endian", info.Flags["Byte Order"]);
194+
Assert.AreEqual("0-5,18-23", info.Flags["NUMA node0 CPU(s)"]);
195+
Assert.AreEqual("6-17,24-27", info.Flags["NUMA node1 CPU(s)"]);
196+
Assert.AreEqual("0-27", info.Flags["On-line CPU(s) list"]);
197+
Assert.AreEqual("4000", info.Flags["BogoMIPS"]);
198+
199+
IConvertible cacheMemory = 0;
200+
Assert.IsNotEmpty(info.Caches);
201+
202+
Assert.IsTrue(info.Caches.Count() == 5);
203+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L1" && cache.SizeInBytes == 7130316));
204+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L1d" && cache.SizeInBytes == 4508876));
205+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L1i" && cache.SizeInBytes == 2621440));
206+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L2" && cache.SizeInBytes == 25165824));
207+
Assert.IsTrue(info.Caches.Any(cache => cache.Name == "L3" && cache.SizeInBytes == 20971520));
112208
}
113209
}
114210
}

src/VirtualClient/VirtualClient.Contracts/CpuInfo.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ public class CpuInfo
2323
/// <param name="numaNodeCount">The number of NUMA nodes on the system.</param>
2424
/// <param name="hyperThreadingEnabled">True/false whether CPU hyperthreading is enabled on the system.</param>
2525
/// <param name="caches">Memory caches for the CPU (e.g. L1, L2, L3).</param>
26-
public CpuInfo(string name, string description, int physicalCoreCount, int logicalCoreCount, int socketCount, int numaNodeCount, bool hyperThreadingEnabled, IEnumerable<CpuCacheInfo> caches = null)
26+
/// <param name="flags">List of other information about CPU</param>
27+
/// <param name="maxFrequency">Maximum CPU frequency in MHz.</param>
28+
/// <param name="minFrequency">Minimum CPU frequency in MHz.</param>
29+
/// <param name="frequency">Currrent frequency of CPU in MHz.</param>
30+
public CpuInfo(string name, string description, int physicalCoreCount, int logicalCoreCount, int socketCount, int numaNodeCount, bool hyperThreadingEnabled, IEnumerable<CpuCacheInfo> caches = null, Dictionary<string, string> flags = null, double maxFrequency = double.NaN, double minFrequency = double.NaN, double frequency = double.NaN)
2731
: base()
2832
{
2933
name.ThrowIfNull(nameof(name));
@@ -44,6 +48,26 @@ public CpuInfo(string name, string description, int physicalCoreCount, int logic
4448
{
4549
this.Caches = new List<CpuCacheInfo>(caches);
4650
}
51+
52+
if (flags != null)
53+
{
54+
this.Flags = flags;
55+
}
56+
57+
if (!double.IsNaN(maxFrequency))
58+
{
59+
this.MaxFrequencyMHz = maxFrequency;
60+
}
61+
62+
if (!double.IsNaN(minFrequency))
63+
{
64+
this.MinFrequencyMHz = minFrequency;
65+
}
66+
67+
if (!double.IsNaN(frequency))
68+
{
69+
this.FrequencyMHz = frequency;
70+
}
4771
}
4872

4973
/// <summary>
@@ -85,5 +109,25 @@ public CpuInfo(string name, string description, int physicalCoreCount, int logic
85109
/// The number of CPU sockets on the system.
86110
/// </summary>
87111
public int SocketCount { get; }
112+
113+
/// <summary>
114+
/// Dictionary of other information about CPU.
115+
/// </summary>
116+
public Dictionary<string, string> Flags { get; }
117+
118+
/// <summary>
119+
/// Maximum CPU frequency in MHz.
120+
/// </summary>
121+
public double MaxFrequencyMHz { get; set; } = double.NaN;
122+
123+
/// <summary>
124+
/// Minimum CPU frequency in MHz.
125+
/// </summary>
126+
public double MinFrequencyMHz { get; set; } = double.NaN;
127+
128+
/// <summary>
129+
/// Currrent frequency of CPU in MHz.
130+
/// </summary>
131+
public double FrequencyMHz { get; set; } = double.NaN;
88132
}
89133
}

0 commit comments

Comments
 (0)