[RESEND PATCH v5 3/6] kvm powerpc/book3s-apiv2: Add kunit tests for Hostwide GSB elements

2025-04-16 Thread Vaibhav Jain
Update 'test-guest-state-buffer.c' to add two new KUNIT test cases for
validating correctness of changes to Guest-state-buffer management
infrastructure for adding support for Hostwide GSB elements.

The newly introduced test test_gs_hostwide_msg() checks if the Hostwide
elements can be set and parsed from a Guest-state-buffer. The second kunit
test test_gs_hostwide_counters() checks if the Hostwide GSB elements can be
send to the L0-PowerVM hypervisor via the H_GUEST_SET_STATE hcall and
ensures that the returned guest-state-buffer has all the 5 Hostwide stat
counters present.

Below is the KATP test report with the newly added KUNIT tests:

KTAP version 1
# Subtest: guest_state_buffer_test
# module: test_guest_state_buffer
1..7
ok 1 test_creating_buffer
ok 2 test_adding_element
ok 3 test_gs_bitmap
ok 4 test_gs_parsing
ok 5 test_gs_msg
ok 6 test_gs_hostwide_msg
# test_gs_hostwide_counters: Guest Heap Size=0 bytes
# test_gs_hostwide_counters: Guest Heap Size Max=10995367936 bytes
# test_gs_hostwide_counters: Guest Page-table Size=2178304 bytes
# test_gs_hostwide_counters: Guest Page-table Size Max=2147483648 bytes
# test_gs_hostwide_counters: Guest Page-table Reclaim Size=0 bytes
ok 7 test_gs_hostwide_counters
 # guest_state_buffer_test: pass:7 fail:0 skip:0 total:7
 # Totals: pass:7 fail:0 skip:0 total:7
 ok 1 guest_state_buffer_test

Signed-off-by: Vaibhav Jain 
---
Changelog

v5->resend:
* Rebase the patch to latest upstream kernel tree

v4->v5:
None

v3->v4:
* Force skip of kunit test 'test_gs_hostwide_counters' on baremetal kvm-hv
as it was causing a kernel exception.

v2->v3:
None

v1->v2:
None
---
 arch/powerpc/kvm/test-guest-state-buffer.c | 214 +
 1 file changed, 214 insertions(+)

diff --git a/arch/powerpc/kvm/test-guest-state-buffer.c 
b/arch/powerpc/kvm/test-guest-state-buffer.c
index bfd225329a18..5ccca306997a 100644
--- a/arch/powerpc/kvm/test-guest-state-buffer.c
+++ b/arch/powerpc/kvm/test-guest-state-buffer.c
@@ -5,6 +5,7 @@
 #include 
 
 #include 
+#include 
 
 static void test_creating_buffer(struct kunit *test)
 {
@@ -141,6 +142,16 @@ static void test_gs_bitmap(struct kunit *test)
i++;
}
 
+   for (u16 iden = KVMPPC_GSID_L0_GUEST_HEAP;
+iden <= KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM; iden++) {
+   kvmppc_gsbm_set(&gsbm, iden);
+   kvmppc_gsbm_set(&gsbm1, iden);
+   KUNIT_EXPECT_TRUE(test, kvmppc_gsbm_test(&gsbm, iden));
+   kvmppc_gsbm_clear(&gsbm, iden);
+   KUNIT_EXPECT_FALSE(test, kvmppc_gsbm_test(&gsbm, iden));
+   i++;
+   }
+
for (u16 iden = KVMPPC_GSID_RUN_INPUT; iden <= KVMPPC_GSID_VPA;
 iden++) {
kvmppc_gsbm_set(&gsbm, iden);
@@ -309,12 +320,215 @@ static void test_gs_msg(struct kunit *test)
kvmppc_gsm_free(gsm);
 }
 
+/* Test data struct for hostwide/L0 counters */
+struct kvmppc_gs_msg_test_hostwide_data {
+   u64 guest_heap;
+   u64 guest_heap_max;
+   u64 guest_pgtable_size;
+   u64 guest_pgtable_size_max;
+   u64 guest_pgtable_reclaim;
+};
+
+static size_t test_hostwide_get_size(struct kvmppc_gs_msg *gsm)
+
+{
+   size_t size = 0;
+   u16 ids[] = {
+   KVMPPC_GSID_L0_GUEST_HEAP,
+   KVMPPC_GSID_L0_GUEST_HEAP_MAX,
+   KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE,
+   KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX,
+   KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM
+   };
+
+   for (int i = 0; i < ARRAY_SIZE(ids); i++)
+   size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i]));
+   return size;
+}
+
+static int test_hostwide_fill_info(struct kvmppc_gs_buff *gsb,
+  struct kvmppc_gs_msg *gsm)
+{
+   struct kvmppc_gs_msg_test_hostwide_data *data = gsm->data;
+
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_HEAP))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_HEAP,
+  data->guest_heap);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_HEAP_MAX))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_HEAP_MAX,
+  data->guest_heap_max);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE,
+  data->guest_pgtable_size);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX,
+  data->guest_pgtable_size_max);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM,
+  data->guest_pgtable_reclaim);
+
+   return 0;
+}
+
+static int test_hostwide_re

[PATCH v5 3/6] kvm powerpc/book3s-apiv2: Add kunit tests for Hostwide GSB elements

2025-03-17 Thread Vaibhav Jain
Update 'test-guest-state-buffer.c' to add two new KUNIT test cases for
validating correctness of changes to Guest-state-buffer management
infrastructure for adding support for Hostwide GSB elements.

The newly introduced test test_gs_hostwide_msg() checks if the Hostwide
elements can be set and parsed from a Guest-state-buffer. The second kunit
test test_gs_hostwide_counters() checks if the Hostwide GSB elements can be
send to the L0-PowerVM hypervisor via the H_GUEST_SET_STATE hcall and
ensures that the returned guest-state-buffer has all the 5 Hostwide stat
counters present.

Below is the KATP test report with the newly added KUNIT tests:

KTAP version 1
# Subtest: guest_state_buffer_test
# module: test_guest_state_buffer
1..7
ok 1 test_creating_buffer
ok 2 test_adding_element
ok 3 test_gs_bitmap
ok 4 test_gs_parsing
ok 5 test_gs_msg
ok 6 test_gs_hostwide_msg
# test_gs_hostwide_counters: Guest Heap Size=0 bytes
# test_gs_hostwide_counters: Guest Heap Size Max=10995367936 bytes
# test_gs_hostwide_counters: Guest Page-table Size=2178304 bytes
# test_gs_hostwide_counters: Guest Page-table Size Max=2147483648 bytes
# test_gs_hostwide_counters: Guest Page-table Reclaim Size=0 bytes
ok 7 test_gs_hostwide_counters
 # guest_state_buffer_test: pass:7 fail:0 skip:0 total:7
 # Totals: pass:7 fail:0 skip:0 total:7
 ok 1 guest_state_buffer_test

Signed-off-by: Vaibhav Jain 
---
Changelog

v4->v5:
None

v3->v4:
* Force skip of kunit test 'test_gs_hostwide_counters' on baremetal kvm-hv
as it was causing a kernel exception.

v2->v3:
None

v1->v2:
None
---
 arch/powerpc/kvm/test-guest-state-buffer.c | 214 +
 1 file changed, 214 insertions(+)

diff --git a/arch/powerpc/kvm/test-guest-state-buffer.c 
b/arch/powerpc/kvm/test-guest-state-buffer.c
index bfd225329a18..5ccca306997a 100644
--- a/arch/powerpc/kvm/test-guest-state-buffer.c
+++ b/arch/powerpc/kvm/test-guest-state-buffer.c
@@ -5,6 +5,7 @@
 #include 
 
 #include 
+#include 
 
 static void test_creating_buffer(struct kunit *test)
 {
@@ -141,6 +142,16 @@ static void test_gs_bitmap(struct kunit *test)
i++;
}
 
+   for (u16 iden = KVMPPC_GSID_L0_GUEST_HEAP;
+iden <= KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM; iden++) {
+   kvmppc_gsbm_set(&gsbm, iden);
+   kvmppc_gsbm_set(&gsbm1, iden);
+   KUNIT_EXPECT_TRUE(test, kvmppc_gsbm_test(&gsbm, iden));
+   kvmppc_gsbm_clear(&gsbm, iden);
+   KUNIT_EXPECT_FALSE(test, kvmppc_gsbm_test(&gsbm, iden));
+   i++;
+   }
+
for (u16 iden = KVMPPC_GSID_RUN_INPUT; iden <= KVMPPC_GSID_VPA;
 iden++) {
kvmppc_gsbm_set(&gsbm, iden);
@@ -309,12 +320,215 @@ static void test_gs_msg(struct kunit *test)
kvmppc_gsm_free(gsm);
 }
 
+/* Test data struct for hostwide/L0 counters */
+struct kvmppc_gs_msg_test_hostwide_data {
+   u64 guest_heap;
+   u64 guest_heap_max;
+   u64 guest_pgtable_size;
+   u64 guest_pgtable_size_max;
+   u64 guest_pgtable_reclaim;
+};
+
+static size_t test_hostwide_get_size(struct kvmppc_gs_msg *gsm)
+
+{
+   size_t size = 0;
+   u16 ids[] = {
+   KVMPPC_GSID_L0_GUEST_HEAP,
+   KVMPPC_GSID_L0_GUEST_HEAP_MAX,
+   KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE,
+   KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX,
+   KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM
+   };
+
+   for (int i = 0; i < ARRAY_SIZE(ids); i++)
+   size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i]));
+   return size;
+}
+
+static int test_hostwide_fill_info(struct kvmppc_gs_buff *gsb,
+  struct kvmppc_gs_msg *gsm)
+{
+   struct kvmppc_gs_msg_test_hostwide_data *data = gsm->data;
+
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_HEAP))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_HEAP,
+  data->guest_heap);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_HEAP_MAX))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_HEAP_MAX,
+  data->guest_heap_max);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE,
+  data->guest_pgtable_size);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX,
+  data->guest_pgtable_size_max);
+   if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM))
+   kvmppc_gse_put_u64(gsb, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM,
+  data->guest_pgtable_reclaim);
+
+   return 0;
+}
+
+static int test_hostwide_refresh_info(struct kvmppc_gs_msg *gsm,
+