Skip to content

Commit cdac233

Browse files
engine: aarch64 support
This patch adds basic support for aarch64 hosts. The 'Compatibility Versions' 4.2-4.8 provide * CPU architecture aarch64 * CPU type 'ARM64 V8.0' and 'ARM64 V8.2' 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 b1da8de commit cdac233

File tree

46 files changed

+284
-54
lines changed

Some content is hidden

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

46 files changed

+284
-54
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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ 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_VIRTIO_CCW_DISKS == countDisks(DiskInterface.VirtIO);
44+
hasMaximum = VmCommand.MAX_IDE_SLOTS == countDisks(DiskInterface.IDE);
45+
}
46+
4147
public boolean returnValue() {
4248
return hasMaximum;
4349
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public int getStaticOverheadInMb(VM vm) {
175175
int powerOf2 = Integer.highestOneBit(maxRam);
176176
pageTable = (maxRam > powerOf2 ? powerOf2 * 2 : powerOf2) / 64;
177177
} else {
178+
// TODO, aarch64
178179
pageTable = vmRam / 512;
179180
}
180181
return pageTable + fixedOverhead;

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/exportimport/ImportVmCommandTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,21 @@ private void setupCanImportPpcTest() {
208208
doReturn(true).when(cmd).validateImages(any());
209209
}
210210

211+
// TODO, aarch64 tests
212+
private void setupCanImportAarchTest() {
213+
setupDiskSpaceTest();
214+
215+
cmd.getParameters().getVm().setBiosType(BiosType.I440FX_SEA_BIOS);
216+
cmd.getParameters().getVm().setClusterArch(ArchitectureType.aarch64);
217+
Cluster cluster = new Cluster();
218+
cluster.setStoragePoolId(cmd.getParameters().getStoragePoolId());
219+
cluster.setArchitecture(ArchitectureType.aarch64);
220+
cluster.setCompatibilityVersion(Version.getLast());
221+
cluster.setBiosType(BiosType.I440FX_SEA_BIOS);
222+
doReturn(cluster).when(cmd).getCluster();
223+
doReturn(true).when(cmd).validateImages(any());
224+
}
225+
211226
@Test
212227
@MockedConfig("mockConfiguration")
213228
public void refuseSoundDeviceOnPPC() {

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

0 commit comments

Comments
 (0)