13#define MAX_FREED_VADDRS 512
15#define DEFAULT_SLAB_ADDR 0xFFFFFF8080000000
48 LOG_INFO(
"SLAB",
"created new slab cache '%s' at phys 0x%x",
name,
63 (*cache)->default_virt_addr =
false;
65 (*cache)->default_virt_addr =
true;
70 (*cache)->current_virt_addr = vaddr +
BLOCK_SIZE;
75 if (actual_size <
sizeof(
void*)) {
76 actual_size =
sizeof(
void*);
81 (*cache)->actual_obj_size = actual_size;
84 (*cache)->slabs_full = 0;
85 (*cache)->slabs_partial = 0;
86 (*cache)->slabs_free = 0;
87 (*cache)->total_slabs = 0;
88 (*cache)->total_objects = 0;
89 (*cache)->free_objects = 0;
111 if (
cache->default_virt_addr) {
120 cache->total_slabs++;
128 +
sizeof(
struct slab));
140 (
void*) (obj +
cache->actual_obj_size);
141 obj +=
cache->actual_obj_size;
143 *(
void**) obj =
NULL;
154 "slab '%s' has no free objects but in partial list!",
161 cache->free_objects--;
162 cache->total_objects++;
181 struct slab*
slab = (*cache)->slabs_full;
189 if ((*cache)->default_virt_addr)
195 slab = (*cache)->slabs_partial;
203 if ((*cache)->default_virt_addr)
209 slab = (*cache)->slabs_free;
217 if ((*cache)->default_virt_addr)
250 *
cache->actual_obj_size) {
265 *
cache->actual_obj_size) {
282 cache->free_objects++;
283 cache->total_objects--;
static size_t freed_vaddr_count
static freed_t freed_vaddrs[512]
#define ALIGN_UP(x, align)
page_t paging_get_highest_page_map(void)
void paging_unmap_page(page_t page_dir, uint64_t virt)
void vxMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t flags)
void * phys_base_alloc(uint64_t block)
void vxPhysBaseFree(void *ptr, uint64_t size)
struct process_node cache
#define LOG_ERROR(mod, fmt,...)
#define LOG_INFO(mod, fmt,...)
void * vxSlabAlloc(struct slab_cache *cache)
void slab_cache_destroy(struct slab_cache **cache)
static uintptr_t last_slab_addr
static void push_freed_vaddr(uintptr_t vaddr)
void slab_free(struct slab_cache *cache, void *obj)
#define DEFAULT_SLAB_ADDR
static uintptr_t get_default_slab_addr()
static spinlock_t slab_global_lock
void vxCreateSlabCache(struct slab_cache **cache, const char *name, const size_t obj_size, size_t alignment, const uintptr_t virt_addr)
void spin_acquire(spinlock_t *lock)
void spin_release(spinlock_t *lock)
void strcpy(char *dest, const char *src)
void memset(void *ptr, int value, size_t num)