X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fbuddy.c;h=ed692c8ef4730851eb48192ca0d468362a3ba8de;hb=a8686374c6aa74d805b32e7675f42f7ab9a0b348;hp=a68d7868f59c0df0753a025144d867ca9f7fb069;hpb=c10469f54e93ee7a21692f7a19b680610dc57e28;p=palacios.git diff --git a/linux_module/buddy.c b/linux_module/buddy.c index a68d786..ed692c8 100644 --- a/linux_module/buddy.c +++ b/linux_module/buddy.c @@ -155,7 +155,7 @@ int buddy_add_pool(struct buddy_memzone * zone, mp = palacios_alloc_extended(sizeof(struct buddy_mempool), GFP_KERNEL, zone->node_id); - if (IS_ERR(mp)) { + if (!mp) { ERROR("Could not allocate mempool\n"); return -1; } @@ -174,6 +174,13 @@ int buddy_add_pool(struct buddy_memzone * zone, BITS_TO_LONGS(mp->num_blocks) * sizeof(long), GFP_KERNEL, zone->node_id ); + if (!(mp->tag_bits)) { + ERROR("Could not allocate tag_bits\n"); + palacios_free(mp); + return -1; + } + + /* Initially mark all minimum-sized blocks as allocated */ bitmap_zero(mp->tag_bits, mp->num_blocks); @@ -278,13 +285,14 @@ int buddy_remove_pool(struct buddy_memzone * zone, * Arguments: * [IN] mp: Buddy system memory allocator object. * [IN] order: Block size to allocate (2^order bytes). - * [IN] constraints: bitmmask showing restrictions for scan. currently: 0=none, or LWK_BUDDY_CONSTRAINT_4GB + * [IN] filter_func: returns nonzero if given paddr is OK to use + * [IN] filter_state: opaque argument to filter_func * Returns: * Success: Pointer to the start of the allocated memory block. * Failure: NULL */ uintptr_t -buddy_alloc(struct buddy_memzone *zone, unsigned long order, int constraints) +buddy_alloc(struct buddy_memzone *zone, unsigned long order, int (*filter_func)(void *paddr, void *filter_state), void *filter_state) { unsigned long j; struct buddy_mempool * mp = NULL; @@ -294,11 +302,6 @@ buddy_alloc(struct buddy_memzone *zone, unsigned long order, int constraints) struct block * buddy_block = NULL; unsigned long flags = 0; - if (constraints && constraints!=LWK_BUDDY_CONSTRAINT_4GB) { - ERROR("Do not know how to satisfy constraint mask 0x%x\n", constraints); - return (uintptr_t) NULL; - } - BUG_ON(zone == NULL); BUG_ON(order > zone->max_order); @@ -326,23 +329,22 @@ buddy_alloc(struct buddy_memzone *zone, unsigned long order, int constraints) list_for_each(cur, list) { block = list_entry(cur, struct block, link); - if (!constraints) { - // without a constraint, we just want the first one + if (!filter_func) { + // without a filter, we just want the first one break; - } - - if (constraints & LWK_BUDDY_CONSTRAINT_4GB) { - // under this constraint, we will only use if the entirity - // of the allocation within the block will be below 4 GB + } else { + void *block_pa = (void*)__pa(block); - if ((block_pa + (1ULL< pool->pool_order)) { - WARNING("Attempted to free an invalid page address (%p) - pool=%p order=%lu\n", (void *)addr,pool,order); - palacios_spinlock_unlock_irqrestore(&(zone->lock), flags); - return; + WARNING("Attempted to free an invalid page address (%p) - pool=%p order=%lu\n", (void *)addr,pool,order); + palacios_spinlock_unlock_irqrestore(&(zone->lock), flags); + return -1; } @@ -434,7 +436,7 @@ buddy_free( if (is_available(pool, block)) { ERROR("Error: Freeing an available block\n"); palacios_spinlock_unlock_irqrestore(&(zone->lock), flags); - return; + return -1; } pool->num_free_blocks += (1UL << (order - zone->min_order)); @@ -465,6 +467,8 @@ buddy_free( list_add(&(block->link), &(zone->avail[order])); palacios_spinlock_unlock_irqrestore(&(zone->lock), flags); + + return 0; } @@ -530,9 +534,9 @@ zone_mem_show(struct seq_file * s, void * v) { static int zone_proc_open(struct inode * inode, struct file * filp) { - struct proc_dir_entry * proc_entry = PDE(inode); - INFO("proc_entry at %p, data at %p\n", proc_entry, proc_entry->data); - return single_open(filp, zone_mem_show, proc_entry->data); + struct proc_dir_entry * proc_entry = PAL_PDE(inode); + INFO("proc_entry at %p, data at %p\n", proc_entry, PAL_PROC_GETDATA(inode)); + return single_open(filp, zone_mem_show, PAL_PROC_GETDATA(inode)); } @@ -609,7 +613,7 @@ void buddy_deinit(struct buddy_memzone * zone, int (*free_callback)(void *user_m char proc_file_name[128]; memset(proc_file_name, 0, 128); - snprintf(proc_file_name, 128, "v3-mem%d", zone->node_id); + snprintf(proc_file_name, 128, "v3-mem%u", zone->node_id); remove_proc_entry(proc_file_name, palacios_get_procdir()); } @@ -651,6 +655,8 @@ buddy_init( { struct buddy_memzone * zone = NULL; unsigned long i; + struct proc_dir_entry * zone_entry = NULL; + char proc_file_name[128]; DEBUG("Initializing Memory zone with up to %lu bit blocks on Node %d\n", max_order, node_id); @@ -701,23 +707,17 @@ buddy_init( INFO("Allocated zone at %p\n", zone); - { - struct proc_dir_entry * zone_entry = NULL; - char proc_file_name[128]; memset(proc_file_name, 0, 128); snprintf(proc_file_name, 128, "v3-mem%u", zone->node_id); - zone_entry = create_proc_entry(proc_file_name, 0444, palacios_get_procdir()); - if (zone_entry) { - zone_entry->proc_fops = &zone_proc_ops; - zone_entry->data = zone; + PAL_PROC_CREATE_DATA(zone_entry, proc_file_name, 0444, palacios_get_procdir(), &zone_proc_ops, zone); + if (zone_entry) { INFO("Successfully created /proc/v3vee/v3-mem%d\n", zone->node_id); } else { ERROR("Cannot create /proc/v3vee/v3-mem%d\n", zone->node_id); } - } return zone; }