0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifdef CONFIG_DAMON_VADDR_KUNIT_TEST
0011
0012 #ifndef _DAMON_VADDR_TEST_H
0013 #define _DAMON_VADDR_TEST_H
0014
0015 #include <kunit/test.h>
0016
0017 static void __link_vmas(struct vm_area_struct *vmas, ssize_t nr_vmas)
0018 {
0019 int i, j;
0020 unsigned long largest_gap, gap;
0021
0022 if (!nr_vmas)
0023 return;
0024
0025 for (i = 0; i < nr_vmas - 1; i++) {
0026 vmas[i].vm_next = &vmas[i + 1];
0027
0028 vmas[i].vm_rb.rb_left = NULL;
0029 vmas[i].vm_rb.rb_right = &vmas[i + 1].vm_rb;
0030
0031 largest_gap = 0;
0032 for (j = i; j < nr_vmas; j++) {
0033 if (j == 0)
0034 continue;
0035 gap = vmas[j].vm_start - vmas[j - 1].vm_end;
0036 if (gap > largest_gap)
0037 largest_gap = gap;
0038 }
0039 vmas[i].rb_subtree_gap = largest_gap;
0040 }
0041 vmas[i].vm_next = NULL;
0042 vmas[i].vm_rb.rb_right = NULL;
0043 vmas[i].rb_subtree_gap = 0;
0044 }
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 static void damon_test_three_regions_in_vmas(struct kunit *test)
0074 {
0075 struct damon_addr_range regions[3] = {0,};
0076
0077 struct vm_area_struct vmas[] = {
0078 (struct vm_area_struct) {.vm_start = 10, .vm_end = 20},
0079 (struct vm_area_struct) {.vm_start = 20, .vm_end = 25},
0080 (struct vm_area_struct) {.vm_start = 200, .vm_end = 210},
0081 (struct vm_area_struct) {.vm_start = 210, .vm_end = 220},
0082 (struct vm_area_struct) {.vm_start = 300, .vm_end = 305},
0083 (struct vm_area_struct) {.vm_start = 307, .vm_end = 330},
0084 };
0085
0086 __link_vmas(vmas, 6);
0087
0088 __damon_va_three_regions(&vmas[0], regions);
0089
0090 KUNIT_EXPECT_EQ(test, 10ul, regions[0].start);
0091 KUNIT_EXPECT_EQ(test, 25ul, regions[0].end);
0092 KUNIT_EXPECT_EQ(test, 200ul, regions[1].start);
0093 KUNIT_EXPECT_EQ(test, 220ul, regions[1].end);
0094 KUNIT_EXPECT_EQ(test, 300ul, regions[2].start);
0095 KUNIT_EXPECT_EQ(test, 330ul, regions[2].end);
0096 }
0097
0098 static struct damon_region *__nth_region_of(struct damon_target *t, int idx)
0099 {
0100 struct damon_region *r;
0101 unsigned int i = 0;
0102
0103 damon_for_each_region(r, t) {
0104 if (i++ == idx)
0105 return r;
0106 }
0107
0108 return NULL;
0109 }
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 static void damon_do_test_apply_three_regions(struct kunit *test,
0134 unsigned long *regions, int nr_regions,
0135 struct damon_addr_range *three_regions,
0136 unsigned long *expected, int nr_expected)
0137 {
0138 struct damon_target *t;
0139 struct damon_region *r;
0140 int i;
0141
0142 t = damon_new_target();
0143 for (i = 0; i < nr_regions / 2; i++) {
0144 r = damon_new_region(regions[i * 2], regions[i * 2 + 1]);
0145 damon_add_region(r, t);
0146 }
0147
0148 damon_set_regions(t, three_regions, 3);
0149
0150 for (i = 0; i < nr_expected / 2; i++) {
0151 r = __nth_region_of(t, i);
0152 KUNIT_EXPECT_EQ(test, r->ar.start, expected[i * 2]);
0153 KUNIT_EXPECT_EQ(test, r->ar.end, expected[i * 2 + 1]);
0154 }
0155 }
0156
0157
0158
0159
0160
0161
0162
0163 static void damon_test_apply_three_regions1(struct kunit *test)
0164 {
0165
0166 unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
0167 70, 80, 80, 90, 90, 100};
0168
0169 struct damon_addr_range new_three_regions[3] = {
0170 (struct damon_addr_range){.start = 5, .end = 27},
0171 (struct damon_addr_range){.start = 45, .end = 55},
0172 (struct damon_addr_range){.start = 73, .end = 104} };
0173
0174 unsigned long expected[] = {5, 20, 20, 27, 45, 55,
0175 73, 80, 80, 90, 90, 104};
0176
0177 damon_do_test_apply_three_regions(test, regions, ARRAY_SIZE(regions),
0178 new_three_regions, expected, ARRAY_SIZE(expected));
0179 }
0180
0181
0182
0183
0184
0185 static void damon_test_apply_three_regions2(struct kunit *test)
0186 {
0187
0188 unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
0189 70, 80, 80, 90, 90, 100};
0190
0191 struct damon_addr_range new_three_regions[3] = {
0192 (struct damon_addr_range){.start = 5, .end = 27},
0193 (struct damon_addr_range){.start = 56, .end = 57},
0194 (struct damon_addr_range){.start = 65, .end = 104} };
0195
0196 unsigned long expected[] = {5, 20, 20, 27, 56, 57,
0197 65, 80, 80, 90, 90, 104};
0198
0199 damon_do_test_apply_three_regions(test, regions, ARRAY_SIZE(regions),
0200 new_three_regions, expected, ARRAY_SIZE(expected));
0201 }
0202
0203
0204
0205
0206
0207
0208
0209 static void damon_test_apply_three_regions3(struct kunit *test)
0210 {
0211
0212 unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
0213 70, 80, 80, 90, 90, 100};
0214
0215 struct damon_addr_range new_three_regions[3] = {
0216 (struct damon_addr_range){.start = 5, .end = 27},
0217 (struct damon_addr_range){.start = 61, .end = 63},
0218 (struct damon_addr_range){.start = 65, .end = 104} };
0219
0220 unsigned long expected[] = {5, 20, 20, 27, 61, 63,
0221 65, 80, 80, 90, 90, 104};
0222
0223 damon_do_test_apply_three_regions(test, regions, ARRAY_SIZE(regions),
0224 new_three_regions, expected, ARRAY_SIZE(expected));
0225 }
0226
0227
0228
0229
0230
0231
0232
0233
0234 static void damon_test_apply_three_regions4(struct kunit *test)
0235 {
0236
0237 unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
0238 70, 80, 80, 90, 90, 100};
0239
0240 struct damon_addr_range new_three_regions[3] = {
0241 (struct damon_addr_range){.start = 5, .end = 7},
0242 (struct damon_addr_range){.start = 30, .end = 32},
0243 (struct damon_addr_range){.start = 65, .end = 68} };
0244
0245 unsigned long expected[] = {5, 7, 30, 32, 65, 68};
0246
0247 damon_do_test_apply_three_regions(test, regions, ARRAY_SIZE(regions),
0248 new_three_regions, expected, ARRAY_SIZE(expected));
0249 }
0250
0251 static void damon_test_split_evenly_fail(struct kunit *test,
0252 unsigned long start, unsigned long end, unsigned int nr_pieces)
0253 {
0254 struct damon_target *t = damon_new_target();
0255 struct damon_region *r = damon_new_region(start, end);
0256
0257 damon_add_region(r, t);
0258 KUNIT_EXPECT_EQ(test,
0259 damon_va_evenly_split_region(t, r, nr_pieces), -EINVAL);
0260 KUNIT_EXPECT_EQ(test, damon_nr_regions(t), 1u);
0261
0262 damon_for_each_region(r, t) {
0263 KUNIT_EXPECT_EQ(test, r->ar.start, start);
0264 KUNIT_EXPECT_EQ(test, r->ar.end, end);
0265 }
0266
0267 damon_free_target(t);
0268 }
0269
0270 static void damon_test_split_evenly_succ(struct kunit *test,
0271 unsigned long start, unsigned long end, unsigned int nr_pieces)
0272 {
0273 struct damon_target *t = damon_new_target();
0274 struct damon_region *r = damon_new_region(start, end);
0275 unsigned long expected_width = (end - start) / nr_pieces;
0276 unsigned long i = 0;
0277
0278 damon_add_region(r, t);
0279 KUNIT_EXPECT_EQ(test,
0280 damon_va_evenly_split_region(t, r, nr_pieces), 0);
0281 KUNIT_EXPECT_EQ(test, damon_nr_regions(t), nr_pieces);
0282
0283 damon_for_each_region(r, t) {
0284 if (i == nr_pieces - 1) {
0285 KUNIT_EXPECT_EQ(test,
0286 r->ar.start, start + i * expected_width);
0287 KUNIT_EXPECT_EQ(test, r->ar.end, end);
0288 break;
0289 }
0290 KUNIT_EXPECT_EQ(test,
0291 r->ar.start, start + i++ * expected_width);
0292 KUNIT_EXPECT_EQ(test, r->ar.end, start + i * expected_width);
0293 }
0294 damon_free_target(t);
0295 }
0296
0297 static void damon_test_split_evenly(struct kunit *test)
0298 {
0299 KUNIT_EXPECT_EQ(test, damon_va_evenly_split_region(NULL, NULL, 5),
0300 -EINVAL);
0301
0302 damon_test_split_evenly_fail(test, 0, 100, 0);
0303 damon_test_split_evenly_succ(test, 0, 100, 10);
0304 damon_test_split_evenly_succ(test, 5, 59, 5);
0305 damon_test_split_evenly_fail(test, 5, 6, 2);
0306 }
0307
0308 static struct kunit_case damon_test_cases[] = {
0309 KUNIT_CASE(damon_test_three_regions_in_vmas),
0310 KUNIT_CASE(damon_test_apply_three_regions1),
0311 KUNIT_CASE(damon_test_apply_three_regions2),
0312 KUNIT_CASE(damon_test_apply_three_regions3),
0313 KUNIT_CASE(damon_test_apply_three_regions4),
0314 KUNIT_CASE(damon_test_split_evenly),
0315 {},
0316 };
0317
0318 static struct kunit_suite damon_test_suite = {
0319 .name = "damon-operations",
0320 .test_cases = damon_test_cases,
0321 };
0322 kunit_test_suite(damon_test_suite);
0323
0324 #endif
0325
0326 #endif