1#include "mem/slab/tests/test_internal.h"
2
3TEST_GROUP_DEFINE(slab, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "iters",
6 });
7
8static char hooray[128] = {0};
9TEST_DEFINE_SMOKE(slab, alloc_free) {
10
11 void *p = valloc_new(
12 size: 67, params: (struct alloc_params){.flags = ALLOC_FLAGS_DEFAULT,
13 .behavior = ALLOC_BEHAVIOR_NORMAL});
14
15 time_ms_t ms = time_get_ms();
16 vfree_new(ptr: p, behavior: ALLOC_BEHAVIOR_NORMAL);
17 ms = time_get_ms() - ms;
18
19 snprintf(hooray, 128, "allocated %p and free took %lu ms", p, ms);
20
21 test_info("%s", hooray);
22 return TEST_SUCCESS;
23}
24
25#ifndef CACHE_LINE_SIZE
26#define CACHE_LINE_SIZE 64
27#endif
28
29static char a_msg[128];
30TEST_DEFINE_SMOKE(slab, pattern_integrity) {
31
32 void *p1 =
33 valloc_new(size: 1, params: (struct alloc_params){.flags = ALLOC_FLAGS_DEFAULT,
34 .behavior = ALLOC_BEHAVIOR_NORMAL});
35 void *p2 = valloc_new(
36 size: 64, params: (struct alloc_params){.flags = ALLOC_FLAGS_DEFAULT,
37 .behavior = ALLOC_BEHAVIOR_NORMAL});
38 void *p3 = valloc_new(
39 size: 4096, params: (struct alloc_params){.flags = ALLOC_FLAGS_DEFAULT,
40 .behavior = ALLOC_BEHAVIOR_NORMAL});
41
42 if (!p1 || !p2 || !p3) {
43 test_info("valloc_new returned NULL for a valid request");
44 return TEST_FAIL(NULL);
45 }
46
47 /* Write/read back small pattern to verify memory usable */
48 memset(p1, 0xA5, 1);
49 memset(p2, 0x5A, 64);
50 memset(p3, 0xFF, 4096);
51
52 if (((uint8_t *) p1)[0] != 0xA5 || ((uint8_t *) p2)[0] != 0x5A ||
53 ((uint8_t *) p3)[0] != 0xFF) {
54 test_info("Memory pattern check failed");
55 return TEST_FAIL(NULL);
56 }
57
58 /* timed free to check that vfree_new returns quickly */
59 time_ms_t start = time_get_ms();
60 vfree_new(ptr: p1, behavior: ALLOC_BEHAVIOR_NORMAL);
61 vfree_new(ptr: p2, behavior: ALLOC_BEHAVIOR_NORMAL);
62 vfree_new(ptr: p3, behavior: ALLOC_BEHAVIOR_NORMAL);
63 time_ms_t elapsed = time_get_ms() - start;
64
65 snprintf(a_msg, sizeof(a_msg), "basic alloc/free OK (free took %u ms)",
66 (unsigned) elapsed);
67 test_info("%s", a_msg);
68 return TEST_SUCCESS;
69}
70