Ejemplo n.º 1
0
static void free_object(struct kmem_cache *cache, void *object)
{
    struct slab_page *slab = VIRT_TO_PAGE(object);
    if (slab->cache != cache)
        panic("[slab] - Fatal error, free object in wrong cache.");

    slab->free[slab->avail++] = object;

    if (slab->avail == 1 && slab->avail < slab->limit)
    {
        /* Move from full slab list into partial slab list. */
        slab_list_remove(slab);
        slab_list_insert(&cache->partial_slab, slab);
    }
    else if (slab->avail == slab->limit)
    {
        /* Move from partial slab list into free slab list. */
        slab_list_remove(slab);
        slab_list_insert(&cache->free_slab, slab);
    }
}
Ejemplo n.º 2
0
void slab_destroy(slab_t** slab)
{
	/* Disconnect from the list */
	slab_list_remove(*slab);

	/* Free slab */
	slab_depot_free(*slab);

	/* Invalidate pointer. */
	dbg_mem("%s: deleted slab %p\n", __func__, *slab);
	*slab = 0;
}
Ejemplo n.º 3
0
static inline void * alloc_object_from_slab(struct slab_page *slab)
{
    void *object = NULL;
    if (slab->avail == 0)
        panic("[slab] - Fatal error, alloc object from full slab.");

    object = slab->free[--slab->avail];

    if (slab->avail == 0)
    {
        /* Move from partial slab list into full slab list. */
        slab_list_remove(slab);
        slab_list_insert(&slab->cache->full_slab, slab);
    }
    else if (slab->avail + 1 == slab->limit)
    {
        /* Move from free slab list into partial slab list. */
        slab_list_remove(slab);
        slab_list_insert(&slab->cache->partial_slab, slab);
    }

    return object;
}
Ejemplo n.º 4
0
static inline void slab_list_destroy(struct slab_page *head)
{
    struct slab_page *slab = slab_list_first(head);
    while (slab != head)
    {
        /* Remove from list */
        struct slab_page *temp = slab;
        slab = slab->next;
        slab_list_remove(temp);

        /* Free physical memory page */
        pmm_free_page_address(CAST_VIRTUAL_TO_PHYSICAL(temp));
    }
}
Ejemplo n.º 5
0
/*! \brief Move slab from one linked list to another. */
static inline void slab_list_move(slab_t** target, slab_t* slab)
{
	slab_list_remove(slab);
	slab_list_insert(target, slab);
}