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