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