Commit 67549b5d authored by Wez's avatar Wez Committed by Commit Bot

Allow runner scripts to fall-back to emulated CPU.

- Refactor the QemuTarget selection of CPU to emulate, to allow it to
  run x64 under software emulated CPU.
- Enable software-emulated-CPU fall-back by default, if /dev/kvm is not
  accessible for reading & writing.
- Add a require_kvm parameter to QemuTarget, and wire it to a common
  --qemu-require-kvm command-line argument.
- Add --qemu-require-kvm to the Fuchsia x64 builders, to ensure that we
  spot any regressions that break KVM on the bots.

Bug: 902607
Change-Id: I60f69b7cb7f5458ccf4a0a2d932235d823b6f932
Reviewed-on: https://chromium-review.googlesource.com/c/1318832Reviewed-by: default avatarDirk Pranke <dpranke@chromium.org>
Reviewed-by: default avatarKenneth Russell <kbr@chromium.org>
Commit-Queue: Wez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606157}
parent 3e356d0f
...@@ -60,6 +60,10 @@ def AddCommonArgs(arg_parser): ...@@ -60,6 +60,10 @@ def AddCommonArgs(arg_parser):
common_args.add_argument('--qemu-cpu-cores', type=int, default=4, common_args.add_argument('--qemu-cpu-cores', type=int, default=4,
help='Sets the number of CPU cores to provide if ' help='Sets the number of CPU cores to provide if '
'launching in a VM with QEMU.'), 'launching in a VM with QEMU.'),
common_args.add_argument('--qemu-require-kvm', action='store_true',
help='Disables fall-back to emulated CPU if the '
'host system does not support KVM acceleration.'),
def ConfigureLogging(args): def ConfigureLogging(args):
"""Configures the logging level based on command line |args|.""" """Configures the logging level based on command line |args|."""
...@@ -91,7 +95,8 @@ def GetDeploymentTargetForArgs(args): ...@@ -91,7 +95,8 @@ def GetDeploymentTargetForArgs(args):
if not args.device: if not args.device:
return QemuTarget(args.output_directory, args.target_cpu, return QemuTarget(args.output_directory, args.target_cpu,
args.qemu_cpu_cores, system_log_file) args.qemu_cpu_cores, system_log_file,
args.qemu_require_kvm)
else: else:
return DeviceTarget(args.output_directory, args.target_cpu, args.host, return DeviceTarget(args.output_directory, args.target_cpu, args.host,
args.port, args.ssh_config, system_log_file) args.port, args.ssh_config, system_log_file)
...@@ -35,7 +35,7 @@ def _GetAvailableTcpPort(): ...@@ -35,7 +35,7 @@ def _GetAvailableTcpPort():
class QemuTarget(target.Target): class QemuTarget(target.Target):
def __init__(self, output_dir, target_cpu, cpu_cores, system_log_file, def __init__(self, output_dir, target_cpu, cpu_cores, system_log_file,
ram_size_mb=2048): require_kvm, ram_size_mb=2048):
"""output_dir: The directory which will contain the files that are """output_dir: The directory which will contain the files that are
generated to support the QEMU deployment. generated to support the QEMU deployment.
target_cpu: The emulated target CPU architecture. target_cpu: The emulated target CPU architecture.
...@@ -45,6 +45,7 @@ class QemuTarget(target.Target): ...@@ -45,6 +45,7 @@ class QemuTarget(target.Target):
self._ram_size_mb = ram_size_mb self._ram_size_mb = ram_size_mb
self._system_log_file = system_log_file self._system_log_file = system_log_file
self._cpu_cores = cpu_cores self._cpu_cores = cpu_cores
self._require_kvm = require_kvm
def __enter__(self): def __enter__(self):
return self return self
...@@ -101,11 +102,10 @@ class QemuTarget(target.Target): ...@@ -101,11 +102,10 @@ class QemuTarget(target.Target):
'-append', ' '.join(kernel_args) '-append', ' '.join(kernel_args)
] ]
# Configure the machine & CPU to emulate, based on the target architecture. # Configure the machine to emulate, based on the target architecture.
if self._target_cpu == 'arm64': if self._target_cpu == 'arm64':
qemu_command.extend([ qemu_command.extend([
'-machine','virt', '-machine','virt',
'-cpu', 'cortex-a53',
]) ])
netdev_type = 'virtio-net-pci' netdev_type = 'virtio-net-pci'
else: else:
...@@ -114,15 +114,21 @@ class QemuTarget(target.Target): ...@@ -114,15 +114,21 @@ class QemuTarget(target.Target):
]) ])
netdev_type = 'e1000' netdev_type = 'e1000'
# On Linux, enable lightweight virtualization (KVM) if the host and guest # Configure the CPU to emulate.
# architectures are the same. # On Linux, we can enable lightweight virtualization (KVM) if the host and
if sys.platform.startswith('linux'): # guest architectures are the same.
if self._target_cpu == 'arm64' and platform.machine() == 'aarch64': enable_kvm = self._require_kvm or (sys.platform.startswith('linux') and (
qemu_command.append('-enable-kvm') (self._target_cpu == 'arm64' and platform.machine() == 'aarch64') or
elif self._target_cpu == 'x64' and platform.machine() == 'x86_64': (self._target_cpu == 'x64' and platform.machine() == 'x86_64')) and
qemu_command.extend([ os.access('/dev/kvm', os.R_OK | os.W_OK))
'-enable-kvm', '-cpu', 'host,migratable=no', if enable_kvm:
]) qemu_command.extend(['-enable-kvm', '-cpu', 'host,migratable=no'])
else:
logging.warning('Unable to launch QEMU with KVM acceleration.')
if self._target_cpu == 'arm64':
qemu_command.extend(['-cpu', 'cortex-a53'])
else:
qemu_command.extend(['-cpu', 'Haswell,+smap,-check,-fsgsbase'])
# Configure virtual network. It is used in the tests to connect to # Configure virtual network. It is used in the tests to connect to
# testserver running on the host. # testserver running on the host.
......
...@@ -650,6 +650,9 @@ ...@@ -650,6 +650,9 @@
], ],
"gtest_tests": [ "gtest_tests": [
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -662,7 +665,8 @@ ...@@ -662,7 +665,8 @@
}, },
{ {
"args": [ "args": [
"--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter",
"--qemu-require-kvm"
], ],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
...@@ -675,6 +679,9 @@ ...@@ -675,6 +679,9 @@
"test": "content_unittests" "test": "content_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -686,6 +693,9 @@ ...@@ -686,6 +693,9 @@
"test": "cronet_tests" "test": "cronet_tests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -697,6 +707,9 @@ ...@@ -697,6 +707,9 @@
"test": "cronet_unittests" "test": "cronet_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -708,6 +721,9 @@ ...@@ -708,6 +721,9 @@
"test": "crypto_unittests" "test": "crypto_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -720,7 +736,8 @@ ...@@ -720,7 +736,8 @@
}, },
{ {
"args": [ "args": [
"--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter" "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ipc_tests.filter",
"--qemu-require-kvm"
], ],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
...@@ -733,6 +750,9 @@ ...@@ -733,6 +750,9 @@
"test": "ipc_tests" "test": "ipc_tests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -745,7 +765,8 @@ ...@@ -745,7 +765,8 @@
}, },
{ {
"args": [ "args": [
"--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter",
"--qemu-require-kvm"
], ],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
...@@ -758,6 +779,9 @@ ...@@ -758,6 +779,9 @@
"test": "mojo_unittests" "test": "mojo_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -769,6 +793,9 @@ ...@@ -769,6 +793,9 @@
"test": "service_manager_unittests" "test": "service_manager_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -780,6 +807,9 @@ ...@@ -780,6 +807,9 @@
"test": "skia_unittests" "test": "skia_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -792,7 +822,8 @@ ...@@ -792,7 +822,8 @@
}, },
{ {
"args": [ "args": [
"--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter",
"--qemu-require-kvm"
], ],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
...@@ -805,6 +836,9 @@ ...@@ -805,6 +836,9 @@
"test": "ui_base_unittests" "test": "ui_base_unittests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
...@@ -816,6 +850,9 @@ ...@@ -816,6 +850,9 @@
"test": "webrunner_browsertests" "test": "webrunner_browsertests"
}, },
{ {
"args": [
"--qemu-require-kvm"
],
"swarming": { "swarming": {
"can_use_on_swarming_builders": true, "can_use_on_swarming_builders": true,
"dimension_sets": [ "dimension_sets": [
......
...@@ -2593,6 +2593,9 @@ ...@@ -2593,6 +2593,9 @@
'additional_compile_targets': [ 'additional_compile_targets': [
'all', 'all',
], ],
'args': [
'--qemu-require-kvm',
],
'swarming': { 'swarming': {
'dimension_sets': [ 'dimension_sets': [
{ {
...@@ -2609,6 +2612,9 @@ ...@@ -2609,6 +2612,9 @@
'cast_shell', 'cast_shell',
'cast_test_lists', 'cast_test_lists',
], ],
'args': [
'--qemu-require-kvm',
],
}, },
'Leak Detection Linux': { 'Leak Detection Linux': {
'test_suites': { 'test_suites': {
......
...@@ -119,7 +119,7 @@ class _TargetHost(object): ...@@ -119,7 +119,7 @@ class _TargetHost(object):
try: try:
self._target = None self._target = None
self._target = qemu_target.QemuTarget( self._target = qemu_target.QemuTarget(
build_path, 'x64', ram_size_mb=8192) build_path, 'x64', require_kvm=True, ram_size_mb=8192)
self._target.Start() self._target.Start()
self._setup_target(build_path, ports_to_forward) self._setup_target(build_path, ports_to_forward)
except: except:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment