| 1 | #include "mem/slab/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DECLARE(slab, .intensity_desc = { |
| 4 | .curve = SCALE_PIECEWISE_LOG, |
| 5 | .unit = "iters" , |
| 6 | }); |
| 7 | |
| 8 | static char hooray[128] = {0}; |
| 9 | TEST_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 | |
| 27 | static char a_msg[128]; |
| 28 | TEST_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 | |