From fbab659f2a2ff5c29a38ecc546cfb7e7be54037f Mon Sep 17 00:00:00 2001 From: Swarna Prabhu Date: Thu, 24 Apr 2025 16:58:09 +0000 Subject: [PATCH] gen_node: add debugger support for guestfs libvirt guests The motivation behind enabling the support for the debugger is to make kdevops user friendly for bug fixing and troubleshooting, thereby saving the time needed to configure guest during bringup. When enabled, libvirt_gdb_baseport is assigned with a base port number extracted from the md5sum of the script get_gdb_base_port.sh to which we add an index for every guest during gen_nodes bringup. The bringup is also modified to verify that no port conflict exists and if does, will fail informing the user to change the base port. This feature is disabled by default as kdevops is heavily used by CI where this support is not needed. However for folks relying on kdevops for kernel development and testing, can now leverage this option to help with debugging. Signed-off-by: Swarna Prabhu --- kconfigs/Kconfig.libvirt | 25 ++++++++++++++++++ playbooks/roles/gen_nodes/defaults/main.yml | 3 +++ playbooks/roles/gen_nodes/tasks/main.yml | 26 +++++++++++++++++++ .../gen_nodes/templates/guestfs_q35.j2.xml | 4 +++ .../gen_nodes/templates/guestfs_virt.j2.xml | 4 +++ scripts/get_gdb_base_port.sh | 13 ++++++++++ 6 files changed, 75 insertions(+) create mode 100755 scripts/get_gdb_base_port.sh diff --git a/kconfigs/Kconfig.libvirt b/kconfigs/Kconfig.libvirt index cba8abf1e..955399e6c 100644 --- a/kconfigs/Kconfig.libvirt +++ b/kconfigs/Kconfig.libvirt @@ -1104,6 +1104,31 @@ config LIBVIRT_STORAGE_POOL_NAME For instance you may want to use a volume name of "data2" for a path on a partition on /data2/ or something like that. +config LIBVIRT_ENABLE_GDB + bool "Enable GDB debugging for the guest" + output yaml + help + Select this option if you want to enable debugging support for GDB. + By default , it is assumed that gdb is disabled since we dont want + to complicate this for the CI runs. If enabled then libvirt guest + xml for each guest will be configured to use gdb on a specific + tcp port. + +config LIBVIRT_GDB_BASEPORT + int + default $(shell, ./scripts/get_gdb_base_port.sh) if LIBVIRT + output yaml + depends on LIBVIRT_ENABLE_GDB + help + This option defines the base port to be used for the GDB. + Esentially we need to make QEMU listen for an incoming connection from + gdb on a TCP port. The default port is chosen to be 1234. However we + introduce variability for assigning the port to each guest by defining + a base port and adding an index to it based on the number of libvrt guest + nodes. Therefore the base port is extracted from the md5sum of the + /scripts/get_gdb_base_port.sh file and use the last 4 digits of the md5sum + of the file to assign to libvirt_gdb_baseport. + source "kconfigs/Kconfig.libvirt.zns" source "kconfigs/Kconfig.libvirt.largeio" source "kconfigs/Kconfig.libvirt.cxl" diff --git a/playbooks/roles/gen_nodes/defaults/main.yml b/playbooks/roles/gen_nodes/defaults/main.yml index 8ff9b8799..6a899be45 100644 --- a/playbooks/roles/gen_nodes/defaults/main.yml +++ b/playbooks/roles/gen_nodes/defaults/main.yml @@ -27,6 +27,9 @@ vagrant_box: "debian/testing64" vagrant_box_version: "" libvirt_vcpus_count: 8 libvirt_mem_mb: 4096 +gdb_port_conflict: False +libvirt_enable_gdb: False +libvirt_gdb_baseport: 1234 qemu_bin_path: "/usr/bin/qemu-system-x86_64" extra_disk_path: ".vagrant/nvme_disks" extra_disk_driver: "nvme" diff --git a/playbooks/roles/gen_nodes/tasks/main.yml b/playbooks/roles/gen_nodes/tasks/main.yml index d541dcbf1..9312fef3e 100644 --- a/playbooks/roles/gen_nodes/tasks/main.yml +++ b/playbooks/roles/gen_nodes/tasks/main.yml @@ -561,13 +561,39 @@ - kdevops_enable_guestfs|bool - pcie_passthrough_enable|bool +- name: Find if port conflict occur + ansible.builtin.shell: "ss -ltn | grep ':{{ (libvirt_gdb_baseport | int) + (idx | int) }} '" + register: gdb_port_reg + failed_when: false + changed_when: false + loop: "{{ guestfs_nodes }}" + loop_control: + index_var: idx + when: + - kdevops_enable_guestfs|bool + +- name: Set the conflict flag on if conflict occur + set_fact: + gdb_port_conflict: True + when: > + gdb_port_reg.results is defined and + gdb_port_reg.results | selectattr('rc', 'equalto', 0) | list | length > 0 + +- name: Fail bringup if gdb port conflict occur + fail: + msg: "GDB port conflict occur, please check the base port number {{ libvirt_gdb_baseport }} and try with another" + when: gdb_port_conflict|bool + - name: Generate XML files for the libvirt guests vars: hostname: "{{ item.name }}" + guestidx: "{{ idx }}" template: src: "guestfs_{{ libvirt_machine_type }}.j2.xml" dest: "{{ topdir_path }}/guestfs/{{ hostname }}/{{ hostname }}.xml" force: yes with_items: "{{ guestfs_nodes }}" + loop_control: + index_var: idx when: - kdevops_enable_guestfs|bool diff --git a/playbooks/roles/gen_nodes/templates/guestfs_q35.j2.xml b/playbooks/roles/gen_nodes/templates/guestfs_q35.j2.xml index adaba9188..698225dd5 100644 --- a/playbooks/roles/gen_nodes/templates/guestfs_q35.j2.xml +++ b/playbooks/roles/gen_nodes/templates/guestfs_q35.j2.xml @@ -184,6 +184,10 @@ + {% if libvirt_enable_gdb %} + + + {% endif %} {% include './templates/gen_drives.j2' %} diff --git a/playbooks/roles/gen_nodes/templates/guestfs_virt.j2.xml b/playbooks/roles/gen_nodes/templates/guestfs_virt.j2.xml index 1061f2cc4..29818ea85 100644 --- a/playbooks/roles/gen_nodes/templates/guestfs_virt.j2.xml +++ b/playbooks/roles/gen_nodes/templates/guestfs_virt.j2.xml @@ -173,6 +173,10 @@ + {% if libvirt_enable_gdb %} + + + {% endif %} {% include './templates/gen_drives.j2' %} diff --git a/scripts/get_gdb_base_port.sh b/scripts/get_gdb_base_port.sh new file mode 100755 index 000000000..66f987cc0 --- /dev/null +++ b/scripts/get_gdb_base_port.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# This script is used to get the base port for gdbserver + +# get the sha1sum of the script + +base_md5sum=$(md5sum "$0" | awk '{print $1}') +digits_only=$(echo $base_md5sum | tr -cd '0-9') + +# extract the last 4 digits from md5sum + +base_port=${digits_only: -4} +echo $base_port