summaryrefslogtreecommitdiffstats
path: root/meta/lib
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2021-05-26 14:03:55 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-06-11 23:50:59 +0100
commit37be8268f9439ac5b4aec3f6bb49ae923105791d (patch)
treeab318fb4bbaa2daefcd2221852b7322d651b8ff2 /meta/lib
parent576ddf658de696b68bf136d550e9e68ab072552f (diff)
downloadpoky-37be8268f9439ac5b4aec3f6bb49ae923105791d.tar.gz
qemurunner: Try to ensure mmap'd libs are paged in
We've seeing issues where IO load appears to cause strange failures due to timeouts within qemu. One theory for these is that it is is hitting hard page faults at in-opportune moments which cause timing problems within the VM. This patch is a bit of a hack which tries to ensure the data is paged in at a point when we know we can take the time delays (waiting for the QMP start signal). Whilst this isn't ideal, it does seem to improve things on the autobuilder and shouldn't harm anything. The code figures out which files to read my looking at the mmap'd files the process has open from /proc. On Centos7 systems these files are not user readable, if that is the case we just skip them. (From OE-Core rev: e77844314d09ceff9c22338d366519928f4f7284) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib')
-rw-r--r--meta/lib/oeqa/utils/qemurunner.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index 0032f6ed8d..24af2fb20b 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -342,7 +342,24 @@ class QemuRunner:
342 finally: 342 finally:
343 os.chdir(origpath) 343 os.chdir(origpath)
344 344
345 # Release the qemu porcess to continue running 345 # We worry that mmap'd libraries may cause page faults which hang the qemu VM for periods
346 # causing failures. Before we "start" qemu, read through it's mapped files to try and
347 # ensure we don't hit page faults later
348 mapdir = "/proc/" + str(self.qemupid) + "/map_files/"
349 try:
350 for f in os.listdir(mapdir):
351 linktarget = os.readlink(os.path.join(mapdir, f))
352 if not linktarget.startswith("/") or linktarget.startswith("/dev") or "deleted" in linktarget:
353 continue
354 with open(linktarget, "rb") as readf:
355 data = True
356 while data:
357 data = readf.read(4096)
358 # Centos7 doesn't allow us to read /map_files/
359 except PermissionError:
360 pass
361
362 # Release the qemu process to continue running
346 self.run_monitor('cont') 363 self.run_monitor('cont')
347 364
348 # We are alive: qemu is running 365 # We are alive: qemu is running