Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  test-guest-state-buffer.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-or-later

#include <linux/init.h>
#include <linux/log2.h>
#include <kunit/test.h>

#include <asm/guest-state-buffer.h>
#include <asm/kvm_ppc.h>

static void test_creating_buffer(struct kunit *test)
{
 struct kvmppc_gs_buff *gsb;
 size_t size = 0x100;

 gsb = kvmppc_gsb_new(size, 0, 0, GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb);

 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb->hdr);

 KUNIT_EXPECT_EQ(test, gsb->capacity, roundup_pow_of_two(size));
 KUNIT_EXPECT_EQ(test, gsb->len, sizeof(__be32));

 kvmppc_gsb_free(gsb);
}

static void test_adding_element(struct kunit *test)
{
 const struct kvmppc_gs_elem *head, *curr;
 union {
  __vector128 v;
  u64 dw[2];
 } u;
 int rem;
 struct kvmppc_gs_buff *gsb;
 size_t size = 0x1000;
 int i, rc;
 u64 data;

 gsb = kvmppc_gsb_new(size, 0, 0, GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb);

 /* Single elements, direct use of __kvmppc_gse_put() */
 data = 0xdeadbeef;
 rc = __kvmppc_gse_put(gsb, KVMPPC_GSID_GPR(0), 8, &data);
 KUNIT_EXPECT_GE(test, rc, 0);

 head = kvmppc_gsb_data(gsb);
 KUNIT_EXPECT_EQ(test, kvmppc_gse_iden(head), KVMPPC_GSID_GPR(0));
 KUNIT_EXPECT_EQ(test, kvmppc_gse_len(head), 8);
 data = 0;
 memcpy(&data, kvmppc_gse_data(head), 8);
 KUNIT_EXPECT_EQ(test, data, 0xdeadbeef);

 /* Multiple elements, simple wrapper */
 rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_GPR(1), 0xcafef00d);
 KUNIT_EXPECT_GE(test, rc, 0);

 u.dw[0] = 0x1;
 u.dw[1] = 0x2;
 rc = kvmppc_gse_put_vector128(gsb, KVMPPC_GSID_VSRS(0), &u.v);
 KUNIT_EXPECT_GE(test, rc, 0);
 u.dw[0] = 0x0;
 u.dw[1] = 0x0;

 kvmppc_gsb_for_each_elem(i, curr, gsb, rem) {
  switch (i) {
  case 0:
   KUNIT_EXPECT_EQ(test, kvmppc_gse_iden(curr),
     KVMPPC_GSID_GPR(0));
   KUNIT_EXPECT_EQ(test, kvmppc_gse_len(curr), 8);
   KUNIT_EXPECT_EQ(test, kvmppc_gse_get_be64(curr),
     0xdeadbeef);
   break;
  case 1:
   KUNIT_EXPECT_EQ(test, kvmppc_gse_iden(curr),
     KVMPPC_GSID_GPR(1));
   KUNIT_EXPECT_EQ(test, kvmppc_gse_len(curr), 8);
   KUNIT_EXPECT_EQ(test, kvmppc_gse_get_u64(curr),
     0xcafef00d);
   break;
  case 2:
   KUNIT_EXPECT_EQ(test, kvmppc_gse_iden(curr),
     KVMPPC_GSID_VSRS(0));
   KUNIT_EXPECT_EQ(test, kvmppc_gse_len(curr), 16);
   kvmppc_gse_get_vector128(curr, &u.v);
   KUNIT_EXPECT_EQ(test, u.dw[0], 0x1);
   KUNIT_EXPECT_EQ(test, u.dw[1], 0x2);
   break;
  }
 }
 KUNIT_EXPECT_EQ(test, i, 3);

 kvmppc_gsb_reset(gsb);
 KUNIT_EXPECT_EQ(test, kvmppc_gsb_nelems(gsb), 0);
 KUNIT_EXPECT_EQ(test, kvmppc_gsb_len(gsb),
   sizeof(struct kvmppc_gs_header));

 kvmppc_gsb_free(gsb);
}

static void test_gs_parsing(struct kunit *test)
{
 struct kvmppc_gs_elem *gse;
 struct kvmppc_gs_parser gsp = { 0 };
 struct kvmppc_gs_buff *gsb;
 size_t size = 0x1000;
 u64 tmp1, tmp2;

 gsb = kvmppc_gsb_new(size, 0, 0, GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb);

 tmp1 = 0xdeadbeefull;
 kvmppc_gse_put_u64(gsb, KVMPPC_GSID_GPR(0), tmp1);

 KUNIT_EXPECT_GE(test, kvmppc_gse_parse(&gsp, gsb), 0);

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_GPR(0));
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gse);

 tmp2 = kvmppc_gse_get_u64(gse);
 KUNIT_EXPECT_EQ(test, tmp2, 0xdeadbeefull);

 kvmppc_gsb_free(gsb);
}

static void test_gs_bitmap(struct kunit *test)
{
 struct kvmppc_gs_bitmap gsbm = { 0 };
 struct kvmppc_gs_bitmap gsbm1 = { 0 };
 struct kvmppc_gs_bitmap gsbm2 = { 0 };
 u16 iden;
 int i, j;

 i = 0;
 for (u16 iden = KVMPPC_GSID_HOST_STATE_SIZE;
      iden <= KVMPPC_GSID_PROCESS_TABLE; 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_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);
  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_GPR(0); iden <= KVMPPC_GSE_DW_REGS_END; 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_CR; iden <= KVMPPC_GSID_PSPB; 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_VSRS(0); iden <= KVMPPC_GSID_VSRS(63);
      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_HDAR; iden <= KVMPPC_GSID_ASDR; 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++;
 }

 j = 0;
 kvmppc_gsbm_for_each(&gsbm1, iden)
 {
  kvmppc_gsbm_set(&gsbm2, iden);
  j++;
 }
 KUNIT_EXPECT_EQ(test, i, j);
 KUNIT_EXPECT_MEMEQ(test, &gsbm1, &gsbm2, sizeof(gsbm1));
}

struct kvmppc_gs_msg_test1_data {
 u64 a;
 u32 b;
 struct kvmppc_gs_part_table c;
 struct kvmppc_gs_proc_table d;
 struct kvmppc_gs_buff_info e;
};

static size_t test1_get_size(struct kvmppc_gs_msg *gsm)
{
 size_t size = 0;
 u16 ids[] = {
  KVMPPC_GSID_PARTITION_TABLE,
  KVMPPC_GSID_PROCESS_TABLE,
  KVMPPC_GSID_RUN_INPUT,
  KVMPPC_GSID_GPR(0),
  KVMPPC_GSID_CR,
 };

 for (int i = 0; i < ARRAY_SIZE(ids); i++)
  size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i]));
 return size;
}

static int test1_fill_info(struct kvmppc_gs_buff *gsb,
      struct kvmppc_gs_msg *gsm)
{
 struct kvmppc_gs_msg_test1_data *data = gsm->data;

 if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_GPR(0)))
  kvmppc_gse_put_u64(gsb, KVMPPC_GSID_GPR(0), data->a);

 if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_CR))
  kvmppc_gse_put_u32(gsb, KVMPPC_GSID_CR, data->b);

 if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_PARTITION_TABLE))
  kvmppc_gse_put_part_table(gsb, KVMPPC_GSID_PARTITION_TABLE,
       data->c);

 if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_PROCESS_TABLE))
  kvmppc_gse_put_proc_table(gsb, KVMPPC_GSID_PARTITION_TABLE,
       data->d);

 if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_INPUT))
  kvmppc_gse_put_buff_info(gsb, KVMPPC_GSID_RUN_INPUT, data->e);

 return 0;
}

static int test1_refresh_info(struct kvmppc_gs_msg *gsm,
         struct kvmppc_gs_buff *gsb)
{
 struct kvmppc_gs_parser gsp = { 0 };
 struct kvmppc_gs_msg_test1_data *data = gsm->data;
 struct kvmppc_gs_elem *gse;
 int rc;

 rc = kvmppc_gse_parse(&gsp, gsb);
 if (rc < 0)
  return rc;

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_GPR(0));
 if (gse)
  data->a = kvmppc_gse_get_u64(gse);

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_CR);
 if (gse)
  data->b = kvmppc_gse_get_u32(gse);

 return 0;
}

static struct kvmppc_gs_msg_ops gs_msg_test1_ops = {
 .get_size = test1_get_size,
 .fill_info = test1_fill_info,
 .refresh_info = test1_refresh_info,
};

static void test_gs_msg(struct kunit *test)
{
 struct kvmppc_gs_msg_test1_data test1_data = {
  .a = 0xdeadbeef,
  .b = 0x1,
 };
 struct kvmppc_gs_msg *gsm;
 struct kvmppc_gs_buff *gsb;

 gsm = kvmppc_gsm_new(&gs_msg_test1_ops, &test1_data, GSM_SEND,
        GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsm);

 gsb = kvmppc_gsb_new(kvmppc_gsm_size(gsm), 0, 0, GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_PARTITION_TABLE);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_PROCESS_TABLE);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_RUN_INPUT);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_GPR(0));
 kvmppc_gsm_include(gsm, KVMPPC_GSID_CR);

 kvmppc_gsm_fill_info(gsm, gsb);

 memset(&test1_data, 0, sizeof(test1_data));

 kvmppc_gsm_refresh_info(gsm, gsb);
 KUNIT_EXPECT_EQ(test, test1_data.a, 0xdeadbeef);
 KUNIT_EXPECT_EQ(test, test1_data.b, 0x1);

 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,
          struct kvmppc_gs_buff *gsb)
{
 struct kvmppc_gs_parser gsp = { 0 };
 struct kvmppc_gs_msg_test_hostwide_data *data = gsm->data;
 struct kvmppc_gs_elem *gse;
 int rc;

 rc = kvmppc_gse_parse(&gsp, gsb);
 if (rc < 0)
  return rc;

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_HEAP);
 if (gse)
  data->guest_heap = kvmppc_gse_get_u64(gse);

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_HEAP_MAX);
 if (gse)
  data->guest_heap_max = kvmppc_gse_get_u64(gse);

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE);
 if (gse)
  data->guest_pgtable_size = kvmppc_gse_get_u64(gse);

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX);
 if (gse)
  data->guest_pgtable_size_max = kvmppc_gse_get_u64(gse);

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM);
 if (gse)
  data->guest_pgtable_reclaim = kvmppc_gse_get_u64(gse);

 return 0;
}

static struct kvmppc_gs_msg_ops gs_msg_test_hostwide_ops = {
 .get_size = test_hostwide_get_size,
 .fill_info = test_hostwide_fill_info,
 .refresh_info = test_hostwide_refresh_info,
};

static void test_gs_hostwide_msg(struct kunit *test)
{
 struct kvmppc_gs_msg_test_hostwide_data test_data = {
  .guest_heap = 0xdeadbeef,
  .guest_heap_max = ~0ULL,
  .guest_pgtable_size = 0xff,
  .guest_pgtable_size_max = 0xffffff,
  .guest_pgtable_reclaim = 0xdeadbeef,
 };
 struct kvmppc_gs_msg *gsm;
 struct kvmppc_gs_buff *gsb;

 gsm = kvmppc_gsm_new(&gs_msg_test_hostwide_ops, &test_data, GSM_SEND,
        GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsm);

 gsb = kvmppc_gsb_new(kvmppc_gsm_size(gsm), 0, 0, GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_HEAP);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_HEAP_MAX);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX);
 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM);

 kvmppc_gsm_fill_info(gsm, gsb);

 memset(&test_data, 0, sizeof(test_data));

 kvmppc_gsm_refresh_info(gsm, gsb);
 KUNIT_EXPECT_EQ(test, test_data.guest_heap, 0xdeadbeef);
 KUNIT_EXPECT_EQ(test, test_data.guest_heap_max, ~0ULL);
 KUNIT_EXPECT_EQ(test, test_data.guest_pgtable_size, 0xff);
 KUNIT_EXPECT_EQ(test, test_data.guest_pgtable_size_max, 0xffffff);
 KUNIT_EXPECT_EQ(test, test_data.guest_pgtable_reclaim, 0xdeadbeef);

 kvmppc_gsm_free(gsm);
}

/* Test if the H_GUEST_GET_STATE for hostwide counters works */
static void test_gs_hostwide_counters(struct kunit *test)
{
 struct kvmppc_gs_msg_test_hostwide_data test_data;
 struct kvmppc_gs_parser gsp = { 0 };

 struct kvmppc_gs_msg *gsm;
 struct kvmppc_gs_buff *gsb;
 struct kvmppc_gs_elem *gse;
 int rc;

 if (!kvmhv_on_pseries())
  kunit_skip(test, "This test need a kmv-hv guest");

 gsm = kvmppc_gsm_new(&gs_msg_test_hostwide_ops, &test_data, GSM_SEND,
        GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsm);

 gsb = kvmppc_gsb_new(kvmppc_gsm_size(gsm), 0, 0, GFP_KERNEL);
 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsb);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_HEAP);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_HEAP_MAX);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX);

 kvmppc_gsm_include(gsm, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM);

 kvmppc_gsm_fill_info(gsm, gsb);

 /* With HOST_WIDE flags guestid and vcpuid will be ignored */
 rc = kvmppc_gsb_recv(gsb, KVMPPC_GS_FLAGS_HOST_WIDE);
 KUNIT_ASSERT_EQ(test, rc, 0);

 /* Parse the guest state buffer is successful */
 rc = kvmppc_gse_parse(&gsp, gsb);
 KUNIT_ASSERT_EQ(test, rc, 0);

 /* Parse the GSB and get the counters */
 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_HEAP);
 KUNIT_ASSERT_NOT_NULL_MSG(test, gse, "L0 Heap counter missing");
 kunit_info(test, "Guest Heap Size=%llu bytes",
     kvmppc_gse_get_u64(gse));

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_HEAP_MAX);
 KUNIT_ASSERT_NOT_NULL_MSG(test, gse, "L0 Heap counter max missing");
 kunit_info(test, "Guest Heap Size Max=%llu bytes",
     kvmppc_gse_get_u64(gse));

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE);
 KUNIT_ASSERT_NOT_NULL_MSG(test, gse, "L0 page-table size missing");
 kunit_info(test, "Guest Page-table Size=%llu bytes",
     kvmppc_gse_get_u64(gse));

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX);
 KUNIT_ASSERT_NOT_NULL_MSG(test, gse, "L0 page-table size-max missing");
 kunit_info(test, "Guest Page-table Size Max=%llu bytes",
     kvmppc_gse_get_u64(gse));

 gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM);
 KUNIT_ASSERT_NOT_NULL_MSG(test, gse, "L0 page-table reclaim size missing");
 kunit_info(test, "Guest Page-table Reclaim Size=%llu bytes",
     kvmppc_gse_get_u64(gse));

 kvmppc_gsm_free(gsm);
 kvmppc_gsb_free(gsb);
}

static struct kunit_case guest_state_buffer_testcases[] = {
 KUNIT_CASE(test_creating_buffer),
 KUNIT_CASE(test_adding_element),
 KUNIT_CASE(test_gs_bitmap),
 KUNIT_CASE(test_gs_parsing),
 KUNIT_CASE(test_gs_msg),
 KUNIT_CASE(test_gs_hostwide_msg),
 KUNIT_CASE(test_gs_hostwide_counters),
 {}
};

static struct kunit_suite guest_state_buffer_test_suite = {
 .name = "guest_state_buffer_test",
 .test_cases = guest_state_buffer_testcases,
};

kunit_test_suites(&guest_state_buffer_test_suite);

MODULE_DESCRIPTION("KUnit tests for Guest State Buffer APIs");
MODULE_LICENSE("GPL");

Messung V0.5
C=95 H=89 G=91

¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge