All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nico Boehr <nrb@linux.ibm.com>
To: kvm@vger.kernel.org
Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com
Subject: [kvm-unit-tests PATCH v2 2/2] s390x: add CMM test during migration
Date: Thu, 24 Nov 2022 14:44:29 +0100	[thread overview]
Message-ID: <20221124134429.612467-3-nrb@linux.ibm.com> (raw)
In-Reply-To: <20221124134429.612467-1-nrb@linux.ibm.com>

Add a test which modifies CMM page states while migration is in
progress.

Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
 s390x/Makefile               |   1 +
 s390x/migration-during-cmm.c | 121 +++++++++++++++++++++++++++++++++++
 s390x/unittests.cfg          |   5 ++
 3 files changed, 127 insertions(+)
 create mode 100644 s390x/migration-during-cmm.c

diff --git a/s390x/Makefile b/s390x/Makefile
index 401cb6371cee..64c7c04409ae 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -39,6 +39,7 @@ tests += $(TEST_DIR)/panic-loop-extint.elf
 tests += $(TEST_DIR)/panic-loop-pgm.elf
 tests += $(TEST_DIR)/migration-sck.elf
 tests += $(TEST_DIR)/exittime.elf
+tests += $(TEST_DIR)/migration-during-cmm.elf
 
 pv-tests += $(TEST_DIR)/pv-diags.elf
 
diff --git a/s390x/migration-during-cmm.c b/s390x/migration-during-cmm.c
new file mode 100644
index 000000000000..afe1f73605ba
--- /dev/null
+++ b/s390x/migration-during-cmm.c
@@ -0,0 +1,121 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Perform CMMA actions while migrating.
+ *
+ * Copyright IBM Corp. 2022
+ *
+ * Authors:
+ *  Nico Boehr <nrb@linux.ibm.com>
+ */
+
+#include <libcflat.h>
+#include <smp.h>
+#include <asm-generic/barrier.h>
+
+#include "cmm.h"
+
+#define NUM_PAGES 128
+
+/*
+ * Allocate 3 pages more than we need so we can start at different offsets. This ensures page states
+ * change on every loop iteration.
+ */
+static uint8_t pagebuf[(NUM_PAGES + 3) * PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
+
+static unsigned int thread_iters;
+static int thread_should_exit;
+static int thread_exited;
+struct cmm_verify_result result;
+
+static void test_cmm_during_migration(void)
+{
+	uint8_t *pagebuf_start;
+	/*
+	 * The second CPU must not print on the console, otherwise it will race with
+	 * the primary CPU on the SCLP buffer.
+	 */
+	while (!thread_should_exit) {
+		/*
+		 * Start on a offset different from the last iteration so page states change with
+		 * every iteration. This is why pagebuf has 3 extra pages.
+		 */
+		pagebuf_start = pagebuf + (thread_iters % 4) * PAGE_SIZE;
+		cmm_set_page_states(pagebuf_start, NUM_PAGES);
+
+		/*
+		 * Always increment even if the verify fails. This ensures primary CPU knows where
+		 * we left off and can do an additional verify round after migration finished.
+		 */
+		thread_iters++;
+
+		result = cmm_verify_page_states(pagebuf_start, NUM_PAGES);
+		if (result.verify_failed)
+			goto out;
+	}
+
+out:
+	WRITE_ONCE(thread_exited, 1);
+}
+
+int main(void)
+{
+	bool has_essa = check_essa_available();
+	struct psw psw;
+
+	report_prefix_push("migration-during-cmm");
+	if (!has_essa) {
+		report_skip("ESSA is not available");
+		goto error;
+	}
+
+	if (smp_query_num_cpus() == 1) {
+		report_skip("need at least 2 cpus for this test");
+		goto error;
+	}
+
+	psw.mask = extract_psw_mask();
+	psw.addr = (unsigned long)test_cmm_during_migration;
+	smp_cpu_setup(1, psw);
+
+	puts("Please migrate me, then press return\n");
+	(void)getchar();
+
+	WRITE_ONCE(thread_should_exit, 1);
+
+	while (!thread_exited)
+		mb();
+
+	report_info("thread completed %u iterations", thread_iters);
+
+	report_prefix_push("during migration");
+	cmm_report_verify(&result);
+	report_prefix_pop();
+
+	/*
+	 * Verification of page states occurs on the thread. We don't know if we
+	 * were still migrating during the verification.
+	 * To be sure, make another verification round after the migration
+	 * finished to catch page states which might not have been migrated
+	 * correctly.
+	 */
+	report_prefix_push("after migration");
+	assert(thread_iters > 0);
+	result = cmm_verify_page_states(pagebuf + ((thread_iters - 1) % 4) * PAGE_SIZE, NUM_PAGES);
+	cmm_report_verify(&result);
+	report_prefix_pop();
+
+	goto done;
+
+error:
+	/*
+	 * If we just exit and don't ask migrate_cmd to migrate us, it
+	 * will just hang forever. Hence, also ask for migration when we
+	 * skip this test alltogether.
+	 */
+	puts("Please migrate me, then press return\n");
+	(void)getchar();
+
+done:
+	report_prefix_pop();
+	return report_summary();
+}
diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg
index 3caf81eda396..f6889bd4da01 100644
--- a/s390x/unittests.cfg
+++ b/s390x/unittests.cfg
@@ -208,3 +208,8 @@ groups = migration
 [exittime]
 file = exittime.elf
 smp = 2
+
+[migration-during-cmm]
+file = migration-during-cmm.elf
+groups = migration
+smp = 2
-- 
2.36.1


  parent reply	other threads:[~2022-11-24 13:44 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-24 13:44 [kvm-unit-tests PATCH v2 0/2] s390x: test CMM during migration Nico Boehr
2022-11-24 13:44 ` [kvm-unit-tests PATCH v2 1/2] s390x: add a library for CMM-related functions Nico Boehr
2022-11-25 13:45   ` Thomas Huth
2022-11-28 11:44     ` Nico Boehr
2022-11-25 14:03   ` Claudio Imbrenda
2022-11-28 12:12     ` Nico Boehr
2022-11-24 13:44 ` Nico Boehr [this message]
2022-11-25 13:58   ` [kvm-unit-tests PATCH v2 2/2] s390x: add CMM test during migration Thomas Huth
2022-11-25 14:05     ` Claudio Imbrenda
2022-11-25 14:18       ` Thomas Huth
2022-11-25 14:46   ` Claudio Imbrenda

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=20221124134429.612467-3-nrb@linux.ibm.com \
    --to=nrb@linux.ibm.com \
    --cc=frankja@linux.ibm.com \
    --cc=imbrenda@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=thuth@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.