Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

nitro_enclaves: Add KUnit tests for contiguous physical memory regions merging

Add KUnit tests for the contiguous physical memory regions merging
functionality from the Nitro Enclaves misc device logic.

We can build the test binary with the following configuration:
CONFIG_KUNIT=y
CONFIG_NITRO_ENCLAVES=m
CONFIG_NITRO_ENCLAVES_MISC_DEV_TEST=y
and install the nitro_enclaves module to run the testcases.

We'll see the following message using dmesg if everything goes well:

[...] # Subtest: ne_misc_dev_test
[...] 1..1
[...] (NULL device *): Physical mem region address is not 2 MiB aligned
[...] (NULL device *): Physical mem region size is not multiple of 2 MiB
[...] (NULL device *): Physical mem region address is not 2 MiB aligned
[...] ok 1 - ne_misc_dev_test_merge_phys_contig_memory_regions
[...] ok 1 - ne_misc_dev_test

Reviewed-by: Andra Paraschiv <andraprs@amazon.com>
Signed-off-by: Longpeng <longpeng2@huawei.com>
Link: https://lore.kernel.org/r/20211107140918.2106-5-longpeng2@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Longpeng and committed by
Greg Kroah-Hartman
fbf3443f 07503b3c

+140
+140
drivers/virt/nitro_enclaves/ne_misc_dev_test.c
··· 2 2 3 3 #include <kunit/test.h> 4 4 5 + #define MAX_PHYS_REGIONS 16 6 + #define INVALID_VALUE (~0ull) 7 + 8 + struct ne_phys_regions_test { 9 + u64 paddr; 10 + u64 size; 11 + int expect_rc; 12 + unsigned long expect_num; 13 + u64 expect_last_paddr; 14 + u64 expect_last_size; 15 + } phys_regions_test_cases[] = { 16 + /* 17 + * Add the region from 0x1000 to (0x1000 + 0x200000 - 1): 18 + * Expected result: 19 + * Failed, start address is not 2M-aligned 20 + * 21 + * Now the instance of struct ne_phys_contig_mem_regions is: 22 + * num = 0 23 + * regions = {} 24 + */ 25 + {0x1000, 0x200000, -EINVAL, 0, INVALID_VALUE, INVALID_VALUE}, 26 + 27 + /* 28 + * Add the region from 0x200000 to (0x200000 + 0x1000 - 1): 29 + * Expected result: 30 + * Failed, size is not 2M-aligned 31 + * 32 + * Now the instance of struct ne_phys_contig_mem_regions is: 33 + * num = 0 34 + * regions = {} 35 + */ 36 + {0x200000, 0x1000, -EINVAL, 0, INVALID_VALUE, INVALID_VALUE}, 37 + 38 + /* 39 + * Add the region from 0x200000 to (0x200000 + 0x200000 - 1): 40 + * Expected result: 41 + * Successful 42 + * 43 + * Now the instance of struct ne_phys_contig_mem_regions is: 44 + * num = 1 45 + * regions = { 46 + * {start=0x200000, end=0x3fffff}, // len=0x200000 47 + * } 48 + */ 49 + {0x200000, 0x200000, 0, 1, 0x200000, 0x200000}, 50 + 51 + /* 52 + * Add the region from 0x0 to (0x0 + 0x200000 - 1): 53 + * Expected result: 54 + * Successful 55 + * 56 + * Now the instance of struct ne_phys_contig_mem_regions is: 57 + * num = 2 58 + * regions = { 59 + * {start=0x200000, end=0x3fffff}, // len=0x200000 60 + * {start=0x0, end=0x1fffff}, // len=0x200000 61 + * } 62 + */ 63 + {0x0, 0x200000, 0, 2, 0x0, 0x200000}, 64 + 65 + /* 66 + * Add the region from 0x600000 to (0x600000 + 0x400000 - 1): 67 + * Expected result: 68 + * Successful 69 + * 70 + * Now the instance of struct ne_phys_contig_mem_regions is: 71 + * num = 3 72 + * regions = { 73 + * {start=0x200000, end=0x3fffff}, // len=0x200000 74 + * {start=0x0, end=0x1fffff}, // len=0x200000 75 + * {start=0x600000, end=0x9fffff}, // len=0x400000 76 + * } 77 + */ 78 + {0x600000, 0x400000, 0, 3, 0x600000, 0x400000}, 79 + 80 + /* 81 + * Add the region from 0xa00000 to (0xa00000 + 0x400000 - 1): 82 + * Expected result: 83 + * Successful, merging case! 84 + * 85 + * Now the instance of struct ne_phys_contig_mem_regions is: 86 + * num = 3 87 + * regions = { 88 + * {start=0x200000, end=0x3fffff}, // len=0x200000 89 + * {start=0x0, end=0x1fffff}, // len=0x200000 90 + * {start=0x600000, end=0xdfffff}, // len=0x800000 91 + * } 92 + */ 93 + {0xa00000, 0x400000, 0, 3, 0x600000, 0x800000}, 94 + 95 + /* 96 + * Add the region from 0x1000 to (0x1000 + 0x200000 - 1): 97 + * Expected result: 98 + * Failed, start address is not 2M-aligned 99 + * 100 + * Now the instance of struct ne_phys_contig_mem_regions is: 101 + * num = 3 102 + * regions = { 103 + * {start=0x200000, end=0x3fffff}, // len=0x200000 104 + * {start=0x0, end=0x1fffff}, // len=0x200000 105 + * {start=0x600000, end=0xdfffff}, // len=0x800000 106 + * } 107 + */ 108 + {0x1000, 0x200000, -EINVAL, 3, 0x600000, 0x800000}, 109 + }; 110 + 111 + static void ne_misc_dev_test_merge_phys_contig_memory_regions(struct kunit *test) 112 + { 113 + struct ne_phys_contig_mem_regions phys_contig_mem_regions = {}; 114 + int rc = 0; 115 + int i = 0; 116 + 117 + phys_contig_mem_regions.regions = kunit_kcalloc(test, MAX_PHYS_REGIONS, 118 + sizeof(*phys_contig_mem_regions.regions), 119 + GFP_KERNEL); 120 + KUNIT_ASSERT_TRUE(test, phys_contig_mem_regions.regions); 121 + 122 + for (i = 0; i < ARRAY_SIZE(phys_regions_test_cases); i++) { 123 + struct ne_phys_regions_test *test_case = &phys_regions_test_cases[i]; 124 + unsigned long num = 0; 125 + 126 + rc = ne_merge_phys_contig_memory_regions(&phys_contig_mem_regions, 127 + test_case->paddr, test_case->size); 128 + KUNIT_EXPECT_EQ(test, rc, test_case->expect_rc); 129 + KUNIT_EXPECT_EQ(test, phys_contig_mem_regions.num, test_case->expect_num); 130 + 131 + if (test_case->expect_last_paddr == INVALID_VALUE) 132 + continue; 133 + 134 + num = phys_contig_mem_regions.num; 135 + KUNIT_EXPECT_EQ(test, phys_contig_mem_regions.regions[num - 1].start, 136 + test_case->expect_last_paddr); 137 + KUNIT_EXPECT_EQ(test, range_len(&phys_contig_mem_regions.regions[num - 1]), 138 + test_case->expect_last_size); 139 + } 140 + 141 + kunit_kfree(test, phys_contig_mem_regions.regions); 142 + } 143 + 5 144 static struct kunit_case ne_misc_dev_test_cases[] = { 145 + KUNIT_CASE(ne_misc_dev_test_merge_phys_contig_memory_regions), 6 146 {} 7 147 }; 8 148