Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Linux compatibility fixes
[palacios.git] / linux_module / buddy.c
index a68d786..ed692c8 100644 (file)
@@ -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<<order)) <= (void*)(0x100000000ULL)) {
+
+               if (filter_func(block_pa,filter_state)) { 
                    // this block will work
                    break;
                } else {
-                   // look for the next block
+                   // this block won't work
                    block=NULL;
                    continue;
                }
+
            }
        }
        
@@ -387,7 +389,7 @@ buddy_alloc(struct buddy_memzone *zone, unsigned long order, int constraints)
 /**
  * Returns a block of memory to the buddy system memory allocator.
  */
-void
+int
 buddy_free(
        //!    Buddy system memory allocator object.
        struct buddy_memzone *  zone,
@@ -422,9 +424,9 @@ buddy_free(
     pool = find_mempool(zone, addr);
 
     if ((pool == NULL) || (order > 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;
 }