Mesa (main): ci/bare-metal: Get rid of servo's serial feed threads.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 21 22:18:46 UTC 2022


Module: Mesa
Branch: main
Commit: 3f8114d1e01aa49ab1b705084f8a9c2ea2fbbc2a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3f8114d1e01aa49ab1b705084f8a9c2ea2fbbc2a

Author: Emma Anholt <emma at anholt.net>
Date:   Thu Jun 16 14:05:38 2022 -0700

ci/bare-metal: Get rid of servo's serial feed threads.

If the SerialBuffers can just feed the same line queue, then we don't need
the extra threads reading line queues into a new merged line queue.

Less python threading code is always better.  Plus, now we can pass args
to SerialBuffer.lines() for timeout/phase.

Acked-by: Juan A. Suarez <jasuarez at igalia.com>
Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17096>

---

 .gitlab-ci/bare-metal/cros_servo_run.py | 53 ++++++++-------------------------
 .gitlab-ci/bare-metal/serial_buffer.py  | 10 +++++--
 2 files changed, 20 insertions(+), 43 deletions(-)

diff --git a/.gitlab-ci/bare-metal/cros_servo_run.py b/.gitlab-ci/bare-metal/cros_servo_run.py
index c9212a2b74a..0e231ecfa72 100755
--- a/.gitlab-ci/bare-metal/cros_servo_run.py
+++ b/.gitlab-ci/bare-metal/cros_servo_run.py
@@ -32,51 +32,16 @@ import threading
 
 class CrosServoRun:
     def __init__(self, cpu, ec):
-        # Merged FIFO for the two serial buffers, fed by threads.
-        self.serial_queue = queue.Queue()
-        self.sentinel = object()
-        self.threads_done = 0
-
-        self.ec_ser = SerialBuffer(
-            ec, "results/serial-ec.txt", "R SERIAL-EC> ")
         self.cpu_ser = SerialBuffer(
             cpu, "results/serial.txt", "R SERIAL-CPU> ")
-
-        self.iter_feed_ec = threading.Thread(
-            target=self.iter_feed_queue, daemon=True, args=(self.ec_ser.lines(),))
-        self.iter_feed_ec.start()
-
-        self.iter_feed_cpu = threading.Thread(
-            target=self.iter_feed_queue, daemon=True, args=(self.cpu_ser.lines(),))
-        self.iter_feed_cpu.start()
+        # Merge the EC serial into the cpu_ser's line stream so that we can
+        # effectively poll on both at the same time and not have to worry about
+        self.ec_ser = SerialBuffer(
+            ec, "results/serial-ec.txt", "R SERIAL-EC> ", line_queue=self.cpu_ser.line_queue)
 
     def close(self):
         self.ec_ser.close()
         self.cpu_ser.close()
-        self.iter_feed_ec.join()
-        self.iter_feed_cpu.join()
-
-    # Feed lines from our serial queues into the merged queue, marking when our
-    # input is done.
-    def iter_feed_queue(self, it):
-        for i in it:
-            self.serial_queue.put(i)
-        self.serial_queue.put(self.sentinel)
-
-    # Return the next line from the queue, counting how many threads have
-    # terminated and joining when done
-    def get_serial_queue_line(self):
-        line = self.serial_queue.get()
-        if line == self.sentinel:
-            self.threads_done = self.threads_done + 1
-            if self.threads_done == 2:
-                self.iter_feed_cpu.join()
-                self.iter_feed_ec.join()
-        return line
-
-    # Returns an iterator for getting the next line.
-    def serial_queue_lines(self):
-        return iter(self.get_serial_queue_line, self.sentinel)
 
     def ec_write(self, s):
         print("W SERIAL-EC> %s" % s)
@@ -96,12 +61,14 @@ class CrosServoRun:
         self.ec_write("\n")
         self.ec_write("reboot\n")
 
+        bootloader_done = False
         # This is emitted right when the bootloader pauses to check for input.
         # Emit a ^N character to request network boot, because we don't have a
         # direct-to-netboot firmware on cheza.
-        for line in self.serial_queue_lines():
+        for line in self.cpu_ser.lines(timeout=120, phase="bootloader"):
             if re.search("load_archive: loading locale_en.bin", line):
                 self.cpu_write("\016")
+                bootloader_done = True
                 break
 
             # The Cheza boards have issues with failing to bring up power to
@@ -112,8 +79,12 @@ class CrosServoRun:
                     "Detected intermittent poweron failure, restarting run...")
                 return 2
 
+        if not bootloader_done:
+            print("Failed to make it through bootloader, restarting run...")
+            return 2
+
         tftp_failures = 0
-        for line in self.serial_queue_lines():
+        for line in self.cpu_ser.lines(timeout=120 * 60, phase="test"):
             if re.search("---. end Kernel panic", line):
                 return 1
 
diff --git a/.gitlab-ci/bare-metal/serial_buffer.py b/.gitlab-ci/bare-metal/serial_buffer.py
index 1dc7596df66..b21ce6e6ef1 100755
--- a/.gitlab-ci/bare-metal/serial_buffer.py
+++ b/.gitlab-ci/bare-metal/serial_buffer.py
@@ -30,7 +30,7 @@ import time
 
 
 class SerialBuffer:
-    def __init__(self, dev, filename, prefix, timeout=None):
+    def __init__(self, dev, filename, prefix, timeout=None, line_queue=None):
         self.filename = filename
         self.dev = dev
 
@@ -42,7 +42,13 @@ class SerialBuffer:
             self.serial = None
 
         self.byte_queue = queue.Queue()
-        self.line_queue = queue.Queue()
+        # allow multiple SerialBuffers to share a line queue so you can merge
+        # servo's CPU and EC streams into one thing to watch the boot/test
+        # progress on.
+        if line_queue:
+            self.line_queue = line_queue
+        else:
+            self.line_queue = queue.Queue()
         self.prefix = prefix
         self.timeout = timeout
         self.sentinel = object()



More information about the mesa-commit mailing list