sandbox: vm: implement vm_cache_free() and kfree()
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
#include <socks/queue.h>
|
#include <socks/queue.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <socks/vm.h>
|
#include <socks/vm.h>
|
||||||
|
|
||||||
#define FREELIST_END ((unsigned int)-1)
|
#define FREELIST_END ((unsigned int)-1)
|
||||||
@@ -178,5 +180,38 @@ void *vm_cache_alloc(vm_cache_t *cache, vm_flags_t flags)
|
|||||||
|
|
||||||
void vm_cache_free(vm_cache_t *cache, void *p)
|
void vm_cache_free(vm_cache_t *cache, void *p)
|
||||||
{
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
spin_lock_irqsave(&cache->c_lock, &irq_flags);
|
||||||
|
|
||||||
|
phys_addr_t phys = vm_virt_to_phys(p);
|
||||||
|
vm_page_t *pg = vm_page_get(phys);
|
||||||
|
|
||||||
|
if (!pg || !pg->p_slab) {
|
||||||
|
spin_unlock_irqrestore(&cache->c_lock, irq_flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vm_slab_t *slab = pg->p_slab;
|
||||||
|
|
||||||
|
if (slab->s_cache != cache) {
|
||||||
|
spin_unlock_irqrestore(&cache->c_lock, irq_flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slab->s_free == FREELIST_END) {
|
||||||
|
queue_delete(&cache->c_slabs_full, &slab->s_list);
|
||||||
|
} else {
|
||||||
|
queue_delete(&cache->c_slabs_partial, &slab->s_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int slot = pointer_to_slot(slab, p);
|
||||||
|
slab_free_slot(slab, slot);
|
||||||
|
|
||||||
|
if (slab->s_obj_allocated == 0) {
|
||||||
|
queue_push_back(&cache->c_slabs_empty, &slab->s_list);
|
||||||
|
} else {
|
||||||
|
queue_push_back(&cache->c_slabs_partial, &slab->s_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&cache->c_lock, irq_flags);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,11 +57,17 @@ void *kzalloc(size_t count, vm_flags_t flags)
|
|||||||
if (p) {
|
if (p) {
|
||||||
memset(p, 0x0, count);
|
memset(p, 0x0, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kfree(void *p)
|
void kfree(void *p)
|
||||||
{
|
{
|
||||||
/* TODO */
|
phys_addr_t phys = vm_virt_to_phys(p);
|
||||||
|
vm_page_t *pg = vm_page_get(phys);
|
||||||
|
if (!pg || !pg->p_slab) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vm_cache_free(pg->p_slab->s_cache, p);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user