Skip to content

Commit ecc4c68

Browse files
engine: aarch64 support
This patch adds basic support for aarch64 hosts. The 'Compatibility Version' 4.8 provides * CPU architecture aarch64 * CPU type 'ARM64 V8' CPU model/feature detection is based on the asmid flag. Several architecture specific settings have initial values and should be validated. The intended scope of this patch is to add initial aarch64 support and a starting point for further aarch64 related patches. Co-authored-by: Richard Treu <[email protected]> Signed-off-by: Michael Trapp <[email protected]>
1 parent 4fbfd07 commit ecc4c68

File tree

43 files changed

+231
-30
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+231
-30
lines changed

backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CpuFlagsManagerHandler.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,18 @@ private static class CpuFlagsManager {
157157
private List<ServerCpu> amdCpuList;
158158
private List<ServerCpu> ibmCpuList;
159159
private List<ServerCpu> s390CpuList;
160+
private List<ServerCpu> armCpuList;
160161
private List<ServerCpu> allCpuList = new ArrayList<>();
161162
private Map<String, ServerCpu> intelCpuByNameDictionary = new HashMap<>();
162163
private Map<String, ServerCpu> amdCpuByNameDictionary = new HashMap<>();
163164
private Map<String, ServerCpu> ibmCpuByNameDictionary = new HashMap<>();
164165
private Map<String, ServerCpu> s390CpuByNameDictionary = new HashMap<>();
166+
private Map<String, ServerCpu> armCpuByNameDictionary = new HashMap<>();
165167
private Map<String, ServerCpu> intelCpuByVdsNameDictionary = new HashMap<>();
166168
private Map<String, ServerCpu> amdCpuByVdsNameDictionary = new HashMap<>();
167169
private Map<String, ServerCpu> ibmCpuByVdsNameDictionary = new HashMap<>();
168170
private Map<String, ServerCpu> s390CpuByVdsNameDictionary = new HashMap<>();
171+
private Map<String, ServerCpu> armCpuByVdsNameDictionary = new HashMap<>();
169172

170173
public CpuFlagsManager(Version ver) {
171174
initDictionaries(ver);
@@ -200,6 +203,8 @@ public String getVendorByCpuName(String cpuName) {
200203
result = CpuVendor.IBM.name();
201204
} else if (s390CpuByNameDictionary.get(cpuName) != null) {
202205
result = CpuVendor.IBMS390.name();
206+
} else if (armCpuByNameDictionary.get(cpuName) != null) {
207+
result = CpuVendor.AARCH64.name();
203208
}
204209
}
205210
return result;
@@ -222,6 +227,10 @@ public ServerCpu getServerCpuByName(String cpuName) {
222227
if (result == null) {
223228
result = s390CpuByNameDictionary.get(cpuName);
224229
}
230+
231+
if (result == null) {
232+
result = armCpuByNameDictionary.get(cpuName);
233+
}
225234
}
226235
return result;
227236
}
@@ -233,6 +242,7 @@ public void initDictionaries(Version ver) {
233242
amdCpuByNameDictionary.clear();
234243
ibmCpuByNameDictionary.clear();
235244
s390CpuByNameDictionary.clear();
245+
armCpuByNameDictionary.clear();
236246
allCpuList.clear();
237247

238248
String[] cpus = Config.<String> getValue(ConfigValues.ServerCPUList, ver.toString()).trim().split("[;]", -1);
@@ -271,6 +281,9 @@ public void initDictionaries(Version ver) {
271281
} else if (sc.getFlags().contains(CpuVendor.IBMS390.getFlag())) {
272282
s390CpuByNameDictionary.put(sc.getCpuName(), sc);
273283
s390CpuByVdsNameDictionary.put(sc.getVdsVerbData(), sc);
284+
} else if (sc.getFlags().contains(CpuVendor.AARCH64.getFlag())) {
285+
armCpuByNameDictionary.put(sc.getCpuName(), sc);
286+
armCpuByVdsNameDictionary.put(sc.getVdsVerbData(), sc);
274287
}
275288

276289
allCpuList.add(sc);
@@ -283,6 +296,7 @@ public void initDictionaries(Version ver) {
283296
amdCpuList = new ArrayList<>(amdCpuByNameDictionary.values());
284297
ibmCpuList = new ArrayList<>(ibmCpuByNameDictionary.values());
285298
s390CpuList = new ArrayList<>(s390CpuByNameDictionary.values());
299+
armCpuList = new ArrayList<>(armCpuByNameDictionary.values());
286300

287301
Comparator<ServerCpu> cpuComparator = Comparator.comparingInt(ServerCpu::getLevel);
288302

@@ -292,6 +306,7 @@ public void initDictionaries(Version ver) {
292306
Collections.sort(amdCpuList, cpuComparator);
293307
Collections.sort(ibmCpuList, cpuComparator);
294308
Collections.sort(s390CpuList, cpuComparator);
309+
Collections.sort(armCpuList, cpuComparator);
295310
}
296311

297312
public String getVDSVerbDataByCpuName(String name) {
@@ -301,7 +316,8 @@ public String getVDSVerbDataByCpuName(String name) {
301316
if ((sc = intelCpuByNameDictionary.get(name)) != null
302317
|| (sc = amdCpuByNameDictionary.get(name)) != null
303318
|| (sc = ibmCpuByNameDictionary.get(name)) != null
304-
|| (sc = s390CpuByNameDictionary.get(name)) != null) {
319+
|| (sc = s390CpuByNameDictionary.get(name)) != null
320+
|| (sc = armCpuByNameDictionary.get(name)) != null) {
305321
result = sc.getVdsVerbData();
306322
}
307323
}
@@ -315,7 +331,8 @@ public String getCpuNameByCpuId(String vdsName) {
315331
if ((sc = intelCpuByVdsNameDictionary.get(vdsName)) != null
316332
|| (sc = amdCpuByVdsNameDictionary.get(vdsName)) != null
317333
|| (sc = ibmCpuByVdsNameDictionary.get(vdsName)) != null
318-
|| (sc = s390CpuByVdsNameDictionary.get(vdsName)) != null) {
334+
|| (sc = s390CpuByVdsNameDictionary.get(vdsName)) != null
335+
|| (sc = armCpuByVdsNameDictionary.get(vdsName)) != null) {
319336
result = sc.getCpuName();
320337
}
321338
}
@@ -346,6 +363,7 @@ public List<String> missingServerCpuFlags(String clusterCpuName, String serverFl
346363
|| (clusterCpu = amdCpuByNameDictionary.get(clusterCpuName)) != null
347364
|| (clusterCpu = ibmCpuByNameDictionary.get(clusterCpuName)) != null
348365
|| (clusterCpu = s390CpuByNameDictionary.get(clusterCpuName)) != null
366+
|| (clusterCpu = armCpuByNameDictionary.get(clusterCpuName)) != null
349367
)) {
350368
for (String flag : clusterCpu.getFlags()) {
351369
if (!lstServerflags.contains(flag)) {
@@ -393,6 +411,10 @@ public boolean checkIfCpusSameManufacture(String cpuName1, String cpuName2) {
393411
return s390CpuByNameDictionary.containsKey(cpuName2);
394412
}
395413

414+
if (armCpuByNameDictionary.containsKey(cpuName1)) {
415+
return armCpuByNameDictionary.containsKey(cpuName2);
416+
}
417+
396418
return false;
397419
}
398420

@@ -401,7 +423,8 @@ public boolean checkIfCpusExist(String cpuName) {
401423
&& (intelCpuByNameDictionary.containsKey(cpuName)
402424
|| amdCpuByNameDictionary.containsKey(cpuName)
403425
|| ibmCpuByNameDictionary.containsKey(cpuName)
404-
|| s390CpuByNameDictionary.containsKey(cpuName));
426+
|| s390CpuByNameDictionary.containsKey(cpuName)
427+
|| armCpuByNameDictionary.containsKey(cpuName));
405428
}
406429

407430
/**
@@ -441,6 +464,12 @@ public List<ServerCpu> findServerCpusByFlags(String flags) {
441464
foundCpus.add(s390CpuList.get(i));
442465
}
443466
}
467+
} else if (lstFlags.contains(CpuVendor.AARCH64.getFlag())) {
468+
for (int i = armCpuList.size() - 1; i >= 0; i--) {
469+
if (checkIfFlagsContainsCpuFlags(armCpuList.get(i), lstFlags)) {
470+
foundCpus.add(armCpuList.get(i));
471+
}
472+
}
444473
}
445474
return foundCpus;
446475
}
@@ -478,6 +507,12 @@ public List<ServerCpu> getSupportedServerCpuList(String maxCpuName) {
478507
for (int i = 0; i <= selectedCpuIndex; i++) {
479508
supportedCpus.add(s390CpuList.get(i));
480509
}
510+
} else if (armCpuByNameDictionary.containsKey(maxCpuName)) {
511+
ServerCpu selected = armCpuByNameDictionary.get(maxCpuName);
512+
int selectedCpuIndex = armCpuList.indexOf(selected);
513+
for (int i = 0; i <= selectedCpuIndex; i++) {
514+
supportedCpus.add(armCpuList.get(i));
515+
}
481516
}
482517
return supportedCpus;
483518

backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/architecture/HasMaximumNumberOfDisks.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public void runForS390X() {
3838
hasMaximum = VmCommand.MAX_VIRTIO_CCW_DISKS == countDisks(DiskInterface.VirtIO);
3939
}
4040

41+
@Override
42+
public void runForAARCH64() {
43+
hasMaximum = VmCommand.MAX_IDE_SLOTS == countDisks(DiskInterface.IDE);
44+
}
45+
4146
public boolean returnValue() {
4247
return hasMaximum;
4348
}

backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ private static Map<String, Integer> createMaxNumberOfVmCpusMap() {
171171
maxVmCpusMap.put("s390x", 384);
172172
maxVmCpusMap.put("x86", 512);
173173
maxVmCpusMap.put("ppc", 384);
174+
maxVmCpusMap.put("aarch64", 384);
174175
return maxVmCpusMap;
175176
}
176177

@@ -179,6 +180,7 @@ private static Map<String, String> createHotPlugMemorySupportedMap() {
179180
hotPlugMemoryMap.put("s390x", "false");
180181
hotPlugMemoryMap.put("x86", "true");
181182
hotPlugMemoryMap.put("ppc", "true");
183+
hotPlugMemoryMap.put("aarch64", "true");
182184
return hotPlugMemoryMap;
183185
}
184186

backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/utils/CompatibilityVersionUpdaterTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ private static Map<String, Integer> createMaxNumberOfVmCpusMap() {
4949
maxVmCpusMap.put("s390x", 384);
5050
maxVmCpusMap.put("x86", 710);
5151
maxVmCpusMap.put("ppc", 384);
52+
maxVmCpusMap.put("aarch64", 384);
5253
return maxVmCpusMap;
5354
}
5455

backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/VmValidatorTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ private static Map<String, Integer> createMaxNumberOfVmCpusMap() {
7171
maxVmCpusMap.put("s390x", 384);
7272
maxVmCpusMap.put("x86", MAX_NUM_CPUS);
7373
maxVmCpusMap.put("ppc", 384);
74+
maxVmCpusMap.put("aarch64", 384);
7475
return maxVmCpusMap;
7576
}
7677

backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/utils/ovf/OvfManagerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ private static Map<String, Integer> createMaxNumberOfVmCpusMap() {
8585
maxVmCpusMap.put("s390x", 384);
8686
maxVmCpusMap.put("x86", 16);
8787
maxVmCpusMap.put("ppc", 384);
88+
maxVmCpusMap.put("aarch64", 384);
8889
return maxVmCpusMap;
8990
}
9091

backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ArchitectureType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public enum ArchitectureType implements Identifiable {
1414
ppc(3),
1515
/* Host & Guest architecture */
1616
s390x(7),
17+
/* Host & Guest architecture */
18+
aarch64(8),
1719

1820
// Specific architectures
1921
/* Host & Guest architecture */
@@ -25,6 +27,7 @@ public enum ArchitectureType implements Identifiable {
2527
/* Guest architecture */
2628
ppcle(6, ppc);
2729

30+
public static final int HOTPLUG_MEMORY_FACTOR_ARM_MB = 128;
2831
public static final int HOTPLUG_MEMORY_FACTOR_PPC_MB = 256;
2932
public static final int HOTPLUG_MEMORY_FACTOR_X86_MB = 128;
3033
private int value;
@@ -64,6 +67,8 @@ public int getHotplugMemorySizeFactorMb() {
6467
return HOTPLUG_MEMORY_FACTOR_X86_MB;
6568
case ppc:
6669
return HOTPLUG_MEMORY_FACTOR_PPC_MB;
70+
case aarch64:
71+
return HOTPLUG_MEMORY_FACTOR_ARM_MB;
6772
default:
6873
return getFamily().getHotplugMemorySizeFactorMb();
6974
}

backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public interface OsRepository {
2323
int DEFAULT_X86_OS = 0;
2424
int DEFAULT_PPC_OS = 1001;
2525
int DEFAULT_S390_OS = 2001;
26+
int DEFAULT_AARCH64_OS = 3001;
2627

2728
/*
2829
* This value is used to enable the auto selection of an appropriate OS when

backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/CpuVendor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public enum CpuVendor implements Serializable {
88
INTEL("vmx"),
99
AMD("svm"),
1010
IBM("powernv"),
11-
IBMS390("sie");
11+
IBMS390("sie"),
12+
AARCH64("asimd");
1213

1314
private final String flag;
1415

backend/manager/modules/restapi/jaxrs/src/main/resources/v3/capabilities.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,10 @@
366366
<level>3</level>
367367
<architecture>PPC64</architecture>
368368
</cpu>
369+
<cpu id="ARM64 v8">
370+
<level>2</level>
371+
<architecture>AARCH64</architecture>
372+
</cpu>
369373
</cpus>
370374
<power_managers>
371375
<power_management type="apc">
@@ -545,6 +549,7 @@
545549
<os_type>ubuntu_13_04</os_type>
546550
<os_type>ubuntu_12_10</os_type>
547551
<os_type>windows_7x64</os_type>
552+
<os_type>other_linux_aarch64</os_type>
548553
</os_types>
549554
<disk_formats>
550555
<disk_format>cow</disk_format>
@@ -1236,18 +1241,21 @@
12361241
<architectures>undefined</architectures>
12371242
<architectures>x86_64</architectures>
12381243
<architectures>ppc64</architectures>
1244+
<architectures>aarch64</architectures>
12391245
</architecture_capability>
12401246
<architecture_capability>
12411247
<name>memory snapshot</name>
12421248
<architectures>undefined</architectures>
12431249
<architectures>x86_64</architectures>
12441250
<architectures>ppc64</architectures>
1251+
<architectures>aarch64</architectures>
12451252
</architecture_capability>
12461253
<architecture_capability>
12471254
<name>suspend</name>
12481255
<architectures>undefined</architectures>
12491256
<architectures>x86_64</architectures>
12501257
<architectures>ppc64</architectures>
1258+
<architectures>aarch64</architectures>
12511259
</architecture_capability>
12521260
</architecture_capabilities>
12531261
<serial_number_policies>

0 commit comments

Comments
 (0)