mm: Fix objcache with inexact sizes
authorJack Miller <jack@codezen.org>
Sun, 31 Jul 2016 21:04:58 +0000 (16:04 -0500)
committerJack Miller <jack@codezen.org>
Sun, 31 Jul 2016 21:04:58 +0000 (16:04 -0500)
mm/objcache.c

index d71f1a5..1c857f3 100644 (file)
@@ -194,7 +194,10 @@ void *objcache_get(struct objcache *objcache, u32 size)
     if (size > OBJCACHE_MAXSIZE)
         return NULL;
 
-    idx = __oc_find_free_cells(objcache, size / OC_CELL_SIZE, (void **) &page);
+    /* Convert size from bytes to cells */
+    size = (size + (OC_CELL_SIZE - 1)) / OC_CELL_SIZE;
+
+    idx = __oc_find_free_cells(objcache, size, (void **) &page);
 
     if (idx == -1) {
         if (__oc_bump_allocation(objcache))
@@ -212,7 +215,7 @@ void *objcache_get(struct objcache *objcache, u32 size)
     mark_map[idx / 64] &= ~(1UL << (idx % 64));
 
     /* Turn the following block, if free, into a free header */
-    idx += (size / OC_CELL_SIZE);
+    idx += size;
 
     if (!(block_map[idx / 64] & (1UL << (idx % 64))))
         mark_map[idx / 64] |= (1UL << (idx % 64));