From: Luis Chamberlain <mcgrof@kernel.org>
To: Chuck Lever <cel@kernel.org>, Daniel Gomez <da.gomez@kruces.com>,
kdevops@lists.linux.dev
Cc: Luis Chamberlain <mcgrof@kernel.org>
Subject: [PATCH 17/23] reboot-limit: fix kexec and reboot connection handling
Date: Mon, 11 Aug 2025 15:24:44 -0700 [thread overview]
Message-ID: <20250811222452.2213071-18-mcgrof@kernel.org> (raw)
In-Reply-To: <20250811222452.2213071-1-mcgrof@kernel.org>
Replace shell-based kexec implementation with proper Ansible tasks
and fix connection handling for both systemctl reboot and kexec.
For kexec:
- Break down into discrete tasks to find kernel and initrd files
- Use stat module to check multiple possible locations
- Load kernel with kexec -l before executing systemctl kexec
- Use async execution to avoid connection failures
For both reboot types:
- Use async: 1 and poll: 0 to fire-and-forget the reboot command
- Add proper wait_for tasks to handle connection loss and recovery
- Wait for system to go down then come back up
This approach is more idiomatic Ansible and handles the SSH connection
properly during system reboots.
Generated-by: Claude AI
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
.../roles/reboot-limit/tasks/do-reboot.yml | 126 ++++++++++++++++++
1 file changed, 126 insertions(+)
diff --git a/playbooks/roles/reboot-limit/tasks/do-reboot.yml b/playbooks/roles/reboot-limit/tasks/do-reboot.yml
index ec5c9fc8..1e5ba925 100644
--- a/playbooks/roles/reboot-limit/tasks/do-reboot.yml
+++ b/playbooks/roles/reboot-limit/tasks/do-reboot.yml
@@ -21,14 +21,140 @@
become: yes
become_method: sudo
command: "systemctl reboot"
+ async: 1
+ poll: 0
when:
- reboot_limit_test_type == "systemctl_reboot"
tags: [ 'run_tests' ]
+- name: Wait for system to go down for reboot
+ wait_for:
+ host: "{{ ansible_host }}"
+ port: 22
+ state: stopped
+ delay: 5
+ timeout: 60
+ delegate_to: localhost
+ when:
+ - reboot_limit_test_type == "systemctl_reboot"
+ tags: [ 'run_tests' ]
+
+- name: Wait for system to come back after reboot
+ wait_for:
+ host: "{{ ansible_host }}"
+ port: 22
+ state: started
+ delay: 10
+ timeout: 300
+ delegate_to: localhost
+ when:
+ - reboot_limit_test_type == "systemctl_reboot"
+ tags: [ 'run_tests' ]
+
+# kexec tasks - prepare the kernel for kexec before rebooting
+- name: Get current kernel version for kexec
+ command: uname -r
+ register: current_kernel_version
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ tags: [ 'run_tests' ]
+
+- name: Check for kernel image locations for kexec
+ stat:
+ path: "{{ item }}"
+ register: kernel_stat
+ with_items:
+ - "/boot/vmlinuz-{{ current_kernel_version.stdout }}"
+ - "/boot/vmlinux-{{ current_kernel_version.stdout }}"
+ - "/boot/kernel-{{ current_kernel_version.stdout }}"
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ - current_kernel_version is defined
+ tags: [ 'run_tests' ]
+
+- name: Set kernel path for kexec
+ set_fact:
+ kexec_kernel_path: "{{ item.stat.path }}"
+ with_items: "{{ kernel_stat.results }}"
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ - item.stat.exists
+ tags: [ 'run_tests' ]
+
+- name: Check for initrd/initramfs locations for kexec
+ stat:
+ path: "{{ item }}"
+ register: initrd_stat
+ with_items:
+ - "/boot/initrd.img-{{ current_kernel_version.stdout }}"
+ - "/boot/initramfs-{{ current_kernel_version.stdout }}.img"
+ - "/boot/initrd-{{ current_kernel_version.stdout }}"
+ - "/boot/initrd-{{ current_kernel_version.stdout }}.img"
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ - current_kernel_version is defined
+ tags: [ 'run_tests' ]
+
+- name: Set initrd path for kexec
+ set_fact:
+ kexec_initrd_path: "{{ item.stat.path }}"
+ with_items: "{{ initrd_stat.results }}"
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ - item.stat.exists
+ tags: [ 'run_tests' ]
+
+- name: Read current kernel command line for kexec
+ slurp:
+ src: /proc/cmdline
+ register: cmdline_content
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ tags: [ 'run_tests' ]
+
+- name: Load kernel into kexec
+ become: yes
+ become_method: sudo
+ command: >
+ kexec -l {{ kexec_kernel_path }}
+ --initrd={{ kexec_initrd_path }}
+ --command-line="{{ cmdline_content.content | b64decode | trim }}"
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ - kexec_kernel_path is defined
+ - kexec_initrd_path is defined
+ tags: [ 'run_tests' ]
+
- name: Run the reboot test using systemctl kexec
become: yes
become_method: sudo
command: "systemctl kexec"
+ async: 1
+ poll: 0
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ tags: [ 'run_tests' ]
+
+- name: Wait for system to go down for kexec
+ wait_for:
+ host: "{{ ansible_host }}"
+ port: 22
+ state: stopped
+ delay: 5
+ timeout: 60
+ delegate_to: localhost
+ when:
+ - reboot_limit_test_type == "systemctl_kexec"
+ tags: [ 'run_tests' ]
+
+- name: Wait for system to come back after kexec
+ wait_for:
+ host: "{{ ansible_host }}"
+ port: 22
+ state: started
+ delay: 10
+ timeout: 300
+ delegate_to: localhost
when:
- reboot_limit_test_type == "systemctl_kexec"
tags: [ 'run_tests' ]
--
2.47.2
next prev parent reply other threads:[~2025-08-11 22:24 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-11 22:24 [PATCH 00/23] remove old kernel-ci and enhance reboot-limit Luis Chamberlain
2025-08-11 22:24 ` [PATCH 01/23] fstests: remove CONFIG_KERNEL_CI support Luis Chamberlain
2025-08-11 22:24 ` [PATCH 02/23] fstests: remove kernel-ci script symlinks Luis Chamberlain
2025-08-11 22:24 ` [PATCH 03/23] blktests: remove CONFIG_KERNEL_CI support Luis Chamberlain
2025-08-11 22:24 ` [PATCH 04/23] gitr: " Luis Chamberlain
2025-08-11 22:24 ` [PATCH 05/23] ltp: " Luis Chamberlain
2025-08-11 22:24 ` [PATCH 06/23] nfstest: " Luis Chamberlain
2025-08-11 22:24 ` [PATCH 07/23] pynfs: " Luis Chamberlain
2025-08-11 22:24 ` [PATCH 08/23] reboot-limit: convert CONFIG_KERNEL_CI to internal loop feature Luis Chamberlain
2025-08-11 22:24 ` [PATCH 09/23] kconfig: remove CONFIG_KERNEL_CI infrastructure Luis Chamberlain
2025-08-11 22:24 ` [PATCH 10/23] scripts: remove kernel-ci loop infrastructure Luis Chamberlain
2025-08-11 22:24 ` [PATCH 11/23] reboot-limit: simplify what gets selected Luis Chamberlain
2025-08-11 22:24 ` [PATCH 12/23] reboot-limit: add graph visualization support for results Luis Chamberlain
2025-08-11 22:24 ` [PATCH 13/23] reboot-limit: save graphs in organized results/graphs directory Luis Chamberlain
2025-08-11 22:24 ` [PATCH 14/23] docs: add comprehensive reboot-limit workflow documentation Luis Chamberlain
2025-08-11 22:24 ` [PATCH 15/23] reboot-limit: add kexec-tools dependency installation Luis Chamberlain
2025-08-11 22:24 ` [PATCH 16/23] reboot-limit: add A/B testing support targets Luis Chamberlain
2025-08-11 22:24 ` Luis Chamberlain [this message]
2025-08-11 22:24 ` [PATCH 18/23] reboot-limit: add COUNT parameter to override reboot count Luis Chamberlain
2025-08-11 22:24 ` [PATCH 19/23] reboot-limit: fix wait_for tasks using wrong host reference Luis Chamberlain
2025-08-11 22:24 ` [PATCH 20/23] reboot-limit: use ansible reboot module for all reboot types Luis Chamberlain
2025-08-11 22:24 ` [PATCH 21/23] reboot-limit: fix COUNT parameter to properly override reboot count Luis Chamberlain
2025-08-11 22:24 ` [PATCH 22/23] reboot-limit: handle empty dev group gracefully Luis Chamberlain
2025-08-11 22:24 ` [PATCH 23/23] reboot-limit: add kexec comparison feature Luis Chamberlain
2025-08-12 15:06 ` [PATCH 00/23] remove old kernel-ci and enhance reboot-limit Chuck Lever
2025-08-13 1:28 ` Luis Chamberlain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250811222452.2213071-18-mcgrof@kernel.org \
--to=mcgrof@kernel.org \
--cc=cel@kernel.org \
--cc=da.gomez@kruces.com \
--cc=kdevops@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox