kdevops.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Chuck Lever <cel@kernel.org>
To: kdevops@lists.linux.dev
Subject: [PATCH RFC] workflows: Add an "ltp" workflow
Date: Thu, 14 Mar 2024 16:57:38 -0400	[thread overview]
Message-ID: <171044954376.246246.5368658235263484091.stgit@renoir.1015granger.net> (raw)

From: Chuck Lever <chuck.lever@oracle.com>

LTP contains a number of file system-related tests, including the
nfslock tests, the fs* tests, and the syscall/*notify tests. These
tests have been a favorite of distributors' Q/A teams for many
years, so it makes sense to include them to help file systems
developers get in front of testing results that might be seen only
after an upstream kernel release is prepared for a Linux
distribution.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---

Not-ready-for-prime-time, but this gives a flavor for an "ltp"
workflow. Most of it even works.

There's some truly ugly "brute force" stuff in here that I need
some guidance on -- the YAML for selecting a set of nodes to spin
up and the runltp arguments for each of those nodes does not fill
me with pride.


 .gitignore                                         |    1 
 README.md                                          |    9 +
 docs/ltp.md                                        |   34 +++
 kconfigs/workflows/Kconfig                         |   25 ++
 playbooks/ltp.yml                                  |    4 
 playbooks/roles/gen_hosts/defaults/main.yml        |    1 
 playbooks/roles/gen_hosts/tasks/main.yml           |   13 +
 playbooks/roles/gen_hosts/templates/ltp.j2         |  123 +++++++++++
 playbooks/roles/gen_nodes/defaults/main.yml        |    3 
 playbooks/roles/gen_nodes/tasks/main.yml           |  185 +++++++++++++++++
 playbooks/roles/ltp/defaults/main.yml              |   13 +
 .../roles/ltp/tasks/install-deps/debian/main.yml   |   19 ++
 playbooks/roles/ltp/tasks/install-deps/main.yml    |   15 +
 .../roles/ltp/tasks/install-deps/redhat/main.yml   |   29 +++
 .../roles/ltp/tasks/install-deps/suse/main.yml     |   18 ++
 playbooks/roles/ltp/tasks/main.yml                 |  218 ++++++++++++++++++++
 playbooks/roles/ltp/templates/nfs.conf.j2          |   99 +++++++++
 scripts/workflows/ltp/run_kernel_ci.sh             |    1 
 scripts/workflows/ltp/run_kernel_ci_kotd.sh        |    1 
 scripts/workflows/ltp/run_loop.sh                  |   58 +++++
 workflows/Makefile                                 |    5 
 workflows/ltp/Kconfig                              |   61 ++++++
 workflows/ltp/Makefile                             |  115 +++++++++++
 23 files changed, 1050 insertions(+)
 create mode 100644 docs/ltp.md
 create mode 100644 playbooks/ltp.yml
 create mode 100644 playbooks/roles/gen_hosts/templates/ltp.j2
 create mode 100644 playbooks/roles/ltp/defaults/main.yml
 create mode 100644 playbooks/roles/ltp/tasks/install-deps/debian/main.yml
 create mode 100644 playbooks/roles/ltp/tasks/install-deps/main.yml
 create mode 100644 playbooks/roles/ltp/tasks/install-deps/redhat/main.yml
 create mode 100644 playbooks/roles/ltp/tasks/install-deps/suse/main.yml
 create mode 100644 playbooks/roles/ltp/tasks/main.yml
 create mode 100644 playbooks/roles/ltp/templates/nfs.conf.j2
 create mode 120000 scripts/workflows/ltp/run_kernel_ci.sh
 create mode 120000 scripts/workflows/ltp/run_kernel_ci_kotd.sh
 create mode 100755 scripts/workflows/ltp/run_loop.sh
 create mode 100644 workflows/ltp/Kconfig
 create mode 100644 workflows/ltp/Makefile

diff --git a/.gitignore b/.gitignore
index d0499ddb2348..ef5d5983ed13 100644
--- a/.gitignore
+++ b/.gitignore
@@ -70,6 +70,7 @@ workflows/blktests/results/[0-9]*
 workflows/demos/reboot-limit/results/
 
 workflows/gitr/results/
+workflows/ltp/results/
 
 # For now we ignore all results as we have work to do:
 # - copy only data for failed tests
diff --git a/README.md b/README.md
index d5d144f971e9..1814bae61c27 100644
--- a/README.md
+++ b/README.md
@@ -125,6 +125,15 @@ and then run:
 
 For more details see [kdevops gitr docs](docs/gitr.md)
 
+### Start running the ltp suite in 2 commands
+
+To test a kernel using the ltp suite, enable the ltp workflow and then run:
+
+  * `make ltp`
+  * `make ltp-baseline`
+
+For more details see [kdevops gitr docs](docs/gitr.md)
+
 ### Runs some kernel selftests in a parallel manner
 
 kdevops supports running Linux kernel selftests in parallel, this is as easy as:
diff --git a/docs/ltp.md b/docs/ltp.md
new file mode 100644
index 000000000000..096b5bad4430
--- /dev/null
+++ b/docs/ltp.md
@@ -0,0 +1,34 @@
+# kdevops ltp suite
+
+kdevops can run the ltp suite against a target kernel.
+
+Run `make menuconfig` and select:
+
+  Target workflows -> Dedicated target Linux test workflow -> ltp
+
+Then configure the test parameters by going to:
+
+  Target workflows -> Configure and run the ltp suite
+
+This menu permits you to select the tests you would like to run and
+the location of the repo that contains the version of git you want
+to use for the test.
+
+Then, run:
+
+  * `make`
+  * `make bringup`
+  * `make ltp`
+  * `make ltp-baseline`
+
+Because the full ltp suite takes a long time to run, only a few
+select file system-related tests are currently available. Additional
+tests can be added to configuration menu via a code change. See:
+
+  workflows/ltp/{Kconfig,Makefile}
+
+and
+
+  playbooks/roles/ltp/tasks/main.yml
+
+for further details.
diff --git a/kconfigs/workflows/Kconfig b/kconfigs/workflows/Kconfig
index 1a904258734f..72cef929634d 100644
--- a/kconfigs/workflows/Kconfig
+++ b/kconfigs/workflows/Kconfig
@@ -159,6 +159,13 @@ config KDEVOPS_WORKFLOW_DEDICATE_GITR
 	  This will dedicate your configuration to running only the
 	  multi-threaded git regression workflow.
 
+config KDEVOPS_WORKFLOW_DEDICATE_LTP
+	bool "ltp"
+	select KDEVOPS_WORKFLOW_ENABLE_LTP
+	help
+	  This will dedicate your configuration to running only the
+	  ltp workflow.
+
 endchoice
 
 endif
@@ -224,6 +231,14 @@ config KDEVOPS_WORKFLOW_NOT_DEDICATED_ENABLE_GITR
 	  Select this option if you want to configure the deployment for
 	  testing via the multi-threaded git regression workflow.
 
+config KDEVOPS_WORKFLOW_NOT_DEDICATED_ENABLE_LTP
+	bool "ltp"
+	select KDEVOPS_WORKFLOW_ENABLE_LTP
+	depends on VAGRANT || TERRAFORM_PRIVATE_NET
+	help
+	  Select this option if you want to configure the deployment for
+	  testing via the ltp workflow.
+
 endif # !WORKFLOWS_DEDICATED_WORKFLOW
 
 config KDEVOPS_WORKFLOW_ENABLE_FSTESTS
@@ -287,6 +302,16 @@ source "workflows/gitr/Kconfig"
 endmenu
 endif # KDEVOPS_WORKFLOW_ENABLE_GITR
 
+config KDEVOPS_WORKFLOW_ENABLE_LTP
+	bool
+	default y if KDEVOPS_WORKFLOW_NOT_DEDICATED_ENABLE_LTP || KDEVOPS_WORKFLOW_DEDICATE_LTP
+
+if KDEVOPS_WORKFLOW_ENABLE_LTP
+menu "Configure and run the ltp suite"
+source "workflows/ltp/Kconfig"
+endmenu
+endif # KDEVOPS_WORKFLOW_ENABLE_GITR
+
 config KDEVOPS_WORKFLOW_GIT_CLONES_KDEVOPS_GIT
 	bool
 	default y if KDEVOPS_WORKFLOW_ENABLE_FSTESTS || KDEVOPS_WORKFLOW_ENABLE_BLKTESTS
diff --git a/playbooks/ltp.yml b/playbooks/ltp.yml
new file mode 100644
index 000000000000..5921cefc76e4
--- /dev/null
+++ b/playbooks/ltp.yml
@@ -0,0 +1,4 @@
+---
+- hosts: all
+  roles:
+    - role: ltp
diff --git a/playbooks/roles/gen_hosts/defaults/main.yml b/playbooks/roles/gen_hosts/defaults/main.yml
index 5cd7433c80a6..5cd941c7d0d3 100644
--- a/playbooks/roles/gen_hosts/defaults/main.yml
+++ b/playbooks/roles/gen_hosts/defaults/main.yml
@@ -25,6 +25,7 @@ kdevops_workflow_enable_selftests: False
 kdevops_workflow_enable_cxl: False
 kdevops_workflow_enable_pynfs: False
 kdevops_workflow_enable_gitr: False
+kdevops_workflow_enable_ltp: False
 
 is_fstests: False
 fstests_fstyp: "bogus"
diff --git a/playbooks/roles/gen_hosts/tasks/main.yml b/playbooks/roles/gen_hosts/tasks/main.yml
index 826a58d31996..37de2eafcd70 100644
--- a/playbooks/roles/gen_hosts/tasks/main.yml
+++ b/playbooks/roles/gen_hosts/tasks/main.yml
@@ -107,6 +107,19 @@
     - kdevops_workflow_enable_gitr
     - ansible_hosts_template.stat.exists
 
+- name: Generate the Ansible hosts file for dedicated ltp workflow
+  tags: [ 'hosts' ]
+  template:
+    src: "{{ kdevops_hosts_template }}"
+    dest: "{{ topdir_path }}/{{ kdevops_hosts }}"
+    force: yes
+    trim_blocks: True
+    lstrip_blocks: True
+  when:
+    - kdevops_workflows_dedicated_workflow
+    - kdevops_workflow_enable_ltp
+    - ansible_hosts_template.stat.exists
+
 - name: Set empty enabled test types list for fstests
   tags: [ 'hosts' ]
   set_fact:
diff --git a/playbooks/roles/gen_hosts/templates/ltp.j2 b/playbooks/roles/gen_hosts/templates/ltp.j2
new file mode 100644
index 000000000000..76b68cd0dc47
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/ltp.j2
@@ -0,0 +1,123 @@
+[all]
+{% if ltp_tests_fs == True %}
+{{ kdevops_hosts_prefix }}-fs
+{% endif %}
+{% if ltp_tests_fs_bind == True %}
+{{ kdevops_hosts_prefix }}-fs-bind
+{% endif %}
+{% if ltp_tests_fs_perms_simple == True %}
+{{ kdevops_hosts_prefix }}-fs-perms-simple
+{% endif %}
+{% if ltp_tests_fs_readonly == True %}
+{{ kdevops_hosts_prefix }}-fs-readonly-simple
+{% endif %}
+{% if ltp_tests_nfs == True %}
+{{ kdevops_hosts_prefix }}-nfs
+{% endif %}
+{% if ltp_tests_notify == True %}
+{{ kdevops_hosts_prefix }}-notify
+{% endif %}
+{% if ltp_tests_rpc == True %}
+{{ kdevops_hosts_prefix }}-rpc
+{% endif %}
+{% if ltp_tests_smack == True %}
+{{ kdevops_hosts_prefix }}-smack
+{% endif %}
+{% if ltp_tests_tirpc == True %}
+{{ kdevops_hosts_prefix }}-tirpc
+{% endif %}
+{% if kdevops_baseline_and_dev == True %}
+{% if ltp_tests_fs == True %}
+{{ kdevops_hosts_prefix }}-dev-fs
+{% endif %}
+{% if ltp_tests_fs_bind == True %}
+{{ kdevops_hosts_prefix }}-dev-fs-bind
+{% endif %}
+{% if ltp_tests_fs_perms_simple == True %}
+{{ kdevops_hosts_prefix }}-dev-fs-perms-simple
+{% endif %}
+{% if ltp_tests_fs_readonly == True %}
+{{ kdevops_hosts_prefix }}-dev-fs-readonly-simple
+{% endif %}
+{% if ltp_tests_nfs == True %}
+{{ kdevops_hosts_prefix }}-dev-nfs
+{% endif %}
+{% if ltp_tests_notify == True %}
+{{ kdevops_hosts_prefix }}-dev-notify
+{% endif %}
+{% if ltp_tests_rpc == True %}
+{{ kdevops_hosts_prefix }}-dev-rpc
+{% endif %}
+{% if ltp_tests_smack == True %}
+{{ kdevops_hosts_prefix }}-dev-smack
+{% endif %}
+{% if ltp_tests_tirpc == True %}
+{{ kdevops_hosts_prefix }}-dev-tirpc
+{% endif %}
+{% endif %}
+[all:vars]
+ansible_python_interpreter =  "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% if ltp_tests_fs == True %}
+{{ kdevops_hosts_prefix }}-fs
+{% endif %}
+{% if ltp_tests_fs_bind == True %}
+{{ kdevops_hosts_prefix }}-fs-bind
+{% endif %}
+{% if ltp_tests_fs_perms_simple == True %}
+{{ kdevops_hosts_prefix }}-fs-perms-simple
+{% endif %}
+{% if ltp_tests_fs_readonly == True %}
+{{ kdevops_hosts_prefix }}-fs-readonly-simple
+{% endif %}
+{% if ltp_tests_nfs == True %}
+{{ kdevops_hosts_prefix }}-nfs
+{% endif %}
+{% if ltp_tests_notify == True %}
+{{ kdevops_hosts_prefix }}-notify
+{% endif %}
+{% if ltp_tests_rpc == True %}
+{{ kdevops_hosts_prefix }}-rpc
+{% endif %}
+{% if ltp_tests_smack == True %}
+{{ kdevops_hosts_prefix }}-smack
+{% endif %}
+{% if ltp_tests_tirpc == True %}
+{{ kdevops_hosts_prefix }}-tirpc
+{% endif %}
+[baseline:vars]
+ansible_python_interpreter =  "{{ kdevops_python_interpreter }}"
+
+[dev]
+{% if kdevops_baseline_and_dev %}
+{% if ltp_tests_fs == True %}
+{{ kdevops_hosts_prefix }}-dev-fs
+{% endif %}
+{% if ltp_tests_fs_bind == True %}
+{{ kdevops_hosts_prefix }}-dev-fs-bind
+{% endif %}
+{% if ltp_tests_fs_perms_simple == True %}
+{{ kdevops_hosts_prefix }}-dev-fs-perms-simple
+{% endif %}
+{% if ltp_tests_fs_readonly == True %}
+{{ kdevops_hosts_prefix }}-dev-fs-readonly-simple
+{% endif %}
+{% if ltp_tests_nfs == True %}
+{{ kdevops_hosts_prefix }}-dev-nfs
+{% endif %}
+{% if ltp_tests_notify == True %}
+{{ kdevops_hosts_prefix }}-dev-notify
+{% endif %}
+{% if ltp_tests_rpc == True %}
+{{ kdevops_hosts_prefix }}-dev-rpc
+{% endif %}
+{% if ltp_tests_smack == True %}
+{{ kdevops_hosts_prefix }}-dev-smack
+{% endif %}
+{% if ltp_tests_tirpc == True %}
+{{ kdevops_hosts_prefix }}-dev-tirpc
+{% endif %}
+{% endif %}
+[dev:vars]
+ansible_python_interpreter =  "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_nodes/defaults/main.yml b/playbooks/roles/gen_nodes/defaults/main.yml
index 0b7e5be4971f..8775b08e4d26 100644
--- a/playbooks/roles/gen_nodes/defaults/main.yml
+++ b/playbooks/roles/gen_nodes/defaults/main.yml
@@ -11,6 +11,7 @@ kdevops_baseline_and_dev: False
 kdevops_workflow_enable_cxl: False
 kdevops_workflow_enable_pynfs: False
 kdevops_workflow_enable_gitr: False
+kdevops_workflow_enable_ltp: False
 kdevops_workflow_enable_selftests: False
 kdevops_nfsd_enable: False
 kdevops_krb5_enable: False
@@ -87,6 +88,8 @@ fstests_fstyp: "bogus"
 fs_config_role_path: "/dev/null"
 fs_config_data: "[section_1]"
 
+is_ltp: False
+
 bootlinux_9p: False
 bootlinux_9p_host_path: "/dev/null"
 bootlinux_9p_msize: 0
diff --git a/playbooks/roles/gen_nodes/tasks/main.yml b/playbooks/roles/gen_nodes/tasks/main.yml
index e0f34927a9c5..57743ab52ad3 100644
--- a/playbooks/roles/gen_nodes/tasks/main.yml
+++ b/playbooks/roles/gen_nodes/tasks/main.yml
@@ -159,6 +159,191 @@
     - kdevops_workflow_enable_gitr
     - ansible_nodes_template.stat.exists
 
+- name: Set empty enabled nodes list for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    is_ltp: True
+    ltp_enabled_nodes: []
+  when:
+    - kdevops_workflows_dedicated_workflow
+    - kdevops_workflow_enable_ltp
+    - ansible_nodes_template.stat.exists
+
+- name: Enable -fs node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -fs nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs'] + [ 'dev-fs' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -fs-bind node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs-bind'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs_bind|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -fs-bind nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs-bind'] + [ 'dev-fs-bind' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs_bind|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -fs-perms-simple node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs-perms-simple'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs_perms_simple|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -fs-perms-simple nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs-perms-simple'] + [ 'dev-fs-perms-simple' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs_perms_simple|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -fs-readonly node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs-readonly'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs_readonly|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -fs-readonly nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'fs-readonly'] + [ 'dev-fs-readonly' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_fs_readonly|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -nfs node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'nfs'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_nfs|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -nfs nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'nfs'] + [ 'dev-nfs' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_nfs|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -notify node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'notify'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_notify|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -notify nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'notify'] + [ 'dev-notify' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_notify|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -rpc node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'rpc'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_rpc|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -rpc nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'rpc'] + [ 'dev-rpc' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_rpc|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -smack node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'smack'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_smack|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -smack nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'smack'] + [ 'dev-smack' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_smack|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Enable -tirpc node for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'tirpc'] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_tirpc|bool
+    - not kdevops_baseline_and_dev|bool
+
+- name: Enable -tirpc nodes for ltp
+  tags: [ 'hosts' ]
+  set_fact:
+    ltp_enabled_nodes: "{{ ltp_enabled_nodes + [ 'tirpc'] + [ 'dev-tirpc' ] }}"
+  when:
+    - is_ltp|bool
+    - ltp_tests_tirpc|bool
+    - kdevops_baseline_and_dev|bool
+
+- name: Generate the ltp kdevops nodes file using {{ kdevops_nodes_template }} as the template
+  tags: [ 'hosts' ]
+  vars:
+    node_template: "{{ kdevops_nodes_template | basename }}"
+    all_generic_nodes: "{{ generic_nodes }}"
+    nodes: "{{ [kdevops_host_prefix + '-'] | product(ltp_enabled_nodes) | map('join') | list }}"
+  template:
+    src: "{{ node_template }}"
+    dest: "{{ topdir_path }}/{{ kdevops_nodes }}"
+    force: yes
+  when:
+    - is_ltp|bool
+
 - name: Set empty enabled test types list for fstests
   tags: [ 'hosts' ]
   set_fact:
diff --git a/playbooks/roles/ltp/defaults/main.yml b/playbooks/roles/ltp/defaults/main.yml
new file mode 100644
index 000000000000..c73994764647
--- /dev/null
+++ b/playbooks/roles/ltp/defaults/main.yml
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier GPL-2.0+
+---
+# Our sensible defaults for the ltp role.
+#
+# The default is to not run the ltp tests.
+kdevops_run_ltp: False
+
+ltp_data: "{{ data_path }}/ltp"
+
+# Individual unit tests to be run
+ltp_tests_fs: False
+ltp_tests_nfs: False
+ltp_tests_notify: False
diff --git a/playbooks/roles/ltp/tasks/install-deps/debian/main.yml b/playbooks/roles/ltp/tasks/install-deps/debian/main.yml
new file mode 100644
index 000000000000..bb7c742d99b6
--- /dev/null
+++ b/playbooks/roles/ltp/tasks/install-deps/debian/main.yml
@@ -0,0 +1,19 @@
+---
+- name: Install build dependencies for ltp
+  become: yes
+  become_method: sudo
+  apt:
+    name:
+      - gcc
+      - git
+      - make
+      - pkgconf
+      - autoconf
+      - automake
+      - bison
+      - flex
+      - m4
+#     - linux-headers-$(uname -r)
+      - libc6-dev
+    state: present
+    update_cache: yes
diff --git a/playbooks/roles/ltp/tasks/install-deps/main.yml b/playbooks/roles/ltp/tasks/install-deps/main.yml
new file mode 100644
index 000000000000..e9b5d69bea25
--- /dev/null
+++ b/playbooks/roles/ltp/tasks/install-deps/main.yml
@@ -0,0 +1,15 @@
+---
+- name: Debian-specific set up
+  tags: [ 'build' ]
+  ansible.builtin.include_tasks: tasks/install-deps/debian/main.yml
+  when: ansible_os_family == 'Debian'
+
+- name: SuSE-specific set up
+  tags: [ 'build' ]
+  ansible.builtin.include_tasks: tasks/install-deps/suse/main.yml
+  when: ansible_os_family == 'Suse'
+
+- name: Red Hat-specific set up
+  tags: [ 'build' ]
+  ansible.builtin.include_tasks: tasks/install-deps/redhat/main.yml
+  when: ansible_os_family == 'RedHat'
diff --git a/playbooks/roles/ltp/tasks/install-deps/redhat/main.yml b/playbooks/roles/ltp/tasks/install-deps/redhat/main.yml
new file mode 100644
index 000000000000..ca43b9a86e7e
--- /dev/null
+++ b/playbooks/roles/ltp/tasks/install-deps/redhat/main.yml
@@ -0,0 +1,29 @@
+---
+- name: Install dependencies for ltp
+  become: yes
+  become_method: sudo
+  yum:
+    update_cache: yes
+    name: "{{ packages }}"
+  retries: 3
+  delay: 5
+  register: result
+  until: result.rc == 0
+  vars:
+    packages:
+      - gcc
+      - git
+      - make
+      - pkgconf
+      - autoconf
+      - automake
+      - bison
+      - flex
+      - m4
+      - ethtool
+      - nfs-utils
+      - kernel-headers
+      - glibc-headers
+      - libacl-devel
+      - libtirpc-devel
+      - openssl-devel
diff --git a/playbooks/roles/ltp/tasks/install-deps/suse/main.yml b/playbooks/roles/ltp/tasks/install-deps/suse/main.yml
new file mode 100644
index 000000000000..ffd0ab2519c2
--- /dev/null
+++ b/playbooks/roles/ltp/tasks/install-deps/suse/main.yml
@@ -0,0 +1,18 @@
+---
+- name: Install build dependencies for ltp
+  become: yes
+  become_method: sudo
+  zypper:
+    name:
+      - gcc
+      - git
+      - make
+      - pkg-config
+      - autoconf
+      - automake
+      - bison
+      - flex
+      - m4
+      - linux-glibc-devel
+      - glibc-devel
+    state: present
diff --git a/playbooks/roles/ltp/tasks/main.yml b/playbooks/roles/ltp/tasks/main.yml
new file mode 100644
index 000000000000..f7f7241396dc
--- /dev/null
+++ b/playbooks/roles/ltp/tasks/main.yml
@@ -0,0 +1,218 @@
+---
+- name: Import optional extra_args file
+  tags: [ 'vars' ]
+  include_vars: "{{ item }}"
+  ignore_errors: yes
+  with_first_found:
+    - files:
+      - "../extra_vars.yml"
+      - "../extra_vars.yaml"
+      - "../extra_vars.json"
+      skip: true
+
+- name: Set the pathname of the local results directory
+  tags: [ 'vars' ]
+  ansible.builtin.set_fact:
+    ltp_results_dir: "../workflows/ltp/results/{{ ansible_host }}/"
+
+- name: Clean up the local results directory
+  tags: [ 'clean_local_results' ]
+  local_action: ansible.builtin.file path="{{ ltp_results_dir }}" state=absent
+  run_once: true
+
+- name: Create the local results directory
+  tags: [ 'first_run' ]
+  local_action: ansible.builtin.file path="{{ ltp_results_dir }}" state=directory
+  run_once: true
+
+- name: Install dependencies
+  ansible.builtin.include_tasks: tasks/install-deps/main.yml
+
+- name: Set the pathname of the build directory
+  tags: [ 'build' ]
+  ansible.builtin.set_fact:
+    ltp_build_dir: "/tmp/ltp"
+
+- name: Remove existing ltp build directory
+  tags: [ 'build' ]
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  ansible.builtin.file:
+    path: "{{ ltp_build_dir }}"
+    state: absent
+
+- name: Clone the {{ ltp_repo }} repository
+  tags: [ 'build', 'git', 'clone']
+  ansible.builtin.git:
+    repo: "{{ ltp_repo }}"
+    dest: "{{ ltp_build_dir }}"
+    version: "{{ ltp_repo_commit }}"
+    update: yes
+  retries: 3
+  delay: 5
+  register: result
+  until: not result.failed
+
+- name: Initialize autotools in the build directory
+  tags: [ 'build' ]
+  community.general.make:
+    chdir: "{{ ltp_build_dir }}"
+    target: autotools
+
+- name: Configure the ltp build environment
+  tags: [ 'build' ]
+  ansible.builtin.command:
+    cmd: "./configure"
+    chdir: "{{ ltp_build_dir }}"
+
+- name: Get nproc on the build system
+  tags: [ 'build' ]
+  ansible.builtin.command: "{{ num_jobs }}"
+  register: nproc
+  changed_when: False
+
+- name: Build ltp from source
+  tags: [ 'build' ]
+  community.general.make:
+    chdir: "{{ ltp_build_dir }}"
+    target: all
+    jobs: "{{ nproc.stdout }}"
+
+- name: Ensure /opt has correct permissions
+  tags: [ 'build' ]
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  ansible.builtin.file:
+    state: directory
+    path: "/opt"
+    mode: "u=rwx,g=rwx,o=rwxt"
+
+- name: Install ltp on the test systems
+  tags: [ 'build' ]
+  community.general.make:
+    chdir: "{{ ltp_build_dir }}"
+    target: install
+    jobs: "{{ nproc.stdout }}"
+
+- name: Start the rpcbind service
+  tags: [ 'build' ]
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  ansible.builtin.systemd_service:
+    name: rpcbind.service
+    state: reloaded
+    enabled: True
+
+- name: Generate /etc/nfs.conf
+  tags: [ 'build' ]
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  template:
+    src: nfs.conf.j2
+    dest: /etc/nfs.conf
+    owner: root
+    group: root
+    mode: 0644
+  when: ansible_host is search("-nfs")
+
+- name: Start the NFSD service
+  tags: [ 'build' ]
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  ansible.builtin.systemd_service:
+    name: nfs-server.service
+    state: reloaded
+    enabled: True
+  when: ansible_host is search("-nfs")
+
+- name: Select runltp arguments for the basic fs tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f fs"
+  when: ansible_host is regex(".*-fs")
+
+- name: Select runltp arguments for the fs-bind tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f fs_bind"
+  when: ansible_host is search("-fs-bind")
+
+- name: Select runltp arguments for the fs-perms-simple tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f fs_perms_simple"
+  when: ansible_host is search("-fs-perms-simple")
+
+- name: Select runltp arguments for the fs-readonly tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f fs_readonly"
+  when: ansible_host is search("-fs-readonly")
+
+- name: Select runltp arguments for the nfs tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f net.nfs"
+  when: ansible_host is search("-nfs")
+
+- name: Select runltp arguments for the notify tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f syscalls -s notify"
+  when: ansible_host is search("-notify")
+
+- name: Select runltp arguments for the rpc tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f net.rpc_tests"
+  when: ansible_host is search("-rpc")
+
+- name: Select runltp arguments for the smack tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f smack"
+  when: ansible_host is search("-smack")
+
+- name: Select runltp arguments for the tirpc tests
+  tags: [ 'run_tests' ]
+  ansible.builtin.set_fact:
+    ltp_runltp_args: "-f net.tirpc_tests"
+  when: ansible_host is search("-tirpc")
+
+- name: Run ltp
+  tags: [ 'run_tests' ]
+  environment:
+    LTP_TIMEOUT_MUL: 5
+    TST_DISABLE_APPARMOR: 1
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  ansible.builtin.command:
+    cmd: "/opt/ltp/runltp {{ ltp_runltp_args }}"
+
+- name: Look for test results in guest's /opt/ltp/results
+  tags: [ 'copy_results' ]
+  become: yes
+  become_flags: 'su - -c'
+  become_method: sudo
+  ansible.builtin.find:
+    paths: "/opt/ltp/results/"
+    recurse: yes
+    patterns: "*.log"
+  register: results_files
+
+- name: Copy test results to localhost
+  tags: [ 'copy_results' ]
+  ansible.builtin.fetch:
+    src: "{{ item.path }}"
+    dest: "{{ ltp_results_dir }}"
+    flat: yes
+    validate_checksum: False
+  with_items: "{{ results_files.files }}"
+  when:
+    - results_files.matched > 0
diff --git a/playbooks/roles/ltp/templates/nfs.conf.j2 b/playbooks/roles/ltp/templates/nfs.conf.j2
new file mode 100644
index 000000000000..93c0d241dbc3
--- /dev/null
+++ b/playbooks/roles/ltp/templates/nfs.conf.j2
@@ -0,0 +1,99 @@
+#
+# This is a general configuration for the
+# NFS daemons and tools
+#
+[general]
+# pipefs-directory=/var/lib/nfs/rpc_pipefs
+#
+[nfsrahead]
+# nfs=15000
+# nfs4=16000
+#
+[exports]
+# rootdir=/export
+#
+[exportfs]
+# debug=0
+#
+[gssd]
+# verbosity=0
+# rpc-verbosity=0
+# use-memcache=0
+# use-machine-creds=1
+use-gss-proxy=1
+# avoid-dns=1
+# limit-to-legacy-enctypes=0
+# context-timeout=0
+# rpc-timeout=5
+# keytab-file=/etc/krb5.keytab
+# cred-cache-directory=
+# preferred-realm=
+# set-home=1
+# upcall-timeout=30
+# cancel-timed-out-upcalls=0
+#
+[lockd]
+# port=0
+# udp-port=0
+#
+[exportd]
+# debug="all|auth|call|general|parse"
+# manage-gids=n
+# state-directory-path=/var/lib/nfs
+# threads=1
+# cache-use-ipaddr=n
+# ttl=1800
+[mountd]
+# debug="all|auth|call|general|parse"
+# manage-gids=n
+# descriptors=0
+# port=0
+# threads=1
+# reverse-lookup=n
+# state-directory-path=/var/lib/nfs
+# ha-callout=
+# cache-use-ipaddr=n
+# ttl=1800
+#
+[nfsdcld]
+# debug=0
+# storagedir=/var/lib/nfs/nfsdcld
+#
+[nfsdcltrack]
+# debug=0
+# storagedir=/var/lib/nfs/nfsdcltrack
+#
+[nfsd]
+# debug=0
+# threads=8
+# host=
+# port=0
+# grace-time=90
+# lease-time=90
+udp=y
+# tcp=y
+vers2=y
+# vers3=y
+# vers4=y
+# vers4.0=y
+# vers4.1=y
+# vers4.2=y
+rdma=y
+rdma-port=20049
+
+[statd]
+# debug=0
+# port=0
+# outgoing-port=0
+# name=
+# state-directory-path=/var/lib/nfs/statd
+# ha-callout=
+# no-notify=0
+#
+[sm-notify]
+# debug=0
+# force=0
+# retry-time=900
+# outgoing-port=
+# outgoing-addr=
+# lift-grace=y
diff --git a/scripts/workflows/ltp/run_kernel_ci.sh b/scripts/workflows/ltp/run_kernel_ci.sh
new file mode 120000
index 000000000000..4fd5dc5e8e13
--- /dev/null
+++ b/scripts/workflows/ltp/run_kernel_ci.sh
@@ -0,0 +1 @@
+../generic/run_kernel_ci.sh
\ No newline at end of file
diff --git a/scripts/workflows/ltp/run_kernel_ci_kotd.sh b/scripts/workflows/ltp/run_kernel_ci_kotd.sh
new file mode 120000
index 000000000000..8f94d6ba4f52
--- /dev/null
+++ b/scripts/workflows/ltp/run_kernel_ci_kotd.sh
@@ -0,0 +1 @@
+../kotd/run_kernel_ci_kotd.sh
\ No newline at end of file
diff --git a/scripts/workflows/ltp/run_loop.sh b/scripts/workflows/ltp/run_loop.sh
new file mode 100755
index 000000000000..df005beb4ab0
--- /dev/null
+++ b/scripts/workflows/ltp/run_loop.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+# SPDX-License-Identifier: copyleft-next-0.3.1
+
+# Part of kdevops kernel-ci, this is the script which will run the test workflow
+# as many times as indicated up to CONFIG_KERNEL_CI_STEADY_STATE_GOAL
+
+source ${TOPDIR}/.config
+source ${TOPDIR}/scripts/lib.sh
+
+WORKFLOWDIR=${TOPDIR}/workflows/ltp
+
+COUNT=1
+
+run_loop()
+{
+	while true; do
+		echo "== kernel-ci ltp test loop $COUNT start: $(date)" > $KERNEL_CI_FAIL_LOG
+		echo "/usr/bin/time -f %E make ltp-baseline" >> $KERNEL_CI_FAIL_LOG
+		/usr/bin/time -p -o $KERNEL_CI_LOGTIME make ltp-baseline >> $KERNEL_CI_FAIL_LOG
+		ANSIBLE_CALL_RET=$?
+		echo "End   $COUNT: $(date)" >> $KERNEL_CI_FAIL_LOG
+		cat $KERNEL_CI_LOGTIME >> $KERNEL_CI_FAIL_LOG
+		echo "git status:" >> $KERNEL_CI_FAIL_LOG
+		git status >> $KERNEL_CI_FAIL_LOG
+		echo "Results:" >> $KERNEL_CI_FAIL_LOG
+
+		rm -f $KERNEL_CI_DIFF_LOG
+
+		if [[ "$ANSIBLE_CALL_RET" -ne 0 ]]; then
+			echo "Test  $COUNT: FAILED!" >> $KERNEL_CI_DIFF_LOG
+			echo "== Test loop count $COUNT" >> $KERNEL_CI_DIFF_LOG
+			echo "$(git describe)" >> $KERNEL_CI_DIFF_LOG
+			git diff >> $KERNEL_CI_DIFF_LOG
+			cat $KERNEL_CI_DIFF_LOG >> $KERNEL_CI_FAIL_LOG
+			cat $KERNEL_CI_FAIL_LOG >> $KERNEL_CI_FULL_LOG
+			echo $COUNT > $KERNEL_CI_FAIL_FILE
+			exit 1
+		else
+			echo "Test  $COUNT: OK!" >> $KERNEL_CI_FAIL_LOG
+			echo "----------------------------------------------------------------" >> $KERNEL_CI_FAIL_LOG
+			cat $KERNEL_CI_FAIL_LOG >> $KERNEL_CI_FULL_LOG
+		fi
+
+		# This let's us keep track of which loop count was last successful
+		echo $COUNT > $KERNEL_CI_OK_FILE
+
+		let COUNT=$COUNT+1
+		if [[ "$CONFIG_KERNEL_CI_ENABLE_STEADY_STATE" == "y" &&
+		      "$COUNT" -gt "$CONFIG_KERNEL_CI_STEADY_STATE_GOAL" ]]; then
+			exit 0
+		fi
+		sleep 1
+	done
+}
+
+rm -f $KERNEL_CI_FAIL_FILE $KERNEL_CI_OK_FILE
+echo "= kernel-ci full log" > $KERNEL_CI_FULL_LOG
+run_loop
diff --git a/workflows/Makefile b/workflows/Makefile
index 122eb98bb66b..7e3e5e351a49 100644
--- a/workflows/Makefile
+++ b/workflows/Makefile
@@ -48,6 +48,11 @@ WORKFLOW_ARGS += kdevops_workflow_enable_gitr='True'
 include workflows/gitr/Makefile
 endif # CONFIG_KDEVOPS_WORKFLOW_ENABLE_GITR == y
 
+ifeq (y,$(CONFIG_KDEVOPS_WORKFLOW_ENABLE_LTP))
+WORKFLOW_ARGS += kdevops_workflow_enable_ltp='True'
+include workflows/ltp/Makefile
+endif # CONFIG_KDEVOPS_WORKFLOW_ENABLE_LTP == y
+
 ANSIBLE_EXTRA_ARGS += $(WORKFLOW_ARGS)
 ANSIBLE_EXTRA_ARGS_SEPARATED += $(WORKFLOW_ARGS_SEPARATED)
 ANSIBLE_EXTRA_ARGS_DIRECT += $(WORKFLOW_ARGS_DIRECT)
diff --git a/workflows/ltp/Kconfig b/workflows/ltp/Kconfig
new file mode 100644
index 000000000000..5662b2811ccd
--- /dev/null
+++ b/workflows/ltp/Kconfig
@@ -0,0 +1,61 @@
+if KDEVOPS_WORKFLOW_ENABLE_LTP
+
+config LTP_REPO
+	string "The ltp repository to clone"
+	default "https://github.com/linux-test-project/ltp.git"
+	help
+	  The ltp repository to clone.
+
+config LTP_REPO_COMMIT
+	string "The version of ltp to check out"
+	default "20240129"
+	help
+	  The reference (tag, hash, or branch) to be checked out and
+	  used for the test.
+
+config LTP_TESTS_FS
+	bool "FS tests"
+	help
+	  Run the file system-related unit tests.
+
+config LTP_TESTS_FS_BIND
+	bool "Bind mount tests"
+	help
+	  Run the bind mount unit tests.
+
+config LTP_TESTS_FS_PERMS_SIMPLE
+	bool "FS simple permission tests"
+	help
+	  Run simple file system permission unit tests.
+
+config LTP_TESTS_FS_READONLY
+	bool "FS read-only tests"
+	help
+	  Run file system read-only unit tests.
+
+config LTP_TESTS_NFS
+	bool "NFS tests"
+	help
+	  Run the NFS, NFS locking, and RPC unit tests.
+
+config LTP_TESTS_NOTIFY
+	bool "inotify and fanotify tests"
+	help
+	  Run the inotify and fanotify unit tests.
+
+config LTP_TESTS_RPC
+	bool "Traditional SunRPC tests"
+	help
+	  Run SunRPC library unit tests.
+
+config LTP_TESTS_SMACK
+	bool "SMACK tests"
+	help
+	  Run the SMACK unit tests.
+
+config LTP_TESTS_TIRPC
+	bool "Transport-Independent SunRPC tests"
+	help
+	  Run the TI-RPC library unit tests.
+
+endif # KDEVOPS_WORKFLOW_ENABLE_LTP
diff --git a/workflows/ltp/Makefile b/workflows/ltp/Makefile
new file mode 100644
index 000000000000..bf98155b75bc
--- /dev/null
+++ b/workflows/ltp/Makefile
@@ -0,0 +1,115 @@
+ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
+export KDEVOPS_HOSTS_TEMPLATE := ltp.j2
+endif
+
+LTP_REPO:=$(subst ",,$(CONFIG_LTP_REPO))
+LTP_ARGS += ltp_repo=$(LTP_REPO)
+
+LTP_REPO_COMMIT:=$(subst ",,$(CONFIG_LTP_REPO_COMMIT))
+LTP_ARGS += ltp_repo_commit=$(LTP_REPO_COMMIT)
+
+ifeq (y,$(CONFIG_LTP_TESTS_FS))
+LTP_ARGS += ltp_tests_fs='True'
+else
+LTP_ARGS += ltp_tests_fs='False'
+endif # CONFIG_LTP_TESTS_FS
+
+ifeq (y,$(CONFIG_LTP_TESTS_FS_BIND))
+LTP_ARGS += ltp_tests_fs_bind='True'
+else
+LTP_ARGS += ltp_tests_fs_bind='False'
+endif # CONFIG_LTP_TESTS_FS_BIND
+
+ifeq (y,$(CONFIG_LTP_TESTS_FS_PERMS_SIMPLE))
+LTP_ARGS += ltp_tests_fs_perms_simple='True'
+else
+LTP_ARGS += ltp_tests_fs_perms_simple='False'
+endif # CONFIG_LTP_TESTS_FS_PERMS_SIMPLE
+
+ifeq (y,$(CONFIG_LTP_TESTS_FS_READONLY))
+LTP_ARGS += ltp_tests_fs_readonly='True'
+else
+LTP_ARGS += ltp_tests_fs_readonly='False'
+endif # CONFIG_LTP_TESTS_FS_READONLY
+
+ifeq (y,$(CONFIG_LTP_TESTS_NFS))
+LTP_ARGS += ltp_tests_nfs='True'
+else
+LTP_ARGS += ltp_tests_nfs='False'
+endif # CONFIG_LTP_TESTS_NFS
+
+ifeq (y,$(CONFIG_LTP_TESTS_NOTIFY))
+LTP_ARGS += ltp_tests_notify='True'
+else
+LTP_ARGS += ltp_tests_notify='False'
+endif # CONFIG_LTP_TESTS_NOTIFY
+
+ifeq (y,$(CONFIG_LTP_TESTS_RPC))
+LTP_ARGS += ltp_tests_rpc='True'
+else
+LTP_ARGS += ltp_tests_rpc='False'
+endif # CONFIG_LTP_TESTS_RPC
+
+ifeq (y,$(CONFIG_LTP_TESTS_SMACK))
+LTP_ARGS += ltp_tests_smack='True'
+else
+LTP_ARGS += ltp_tests_smack='False'
+endif # CONFIG_LTP_TESTS_SMACK
+
+ifeq (y,$(CONFIG_LTP_TESTS_TIRPC))
+LTP_ARGS += ltp_tests_tirpc='True'
+else
+LTP_ARGS += ltp_tests_tirpc='False'
+endif # CONFIG_LTP_TESTS_TIRPC
+
+WORKFLOW_ARGS += $(LTP_ARGS)
+
+LTP_KERNEL_CI_LOOP := false
+LTP_KERNEL_CI_LOOP_KOTD := false
+
+ifeq (y,$(CONFIG_KERNEL_CI))
+LTP_KERNEL_CI_LOOP      := scripts/workflows/ltp/run_kernel_ci.sh
+LTP_KERNEL_CI_LOOP_KOTD := scripts/workflows/ltp/run_kernel_ci_kotd.sh
+endif # CONFIG_KERNEL_CI
+
+ltp:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) -l baseline,dev \
+		-f 30 -i hosts playbooks/ltp.yml --skip-tags run_tests,copy_results
+
+ltp-baseline:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) \
+		-f 30 -i hosts -l baseline playbooks/ltp.yml \
+		--tags vars,run_tests,copy_results \
+		--extra-vars=@./extra_vars.yaml
+
+ltp-baseline-loop:
+	$(Q)$(LTP_KERNEL_CI_LOOP) baseline
+
+ltp-baseline-kernelci:
+	$(Q)$(LTP_KERNEL_CI_LOOP_KOTD) baseline
+
+ltp-dev-baseline:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) \
+		-f 30 -i hosts -l dev playbooks/ltp.yml \
+		--tags vars,run_tests,copy_results --extra-vars=@./extra_vars.yaml
+
+ltp-dev-loop:
+	$(Q)$(LTP_KERNEL_CI_LOOP) dev
+
+ltp-dev-kernelci:
+	$(Q)$(LTP_KERNEL_CI_LOOP_KOTD) dev
+
+ltp-dev-reset:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) \
+		-f 30 -i hosts -l dev playbooks/ltp.yml \
+		--tags vars,reset --extra-vars=@./extra_vars.yaml
+
+ltp-help-menu:
+	@echo "ltp options:"
+	@echo "ltp                              - Git clone ltp, build and install it"
+	@echo "ltp-{baseline,dev}               - Run the ltp test on baseline or dev hosts and collect results"
+	@echo "ltp-{baseline,dev}-loop"         - Run ltp in a loop until error or steady state
+	@echo "ltp-{baseline,dev}-kernelci      - Run ltp kernel-ci loop"
+	@echo ""
+
+HELP_TARGETS += ltp-help-menu



             reply	other threads:[~2024-03-14 20:57 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-14 20:57 Chuck Lever [this message]
2024-03-15 19:31 ` [PATCH RFC] workflows: Add an "ltp" workflow Luis Chamberlain
2024-03-15 19:50   ` Chuck Lever III

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=171044954376.246246.5368658235263484091.stgit@renoir.1015granger.net \
    --to=cel@kernel.org \
    --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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).